中国地质大学数据结构实验报告Word下载.docx
- 文档编号:20437828
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:55
- 大小:179.73KB
中国地质大学数据结构实验报告Word下载.docx
《中国地质大学数据结构实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《中国地质大学数据结构实验报告Word下载.docx(55页珍藏版)》请在冰豆网上搜索。
data=x;
r->
link=s;
r=s;
}
link=NULL;
returnh;
}
(2)输出单链表中所有结点的数据域值;
首先获得表头结点地址,然后建立循环逐个输出数据,直到地址为空。
数据输出的函数为:
voidoutput(LNode*h)
LNode*r;
inti;
for(i=1;
r->
link!
=NULL;
i++)
{
%d.%d\n"
i,r->
link->
data);
r=r->
link;
}
(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;
建立两个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,建立循环扫描链表。
当当前结点指针域不为空且数据域等于x的时候,申请结点并给此结点数据域赋值为y,然后插入当前结点后面,退出函数;
当当前结点指针域为空的时候,申请结点并给此结点数据域赋值为y,插入当前结点后面,退出函数。
数据插入函数为:
voidinsert(LNode*h)
LNode*r,*s;
intx,y;
Inputthedatathatyouwanttoinsert:
\n"
x="
/*输入x值*/
y="
y);
/*输入y值*/
for(;
;
r=r->
link)
if(r->
data==x)/*当当前结点指针域不为空且数据域等于x的时候…*/
s=(LNode*)malloc(sizeof(LNode));
s->
data=y;
link=r->
r->
break;
}
link==NULL)/*当当前结点指针域为空的时候*/
(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
建立三个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,最后一个备用;
建立整形变量l=0;
建立循环扫描链表。
当当前结点指针域为空的时候,如果当前结点数据域等于k,删除此结点,l++,跳出循环,结束操作;
如果当前结点数据域不等于k,跳出循环,结束操作。
当当前结点指针域不为空的时候,如果当前结点数据域等于k,删除此结点,l++,继续循环操作;
如果当前结点数据域不等于k,指针向后继续扫描。
循环结束后函数返回变量l的值,l便是删除的结点的个数。
数据删除函数为:
intdel(LNode*h)
LNode*r,*s,*t;
intk,l=0;
printf("
Inputthedatathatyouwanttodelete:
scanf("
k);
r=h;
s=r;
r=r->
for(;
)
link==NULL)/*当当前结点指针域为空的时候*/
if(r->
data==k)/*如果当前结点数据域不等于k…*/
{
l++;
s->
free(r);
break;
}
elsebreak;
/*如果当前结点数据域等于k…*/
else/*当当前结点指针域不为空的时候*/
data==k)/*如果当前结点数据域不等于k…*/
t=r;
link=t->
r=t->
free(t);
else{r=r->
s=s->
}/*如果当前结点数据域不等于k…*/
returnl;
堆栈与队列
一.实验目的
1.会定义顺序栈和链栈的结点类型。
2.掌握栈的插入和删除结点在操作上的特点。
3.熟悉对栈的一些基本操作和具体的函数定义。
4.会定义顺序队列和链队列的结点类型。
二.实验内容
程序1
该程序的功能是实现顺序栈的定义和操作。
该程序包括定义的栈结构类型以及对每一种栈操作的具体的函数定义和主函数。
/*定义DataType为int类型*/
typedefintDataType;
/*栈的结点类型*/
#defineMAXSIZE1024
typedefstruct
{DataTypedata[MAXSIZE];
inttop;
}SeqStack;
程序2:
试利用堆栈将队列中的元素逆置。
程序3:
编写括号匹配算法。
1队列的抽象数据类型定义:
ADTQueue{数据对象:
D={
|
∈ElemSet,i=1,2,...,n,n>
=0}
数据关系:
R1={<
>
∈D,i=2,...,n}
基本操作:
InitQueue(&
Q)构造一个空队列Q
QueueEmpty(Q)判断队列是否为空
QueueLenght(Q)返回队列Q的元素个数,即队列的长度
GetHead(Q,&
e)取队列Q的队头元素,并用e返回
EnQueue(&
Q,e)将元素e入队列
DeQueue(&
Q,&
e)删除非空队列Q的队头元素,并用e返回其值
}ADTQueue
1.队列的表示:
队列有两种表示方法:
链队列、循环队列(顺序队列)。
(1)链队列的表示:
typedefstructQNode{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
(2)循环队列的表示
1.操作系统作业调度模拟。
编写一个程序,其功能是实现顺序栈的定义和操作。
利用堆栈将队列中的元素逆置。
编写括号匹配算法
假设有几个作业运行。
如果都需要请求CPU,则可以让作业按先后顺序排队,每当CPU处是完一个作业后,就可以接受新的作业,这时队列中队头的作业先退出进行处理。
后来的作业排在队尾。
此题算法跟模拟服务台前的排队现象问题相似,假定只有一个CPU,但为了防止一个作业占用CPU太久,可规定每个作业一次最长占用CPU的时间(称时间片),如果时间片到,作业未完成,则此作业重新进入等待队列,等到下次占有CPU时继续处理。
三.问题描述和分析
1.实现顺序栈的定义和操作共有如下几个环节:
a)初始化顺序栈
b)检查顺序栈是否为空
c)置为空栈
d)把元素压入栈,使其成为新的栈顶元素
e)把栈顶元素弹出
f)取栈顶元素
g)输出顺序栈中的元素
2.利用堆栈队列的元素逆置的流程图如下:
N
1
2
…
n-2
n-1
n
3
………………………………………………………………
3.括号匹配问题的转化:
在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最急迫的期待得以消解,或者是不合法的情况,若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性都降了一级。
稀疏矩阵表示、转置和乘法
一.实验目的:
通过查找相关书籍和所学过的知识,将自己的编程能力提高,以及掌握稀疏矩阵的压缩存储及基本操作,了解多维数组的逻辑结构和存储结构。
本程序是用三元组表示矩阵,并进行相关的操作,主要用到线性和链式存储法将矩阵表示出来,以及快速转置法和加法的应用。
二.实验要求:
(1)用顺序和链式存储方式存放用于存储稀疏矩阵的三元组表
(2)快速转置
(3)矩阵的乘法
课程设计的实验报告内容:
整个程序通过结构体实现题目要求的的功能(乘法除外),通过用三元组(线性和链式)来表示稀疏矩阵,并能够在屏幕上输出,且还要见其转置(分两种方法)和相加。
LMatrixAdd(LMatrix&
M1,LMatrix&
M2)实现了矩阵的加法,其中包括检验要想家的矩阵是否合格,不合格会报错。
SMatrixFastTranspose(SMatrix&
M)实现了稀疏矩阵的快速转置,用了两个动态数组查找矩阵中的非零元素,只将这些非零元素转置,是速度大大提高。
三.课程设计的原程序代码:
#include<
iostream>
#defineMaxTerms10
#defineMaxRows10
usingnamespacestd;
typedefintElemType;
structTriple//三元组
introw,col;
//行号和列号
ElemTypeval;
//元素值
};
structSMatrix
intm,n,t;
//行,列及非零元素个数
Triplesm[MaxTerms+1];
structTripleNode//三元组结点
TripleNode*next;
structLMatrix
TripleNode*vector[MaxRows+1];
voidInitMatrix1(SMatrix&
M)
M.m=0;
M.n=0;
M.t=0;
voidInitMatrix2(LMatrix&
M.n=0;
M.t=0;
i<
=MaxRows;
M.vector[i]=NULL;
voidInputMatrix1(SMatrix&
M,intm,intn)//row和col用来分别存储元素的行号和列号,val用来存储元素值,t为非零元素个数
M.m=m;
M.n=n;
introw,col,val;
intk=0;
cout<
<
输入顺序三元组的行号列号以及该位置的元素值,以000为结束标志"
endl;
cin>
row>
col>
val;
while(row!
=0)
k++;
M.sm[k].row=row;
M.sm[k].col=col;
M.sm[k].val=val;
cin>
M.t=k;
voidInputMatrix2(LMatrix&
M,intm,intn)
输入链式三元组中的行、列和对应值,以000为结束标志"
TripleNode*p;
TripleNode*newptr;
newptr=newTripleNode;
//建立新结点
newptr->
row=row;
col=col;
val=val;
next=NULL;
p=M.vector[row];
if(p==NULL)
{
M.vector[row]=newptr;
else
while(p->
next!
=NULL)
p=p->
next;
p->
next=newptr;
}/**/
voidOutputMatrix1(SMatrix&
M)//输出函数
inti=1;
("
M.t;
cout<
M.sm[i].row<
"
M.sm[i].col<
M.sm[i].val<
)"
if(M.t!
M.sm[M.t].row<
M.sm[M.t].col<
M.sm[M.t].val<
voidOutputMatrix2(LMatrix&
TripleNode*p;
=M.m;
for(p=M.vector[i];
p!
p=p->
next)
cout<
p->
row<
col<
SMatrixTranspose(SMatrix&
M)//普通转置
SMatrixS;
InitMatrix1(S);
m=M.m;
n=M.n;
t=M.t;
//用m,n,t分别暂存M的行数、列数和非零元素的个数
S.m=n;
S.n=m;
S.t=t;
//分别置S的行数域、列数域和非零元素的个数域为n,m和t
if(t==0)//若是零矩阵则转换完毕返回
returnS;
intk=1;
//用k指示S.sm数组中待存元素的下标
for(intcol=1;
=n;
col++)
for(inti=1;
=t;
if(M.sm[i].col==col)
S.sm[k].row=col;
S.sm[k].col=M.sm[i].row;
S.sm[k].val=M.sm[i].val;
k++;
returnS;
//返回转置矩阵S
M)//快速转置,不必考虑大量的0元素
int*num=newint[n+1];
//为num向量动态分配存储空间
int*pot=newint[n+1];
//为pot向量动态分配存储空间
intcol,i;
for(col=1;
col++)//对num向量进行初始化,置每个分量为0
num[col]=0;
i++)//第1遍扫描数组M.sm,统计出每一列非零元素的个数
intj=M.sm[i].col;
num[j]++;
pot[1]=1;
for(col=2;
col++)//计算每一列的第1个非零元素在S.sm中存储位置
pot[col]=pot[col-1]+num[col-1];
i++)//对M.sm进行第2遍扫描,把每个元素行、列值互换写入到S.sm的确定位置
intk=pot[j];
S.sm[k].row=j;
S.sm[k].col=M.sm[i].row;
S.sm[k].val=M.sm[i].val;
pot[j]++;
delete[]num;
//删除动态分配的数组
delete[]pot;
M2)//矩阵加法
LMatrixM;
//暂存运算结果,以便返回
InitMatrix2(M);
if((M1.n!
=M2.n)||(M1.n!
=M2.n))
两个矩阵规格不同"
exit
(1);
M.m=M1.m;
M.n=M1.n;
//把其中一个加数矩阵的尺寸赋给结果矩阵
if((M1.t==0)&
&
(M2.t==0))
returnM;
//进行两矩阵相加产生和矩阵
//用k统计结果矩阵中结点的个数
for(inti=1;
i++)//循环的次数相当于矩阵的行数
TripleNode*p1,*p2,*p;
p1=M1.vector[i];
//p1指向M1矩阵中第i行单链表的待相加的结点
p2=M2.vector[i];
//p2指向M2矩阵中第i行单链表的待相加的结点
p=M.vector[i];
//p指向M矩阵中第i行单链表的待相加的结点
while((p1!
=NULL)&
(p2!
=NULL))
TripleNode*newptr=newTripleNode;
if(p1->
p2->
col)//赋值新结点,p1指针后移
*newptr=*p1;
p1=p1->
elseif(p1->
col)//赋值新结点,p2指针后移
*newptr=*p2;
p2=p2->
else//对具有相同列号的结点进行处理
if(p1->
val+p2->
val==0)//不建立新结点和链接
{
p1=p1->
p2=p2->
//p1和p2指针后移
continue;
}
else//新结点值为两结点值之和,p1和p2指针后移
*newptr=*p1;
newptr->
val+=p2->
newptr->
//将新结点的指针域置空
//把新结点链接到结果矩阵的第i行单链表的表尾
if(p==NULL)
M.vector[i]=newptr;
else
p->
p=newptr;
k++;
while(p1!
*newptr=*p1;
p1=p1->
//若p2不为空,则把剩余结点复制链接到结果矩阵中
while(p2!
*newptr=*p2;
p2=p2->
//置和矩阵中结点数
相加后得矩阵"
returnM;
//返回和矩阵
voidmenu()
{
//system("
cls"
system("
color61"
请进入稀疏矩阵运算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国地质大学 数据结构 实验 报告