版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构实验实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。学习基本的查找和排序技术。让我们在实际上机中具有编制相当规模的程序的能力。养成一种良好的程序设计风格。
实验教材:数据结构题集(C语言版)清华大学出版社2007年实验项目:实验一、栈和循环队列㈠、实验内容:栈掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。本程序采用的是链栈结构,具有初始化一个栈、PUSH、POP、显示所有栈里的元素四个功能。循环队列掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。㈡、实验代码栈程序代码:#include<stdio.h>#include<malloc.h>#defineStack_Size6#defineERROR0#defineOK1typedefintSElemType;typedefstructSNode{ SElemTypedata; structSNode*next;}SNode,*LinkStack;intCreatTwo(LinkStack&head,intn){ inti; SNode*p; head=(LinkStack)malloc(sizeof(SNode)); head->next=NULL; printf("请输入数据(数字):\n"); for(i=n;i>0;--i) { p=(SNode*)malloc(sizeof(SNode)); scanf("%d",&p->data); p->next=head->next; head->next=p; } return1;}intmenu_select(){ intsn; for(;;) { scanf("%d",&sn); if(sn<1||sn>6) printf("\n\t输入错误,请重新输入\n"); else break; } returnsn;}intPush(LinkStack&top,SElemTypee){ SNode*q; q=(LinkStack)malloc(sizeof(SNode)); if(!q) { printf("溢出!\n"); return(ERROR); } q->data=e; q->next=top->next; top->next=q; return(OK);}intPop(LinkStack&top,SElemType&e){ SNode*q; if(!top->next) {printf("error!\n"); return(ERROR);} e=top->next->data; q=top->next; top->next=q->next; free(q); return(OK);}voidmain(){inte; LinkStacktop; printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n"); while(1) { switch(menu_select()) { case1: if(CreatTwo(top,Stack_Size))printf("Success!\n");break;case2: printf("Push:\n"); scanf("%d",&e); if(Push(top,e))printf("Success!\n"); break; case3: if(Pop(top,e))printf("Success!\n"); printf("%d\n",e); break; case4: LinkStackp; printf("所有栈里的元素:\n"); p=top; while(p->next) {p=p->next; printf("%7d",p->data); } printf("\n"); break; case5: return; } }}运行结果:循环队列程序代码:#include<stdlib.h>#include<stdio.h>#defineOVERFLOW-1#defineOK1#defineERROR0#defineMAXSIZE100typedefstruct{ int*elem;//队列存储空间 intfront; intrear;}SqQueue;//判断选择是否正确intmenu_select(){ intsn; for(;;) { scanf("%d",&sn); if(sn<1||sn>6) printf("\n\t输入错误,请重新输入\n"); else break; } returnsn;}//参数(传出)SqQueue&Q,循环队列(空)intInitQueue(SqQueue&Q){ Q.elem=(int*)malloc(MAXSIZE*sizeof(int)); if(!Q.elem)exit(OVERFLOW); Q.front=Q.rear=-1; for(inti=0;i<MAXSIZE;i++) Q.elem[i]=-1; returnOK;}//返回Q的元素个数intQueueLength(SqQueueQ){ return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;}//显示队列的元素voidDisplay(SqQueueQ){ for(inti=0;i<=QueueLength(Q);i++) if(Q.elem[i]!=-1)printf("%d",Q.elem[i]); printf("\n");}//入队intEnQueue(SqQueue&Q,inte){ Q.rear=(Q.rear+1)%MAXSIZE; if(Q.rear==Q.front)returnERROR; Q.elem[Q.rear]=e; returnOK;}//出队intDeQueue(SqQueue&Q,int&e){ if(Q.front==Q.rear)returnERROR; e=Q.elem[Q.front+1]; Q.elem[Q.front+1]=-1; Q.front=(Q.front+1)%MAXSIZE; returnOK;}voidmain(){ SqQueueQ; InitQueue(Q); intelem,e; printf("请输入队列元素(以0结束):\n"); scanf("%d",&elem); while(elem!=0) { EnQueue(Q,elem); scanf("%d",&elem); } printf("队列为:\n"); Display(Q); printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度:\n6.结束;\n"); while(1) { switch(menu_select()) { case1: printf("请输入队列元素(以0结束):\n"); scanf("%d",&elem); while(elem!=0) {EnQueue(Q,elem); scanf("%d",&elem);} printf("队列为:\n"); Display(Q); fflush(stdin); break;case2: scanf("%d",&elem); EnQueue(Q,elem); printf("队列为:\n"); Display(Q); fflush(stdin); break; case3: DeQueue(Q,elem); printf("队列为:\n"); Display(Q); break; case4: printf("\n队列的所有元素:\n"); Display(Q); break; case5: printf("%d\n",QueueLength(Q)); break; case6: return; } }}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。本程序数组的大小定义为3*3,可以通过修改“#defineM”来变动。本程序具有矩阵相加、矩阵A转置、矩阵B转置、矩阵相乘四个功能。㈡、实验代码:#include<stdio.h>#defineM3voidMatrixAdd(intm1[M][M],intm2[M][M],intresult[M][M])//两个矩阵m1和m2相加,结果放到result{ inti,j; for(i=0;i<M;i++) { for(j=0;j<M;j++) result[i][j]=m1[i][j]+m2[i][j]; }}voidMatrixTrams(intm1[M][M],intresult[M][M])//矩阵转置{ inti,j; for(i=0;i<M;i++) { for(j=0;j<M;j++) result[i][j]=m1[j][i]; }}voidMatrixMultiply(intm1[M][M],intm2[M][M],intresult[M][M]){ inti,j; for(i=0;i<M;i++) { for(j=0;j<M;j++) { result[i][j]=0; for(intk=0;k<M;k++) result[i][j]+=m1[i][k]*m2[k][j]; } }}voidDisplay(intresult[M][M])//显示矩阵{ inti,j; for(i=0;i<M;i++) { for(j=0;j<M;j++) printf("%-5d",result[i][j]); printf("\n"); }}voidmain(){ intA[M][M],B[M][M]; inti,j; printf("请输入第一个矩阵:\n"); for(i=0;i<M;i++) for(j=0;j<M;j++) scanf("%d",&A[i][j]); printf("请输入第二个矩阵:\n"); for(i=0;i<M;i++) for(j=0;j<M;j++) scanf("%d",&B[i][j]); intresult[M][M]; /*printf("\n矩阵A:\n"); Display(A); printf("\n矩阵B:\n"); Display(B);*/ printf("请选择:\n1.矩阵相加:\n2.矩阵A转置:\n3.矩阵B转置:\n4.矩阵相乘:\n5.退出。\n\n"); while(1) {intl; scanf("%d",&l); switch(l) { case1: printf("矩阵相加的运算结果:\n"); MatrixAdd(A,B,result); Display(result); printf("\n"); break; case2: printf("矩阵A转置的运算结果:\n"); MatrixTrams(A,result); Display(result); printf("\n"); break; case3: printf("矩阵B转置的运算结果:\n"); MatrixTrams(B,result); Display(result); printf("\n"); break; case4: printf("矩阵相乘的运算结果:\n"); MatrixMultiply(A,B,result); Display(result); printf("\n"); break; case5: printf("退出。\n"); return; default: printf("输入错误!"); printf("\n"); } }}实验结果:实验三、查找、实验内容掌握各种查找(顺序、二分法、查找树、哈希)方法及适用场合,并能在解决实际问题时灵活应用。本实验采用二分查找。二分查找又称折半查找,它是一种效率较高的查找方法。折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。本程序具有找出数据位置和显示查找次数两个功能。㈡、实验代码:#include<stdio.h>#defineMAX100voidmain(){ intr[MAX],i,k,low,high,mid,m,n; printf("\n\n建立递增有序的查找顺序表(以-1结束):\n"); for(i=0;i<MAX;i++) { scanf("%d",&r[i]); if(r[i]==-1) { n=i; break; } } printf("\n请输入要查找的数据:\n"); scanf("%d",&k); low=0;high=n-1;m=0; while(low<=high) { mid=(low+high)/2; m++; if(r[mid]>k) high=mid-1; else if(r[mid]<k) low=mid+1; else break; } if(low>high) { printf("没有找到\n"); printf("共进行%d次比较。\n",m); if(r[mid]<k) mid++; printf("可将这个数插入到第%d个数的后面。\n",mid); } else {printf("\n要找的数据=%d在第%d个数的位置上。\n",k,mid+1); printf("\n\n共进行了%d次比较。\n",m); }}实验结果:实验四、树、实验内容:进一步掌握树的结构及非线性特点,递归特点和动态性;进一步巩固对指针的使用和二叉树的三种遍历方法、建立方法及用广义表进行输入输出。本程序将第一个元素作为树根,其余元素若小于树根则为左子树,若大于树根则为右子树。本程序具有求左子树、求右子树、求深度、先序遍历、中序遍历(递归算法)、中序遍历(非递归算法)、后序遍历六个功能。㈡、实验代码//描述:两个指针指向左右孩子,算法见教材#include<stdio.h>#include<stdlib.h>#defineMAX50typedefstructbtnode{ intData; structbtnode*Llink; structbtnode*Rlink;}btnode,*btreetype;btreetypeCreatTree(intn)//传入数据数量,返回根结点指针{ inti; btreetyperoot=NULL; for(i=0;i<n;i++) { btreetypenewNode,currentNode,parentNode; newNode=(btreetype)malloc(sizeof(btnode)); scanf("%d",&newNode->Data); newNode->Llink=NULL; newNode->Rlink=NULL; currentNode=root; if(currentNode==NULL)root=newNode; else{ while(currentNode!=NULL) { parentNode=currentNode; if(newNode->Data<currentNode->Data) currentNode=currentNode->Llink; else currentNode=currentNode->Rlink; } if(newNode->Data<parentNode->Data) parentNode->Llink=newNode; else parentNode->Rlink=newNode; } } returnroot;}voidOutputTree(btreetype&root){ btreetypep; p=root->Llink; printf("建立的二叉树的左子树为:\n"); while(p!=NULL) { printf("%-8d",p->Data); p=p->Llink; } p=root->Rlink; printf("\n建立的二叉树的右子树为:\n"); while(p!=NULL) { printf("%-8d",p->Data); p=p->Rlink; }}intdepth(btreetyperoot){ btreetypep; p=root; intdep1; intdep2; if(root==NULL)return0; else { dep1=depth(p->Llink); dep2=depth(p->Rlink); if(dep1>dep2)return(dep1+1); elsereturn(dep2+1); }}voidPreOrder(btreetype&root)//先序遍历(递归){ btreetypep; p=root; if(p!=NULL) { printf("%-5d",p->Data); PreOrder(p->Llink); PreOrder(p->Rlink); }}voidInOrder(btreetype&root)//中序遍历(递归){ btreetypep; p=root; if(p!=NULL) { InOrder(p->Llink); printf("%-5d",p->Data); InOrder(p->Rlink); }}voidInOrder_Norecuision(btreetype&root){ btreetypestack[MAX]; btreetypep; inttop=0; p=root; do { while(p!=NULL) { top++; stack[top]=p; p=p->Llink; } if(top>0) { p=stack[top]; top--; printf("%-5d",p->Data); p=p->Rlink; } }while(p!=NULL||top!=0);}voidPostOrder(btreetype&root){ btreetypep; p=root; if(p!=NULL) { PostOrder(p->Llink); PostOrder(p->Rlink); printf("%-5d",p->Data); }}voidmain(){ btreetypebtree; intcount; printf("请输入元素个数:\n"); scanf("%d",&count); printf("请输入数据:\n"); btree=CreatTree(count); OutputTree(btree); printf("\n建立的二叉树的深度为:%d\n",depth(btree)); printf("\n先序遍历:\n"); PreOrder(btree); printf("\n中序遍历(递归算法):\n"); InOrder(btree); printf("\n中序遍历(非递归算法):\n"); InOrder_Norecuision(btree); printf("\n后序遍历:\n"); PostOrder(btree); printf("\n");}实验结果:#include<stdio.h>#include<string.h>#definemaxspace100#definekeylen7#defineradix_n10#defineradix_c26typedefcharkeytype;typedefstruct{charstart[6];charend[10];charsche[10];chartime1[5];chartime2[5];charmodel[4];intprice;}infotype;typedefstruct{keytypekeys[keylen];infotypeothers;intnext;}slnode;typedefstruct{slnodesl[maxspace];intkeynum;intlength;}sllist;typedefintarrtype_n[radix_n];typedefintarrtype_c[radix_c];voiddistribute(slnode*sl,inti,arrtype_nf,arrtype_ne){intj,p;for(j=0;j<radix_n;j++){f[j]=e[j]=0;}for(p=sl[0].next;p;p=sl[p].next){j=sl[p].keys[i]%48;if(!f[j])f[j]=p;elsesl[e[j]].next=p;e[j]=p;}}voidcollect(slnode*sl,inti,arrtype_nf,arrtype_ne){intj,t;for(j=0;!f[j];j++);sl[0].next=f[j];t=e[j];while(j<radix_n-1){for(j=j+1;j<radix_n-1&&!f[j];j++);if(f[j]){sl[t].next=f[j];t=e[j];}}sl[t].next=0;}voiddistribute_c(slnode*sl,inti,arrtype_cf,arrtype_ce){intj,p;for(j=0;j<radix_c;j++){f[j]=e[j]=0;}for(p=sl[0].next;p;p=sl[p].next){j=sl[p].keys[i]%65;if(!f[j])f[j]=p;elsesl[e[j]].next=p;e[j]=p;}}voidcollect_c(slnode*sl,inti,arrtype_cf,arrtype_ce){intj,t;for(j=0;!f[j];j++);sl[0].next=f[j];t=e[j];while(j<radix_c-1){for(j=j+1;j<radix_c-1&&!f[j];j++)if(f[j]){sl[t].next=f[j];t=e[j];}}sl[t].next=0;}voidradixsort(sllist&l)//链式{inti;arrtype_nfn,en;arrtype_cfc,ec;for(i=0;i<l.length;i++)l.sl[i].next=i+1;l.sl[l.length].next=0;for(i=l.keynum-1;i>=2;i--){distribute(l.sl,i,fn,en);collect(l.sl,i,fn,en);}for(i=1;i>=0;i--){distribute_c(l.sl,i,fc,ec);collect_c(l.sl,i,fc,ec);}}voidarrange(sllist&l)//重新整理{intp,q,i;slnodetemp;p=l.sl[0].next;for(i=1;i<l.length;i++){while(p<i)p=l.sl[p].next;q=l.sl[p].next;if(p!=i){temp=l.sl[p];l.sl[p]=l.sl[i];l.sl[i]=temp;l.sl[i].next=p;}p=q;}}intbinsearch(sllistl,keytypekey[]){intlow,high,mid;low=1;high=l.length;while(low<=high){mid=(low+high)/2;if(strcmp(key,l.sl[mid].keys)==0)returnmid;elseif(strcmp(key,l.sl[mid].keys)<0)high=mid-1;elselow=mid+1;}return0;}voidseqsearch(sllistl,keytypekey[],inti){intj,k,m=0;printf("*************************************************************\n");printf("*航班号起点站终点站航班期起飞时间到达时间机型票价*\n");for(j=1;j<=l.length;j++){switch(i){case2:k=strcmp(key,l.sl[j].others.start);break;case3:k=strcmp(key,l.sl[j].others.end);break;case4:k=strcmp(key,l.sl[j].others.time1);break;case5:k=strcmp(key,l.sl[j].others.time2);break;}if(k==0){m=1;printf("*%-8s,%-6s,%-6s,%-11s,%-9s,%-7s,%-5s,%4d*\n",l.sl[j].keys,l.sl[j].others.start,l.sl[j].others.end,l.sl[j].others.sche,l.sl[j].others.time1,l.sl[j].others.time2,l.sl[j].others.model,l.sl[j].others.price);}}if(m==0)printf("*无此航班信息,可能是输入错误!*\n");printf("*************************************************************\n");}voidsearchcon(sllistl){keytypekey[keylen];inti=1,k;while(i>=1&&i<=5){printf("\n********************\n");printf("*航班信息查询系统*\n");printf("********************\n");printf("*1.航班号*\n");printf("*2.起点站*\n");printf("*3.终点站*\n");printf("*4.起飞时间*\n");printf("*5.到达时间*\n");printf("*0.退出系统*\n");printf("********************\n");printf("请选择(0-5):");scanf("%d",&i);printf("\n");switch(i){cas
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年餐饮行业未来五年连锁化与预制菜趋势预测分析报告
- 电子设备采购制度
- 物业采购物品清单公示制度
- 北京公司采购部管理制度
- 医院物资采购申请制度
- 医院业务采购审批制度
- 餐饮酒店采购标准制度
- 2026年岩棉板客户投诉处理报告
- 养路工工作制度
- 工厂单休工作制度
- ORACLE-EBS-成本管理手册
- DL∕T 5344-2018 电力光纤通信工程验收规范
- 检验科实验室生物安全培训课件
- 八年级数学下二次根式和勾股定理综合测试卷(含答案)
- 颈椎退行性疾病
- 义务教育语文课程标准2001版
- 会计学 第7版 课后习题及答案 徐经长 - 第5-13章
- 施工总平面布置图通用范本
- 退款合同协议书
- 第四章-健康体适能课件
- 六年级下册班队会活动记录
评论
0/150
提交评论