《数据结构》C语言实验报告.docx
- 文档编号:29929816
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:47
- 大小:624.52KB
《数据结构》C语言实验报告.docx
《《数据结构》C语言实验报告.docx》由会员分享,可在线阅读,更多相关《《数据结构》C语言实验报告.docx(47页珍藏版)》请在冰豆网上搜索。
《数据结构》C语言实验报告
《数据结构》
实验报告
********
学号:
*********
成绩:
_____
实验一,线性表的应用……………………………………3
实验二,栈和队列的应用…………………………………8
实验三,数组的应用………………………………………13
实验四,树和二叉树的应用………………………………19
实验五,图的应用…………………………………………24
实验六,查找表的应用……………………………………32
实验七,排序算法的应用…………………………………44
实验一线性表的应用
【实验目的】
1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;
2.以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;
3.掌握线性表的动态分配顺序存储结构的定义和基本实现;
4.通过对本章实验帮助学生加深对C语言的使用(特别是函数参数调用、指针类型的应用和链表的建立等各种基本操作)。
【实验内容】
约瑟夫问题的实现:
n只猴子要选猴王,所有猴子按1,2,…,n编号围坐一圈,从第1只开始按1,2,…,m报数,凡报到m号的猴子退出圈外,如此循环报数,直到圈内省剩下一只猴子时,这个猴子就是猴王。
编写一个程序实现上述过程,n和m由键盘输入。
【实验要求】
1.要求用顺序表和链表分别实现约瑟夫问题;
2.独立完成,严禁抄袭;
3.上交的实验报告由如下部分组成:
①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。
实验结果:
一,源程序:
#include
#include
#defineMaxsize80
structSeqList
{
intdata[Maxsize];
intlen;
};
typedefstructSeqListSeqList;
voidInitList(SeqList*L)
{
L=(SeqList*)malloc(sizeof(SeqList));
L->len=0;
}
voidMadeList(SeqList*L)
{
inti;
intpeople;
printf("请输入参选的总数:
\n");
scanf("%d",&people);
for(i=0;i { L->data[i]=i+1; printf("%d",L->data[i]); } printf("\n"); L->len=people; } voidWentList(SeqList*L) { intm,i,j; intk=0; printf("请输入出列数: \n"); scanf("%d",&m); for(i=L->len;i>0;i--) { k=(k+m-1)%i; printf("%d",L->data[k]); for(j=k;j { L->data[j]=L->data[j+1]; } L->len=L->len-1; } printf("\n"); } voidmain() { SeqList*L; InitList(L); MadeList(L); WentList(L); } 二,运行结果及截屏视图: 实验二栈和列队的应用 【实验目的】 1.熟练掌握栈和列队的结构,以及这两种数据结构的特点; 2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空时的判断条件和描述方法; 3.熟练掌握链队列和循环列表的基本运算,特别注意队列满和队列空时的判断条件和描述方法。 【实验内容】 表达式求值的实现: 输入一个包含“+“、”-“、”*“、”/“、正整数和圆括号的合法表达式,用算法优先法计算该表达式的结果。 【实验要求】 1.要求用栈实现表达式求值问题; 2.独立完成,严禁抄袭; 3.上交的实验报告由如下部分组成: ①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。 实验结果: 一,源程序: #defineDATATYPE1int #defineMAXSIZE100 typedefstruct {DATATYPE1data[MAXSIZE]; inttop; }SEQSTACK; #include voidinitstack(SEQSTACK*s) {s->top=0;} intpush(SEQSTACK*s,DATATYPE1x) { if(s->top==MAXSIZE-1) {printf("栈满\n");return0;} else {s->top++;(s->data)[s->top]=x;return1;} } DATATYPE1pop(SEQSTACK*s) { DATATYPE1x; if(s->top==0) {printf("栈空\n");x=0;} else {x=(s->data)[s->top];s->top--;} returnx; } DATATYPE1gettop(SEQSTACK*s) { DATATYPE1x; if(s->top==0) { printf("栈空\n");x=0; } else x=(s->data)[s->top]; returnx;} check(SEQSTACK*s) { intbool; charch; push(s,'#'); printf("请输入一串括号,回车键结束: "); ch=getchar(); bool=1; while(ch! ='\n'&&bool) {if(ch=='(') push(s,ch); if(ch==')') if(gettop(s)=='#')bool=0; elsepop(s); ch=getchar();} if(gettop(s)! ='#') bool=0; if(bool) printf("\n括号配对正确\n"); else printf("\n括号配对错误\n"); } main() { SEQSTACKst,*s; s=&st; initstack(s); check(s); } 二,实验结果及截屏视图: 实验三数组的应用 【实验目的】 1.掌握数组的两种存储表示方法; 2.掌握对特殊矩阵进行压缩存储时的下标变换公式; 3.掌握稀疏矩阵的两种压缩存储方法的特点和适用范围。 【实验内容】 稀疏矩阵转置的实现: 用三元组顺序表做存储结构,实现稀疏矩阵的转置。 【实验要求】 1.已知某一稀疏矩阵的三元顺序表,由其直接得到其转置矩阵的三元顺序表; 2.独立完成,严禁抄袭; 3.上交的实验报告由如下部分组成: ①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。 实验结果: 一,源程序; #include #defineMAX80 structtuple3tp { inti,j,v; }; structsparmattp { intm,n,u; structtuple3tpdata[MAX]; }; structsparmattpa,b; voidcrt_sparmat() { inti; printf("输入稀疏矩阵行值,列值,最大非零元的个数: "); scanf("%d%d%d",&a.data[i].i,&a.data[i].j,&a.data[i].v); for(i=1;i<=a.u;i) printf("输入行坐标,列坐标,非零元"); scanf("%d%d%d",&a.data[i].i,&a.data[i].j,&a.data[i].v); } voidtrans_sparmat() { intcol,p,q; b.m=a.n; b.n=a.m; b.u=a.u; if(b.u! =0) { q=1; for(col=1;col<=a.n;col++) for(p=1;p<=a.u;p++)if(a.data[p].j==col) { b.data[q].i=a.data[p].j; b.data[q].j=a.data[p].i; b.data[q].v=a.data[p].v; q++; } } } out(structsparmattpx) { inti,j,k,flag; for(i=1;i<=x.m;i++) for(j=1;j<=x.n;j++) flag=0; for(k=1;k<=x.u;k++) { if(((x.data[k].i==i)&&((x.data[k].j)==j))) { flag=1; printf("%5d",x.data[k].v); } } if(flag=0)printf("0"); } main() { printf("稀疏矩阵的建立与专置\n"); crt_sparmat(); trans_sparmat(); printf("\n"); out(a); printf("\n"); out(b); } 二,实验结果及截屏视图: 实验四树和二叉树的应用 【实验目的】 1.熟练掌握树的基本概念、二叉树的基本操作及在链式存储结构上的实现; 2.重点掌握二叉树的生成、遍历及求深度等算法; 3.掌握哈夫曼树的含义及其应用; 4.掌握运用递归方式描述算法及编写递归C程序的方法,提高算法分析和程序设计能力。 【实验内容】 二叉树采用二叉链表作存储结构,试编写程序实现二叉树的如下基本操作: 1.按先序序列构造一棵二叉树T; 2.对这棵二叉树进行遍历: 先序、中序、后序以及层次遍历序列,分别输出结点的遍历序列; 3.求二叉树的深度/结点数目/叶结点数目。 【实验要求】 1.上交实验报告。 2.独立完成,严禁抄袭。 3.实验报告由如下部分组成: ①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。 实验结果: 一,源程序 #include #include #definebitreptrstructtypel #defineNULL0 #definelensizeof(bitreptr) bitreptr*bt; intf,g; bitreptr { chardata; bitreptr*lchild,*rchild; }; preorder(bitreptr*bt) { if(g==1)printf("先序遍历为: \n"); g=g+1; if(bt) { printf("%6c",bt->data); preorder(bt->lchild); preorder(bt->rchild); } elseif(g==2)printf("树空\n"); } bitreptr*crt_bt() { bitreptr*bt; charch; if(f==1)printf("请输入根节点,以#结束\n"); elseprintf("输入节点,以#结束\n"); scanf("\n%c",&ch); f=f+1; if(ch=='#')bt=NULL; else { bt=(bitreptr*)malloc(len); bt->data=ch; printf("%c",bt->data); bt->rchild=crt_bt(); printf("%c",bt->data); bt->rchild=crt_bt(); } return(bt); } main() { f=1; g=1; bt=crt_bt(); preorder(bt); } 二,实验结果及截屏图示: 实验五图的应用 【实验目的】 1.熟练掌握图的邻接矩阵和邻接表的存储方式; 2.实现图的一些基本运算,特别是深度遍历和广度遍历; 3.掌握以图为基础的一些常用算法,如最小生成树、拓扑排序、最短路径等。 【实验内容】 1.由给定的顶点和边的信息构造图的邻接矩阵存储; 2.对该图进行深度优先搜索,输出搜索得到的结点序列; 3.以邻接表作存储结构,用克鲁斯卡尔算法构造最小生成树。 【实验要求】 1.上交实验报告。 2.独立完成,严禁抄袭。 3.实验报告由如下部分组成: ①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。 实验结果: 一,源程序: 图一: #include #defineINF9999 #defineMAXVEX100 typedefcharvertexType; typedeffloatadjtype; typedefstruct{ vertexTypevexs[MAXVEX]; adjtypearcs[MAXVEX][MAXVEX]; intn,e;}mGraph; voidcreateAdjMatrix(mGraph*G) { inti,j,k; floatw; scanf("%d%d",&G->n,&G->e); for(k=0;k scanf("%c",&G->vexs[k]); for(i=0;i for(j=0;j G->arcs[i][j]=INF; for(k=0;k { scanf("%d%d%f",&i,&j,&w); G->arcs[i][j]=w; G->arcs[j][i]=w; } } voidmain() { mGraph; } 二,实验结果及截屏图示: 图二: #include #include #include #defineMAX_NUM99 typedefstruct{ intu,v; intcost; }edgeset[MAX_NUM]; voidKruskal(edgesetE,intm,intn) { intx,y,a,b,count,i,p; intvset[MAX_NUM]; for(i=0;i<=m;i++)vset[i]=i; p=0; count=0; while(count { x=E[p].u;y=E[p].v; a=vset[x];b=vset[y]; if(a! =b) { printf("边: (%d,%d),权值: %d\n",x,y,E[p].cost); count++; for(i=0;i if(vset[i]==b) vset[i]=a; }p++; } } voidmain() { intm=6,n=10; edgesetE={{0,1,1},{1,3,2},{3,5,2},{2,4,3},{1,5,4},{1,2,5},{2,5,6},{4,5,7},{0,2,8},{3,4,8}}; Kruskal(E,m,n); } 截屏视图: 实验六查找表的应用 【实验目的】 1.熟悉掌握静态查找表的构造方法和查找算法; 2.熟练掌握二叉排序树的构造和查找方法; 3.熟练掌握哈希表的构造和处理冲突的方法; 4.掌握各种查找表查找效率的分析方法。 【实验内容】 1.要求将二叉排序树的建立、插入、删除、显示等算法合并在一个综合程序中、用户可以通过菜单选择方式运行各种操作算法; 2.一直哈希表的表为m,哈希函数为H(key)=keyMODp,用开放定址法(增量序列采用线性探测再散列)解决冲突,试编写构造哈希表的程序。 【实验要求】 1.上交实验报告。 2.独立完成,严禁抄袭。 3.实验报告由如下部分组成: ①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。 实验结果: 一,源程序: #include usingnamespacestd; typedefstructTreeNode { intkey; structTreeNode*left; structTreeNode*right; }treeNode; classBiSortTree { public: BiSortTree(void); voiddesplayTree(void); voidinsertTree(intkey); voiddeleteTree(intkey); treeNode*searchTree(intkey); ~BiSortTree(); private: treeNode*buildTree(treeNode*head,intnumber); treeNode*search(treeNode*head,intkey); treeNode*BiSortTree: : searchParent(treeNode*head,treeNode*p); treeNode*BiSortTree: : searchMinRight(treeNode*head); voidshowTree(treeNode*head); voiddestroyTree(treeNode*head); treeNode*Head; }; BiSortTree: : BiSortTree() { cout<<"建立一棵二叉排序树,请输入所有节点(以-1作为结束标志! ): "< Head=NULL; intnumber; cin>>number; while(number! =-1) { Head=buildTree(Head,number); cin>>number; } } treeNode*BiSortTree: : buildTree(treeNode*head,intnumber) { treeNode*p; p=newtreeNode; p->key=number; p->left=p->right=NULL; if(head==NULL) { returnp; } else { if(p->key head->left=buildTree(head->left,number); else head->right=buildTree(head->right,number); returnhead; } } voidBiSortTree: : insertTree(intkey) { Head=buildTree(Head,key); } treeNode*BiSortTree: : searchTree(intkey) { returnsearch(Head,key); } treeNode*BiSortTree: : search(treeNode*head,intkey) { if(head==NULL) returnNULL; if(head->key==key) returnhead; else { if(key returnsearch(head->left,key); else returnsearch(head->right,key); } } voidBiSortTree: : deleteTree(intkey) { treeNode*p; p=NULL; p=search(Head,key); if(p==NULL) { cout<<"Don'tfindthekey"; } if(p==Head) { Head=NULL; } else { treeNode*parent; parent=searchParent(Head,p); if(p->left==NULL&&p->right==NULL) { if(parent->left==p) { parent->left=NULL; } else { parent->right=NULL; } } else { if(p->right==NULL) { if(parent->left==p) { parent->left=p->left; } else { parent->right=p->left; } } else { treeNode*rightMinSon,*secondParent; rightMinSon=searchMinRight(p->right); secondParent=searchParent(p->right,rightMinSon); secondParent->left=rightMinSon->right; if(p->right==rightMinSon) { p->right=rightMinSon->right; } p->key=rightMinSon->key; } } } } treeNode*BiSortTree: : searchParent(treeNode*head,treeNode*p) { if(head->left==p||head->right==p||head==p||head==NULL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言 实验 报告