1、数据结构实训报告实验一 线性表1. 实验要求1.1掌握数据结构中线性表的基本概念。1.2熟练掌握线性表的基本操作:创建、插入、删除、查找、输出、求长度 及合并并运算在顺序存储结构上的实验。1.3熟练掌握链表的各种操作和应用。2. 实验内容2.1 编写一个函数,从一个给定的顺序表 A 中删除元素值在 x 到 y 之间的所 有元素,要求以较高效率来实现。2.2 试写一个算法,在无头结点的动态单链表上实现线性表插入操作2.3设计一个统计选票的算法,输出每个候选人的得票结果。3. 实验代码2.1 代码:#includetypedef int elemtype;#define maxsize 10int
2、 del(int A,int n,elemtype x,elemtype y)int i=0,k=0;while(i=x&Ai=y)k+;elseAi-k=Ai;i+;return(n-k);void main()int i,j;int amaxsize;Printf(输入 d 个数:n,maxsize);for(i=0;imaxsize;i+)scanf(%d,&ai);j=del(a,maxsize,1,3);Printf(输出删除后剩下的数:n);for(i=0;idata=x;S-n ext=L;L=s;elseP=L;j=1;WhiIe(P&jn ext;if(pji-1) retu
3、rn error;S=(Li nklist)malloc(sizeof(L no de); s-data=x;S-n ext=p-n ext;P-n ext=s;2.3代码:typedef int elemtypetypedef StrUCt IinknOdeelemtype data;StrUCt IinknOde *n ext;no detype;no detype *create()elemtype d;n OdetyPe h=NULL,*s,*t;int i=1;Printf(建立单链表:n);while(1)Printf(输入第%d个结点数据域,i);SCan f(%d,&d);if
4、(d=O)break;if(i=1)h=(no detype *)malloc(sizeof( no detype); h-data=d;h-n ext=NULL;t=h;elses=(no detype *)malloc(sizeof( no detype); s-data=d;S-n ext=NULL;t- n ext=s; t=s;i+;return h;void Sat (no detype *h,i nt a)no detype *p=h;WhiIe(P!=NULL)ap-data+;P=P-n ext;void mai n()int aN+1,i;for(i=0;iN;i+)ai=
5、0;no detype *head;head=create();sat(head,a);Printf(候选人:); for(i=1;i=N;i+) Printf(%3d,i); Printf(n 得票数 n);for(i=1;i=N;i+)Prin tf(%3d,ai);Prin tf(n);4.实验小结线性表是最简单的、最常用的一种数据结构,是实现其他数据结构的基础实验二 栈与队列1.实验要求1.1 了解栈和队列的特性,以便灵活运用。1.2熟练掌握栈和有关队列的各种操作和应用。2.实验内容2.1设一个算术表达式包括圆括号,方括号和花括号三种括号,编写一个算 法判断其中的括号是否匹配。3.实验
6、代码2.1代码:#i nclude#i nclude#i nclude#defi ne NULL 0typedef StrUCt listChar str;StrUCt list *n ext;list;void PUSh(Char,list *);int POP(Char.list *);void deal(char *str);mai n(void)Char str20;Printf(n请输入一个算式:n);gets(str);deal(str);Printf(正确!);getchar();return 0;void deal(char *str)list *L;L=(IiSt *)mal
7、loc(sizeof(list);if(!L)Printf(错误!);exit(-2);L- next=NULL;while(*str)if(*str=(*str=*str=) push(*str,L);elseif(*str=)*str=*str=) if(pop(*str,L) puts(错误请检查!); puts(按回车键退出); getchar();exit(-2);sM+;if(L- next)PUtSe错误,请检查!);puts(按任意键退出);getchar();exit(-2);void PUSh(Char c,list *L)list *p;P=(IiSt *)malloc(
8、sizeof(list);if(!p)Printf(错误!);exit(-2);p-str=c;p-n ext=L-n ext;L-n ext=p;#define CheCk(S) if(L-next-str=s)p=l-next;L-next=p-next;free(p);return(0); int POP(Char c,list *L)list *p;if(L- next=NULL)return 1;SWitCh(C)case):check() break;CaSe:CheCk(T) break;case:check() break;return 1;4.实验小结栈和队列是最基础的一种数
9、据结构之一,为实现其他数据结构的奠定基石实验三树1.实验要求1.1掌握二叉树,二叉树排序数的概念和存储方法。1.2掌握二叉树的遍历算法。1.3熟练掌握编写实现树的各种运算的算法。2.实验内容2.1编写程序,求二叉树的结点数和叶子数。2.2编写递归算法,求二叉树中以元素值为 X的结点为根的子数的深度2.3编写程序,实现二叉树的先序,中序,后序遍历,并求其深度。3.实验代码2.1代码:#i nclude#i ncludeStrUCt no deChar data;StrUCt node *lchild,*rchild;bno de;typedef StrUCt node *bli nk;bli n
10、k CreatObli nk bt;Char ch;ch=getchar();if(ch= ) return(NULL);elsebt=(struct node *)malloc(sizeof(b no de); bt-data=ch;bt-lchild=creat();bt-rchild=creat();return bt;int n=0 ,n 1=0;void PreOrder(bli nk bt)if (bt)n+;if(bt-lchild=NULL&bt-rchild=NULL) n 1+;PreOrder(bt-lchild);PreOrder(bt-rchild);void mai
11、 n()bli nk root;root=creat();PreOrder(root);Printf(此二叉数的接点数有:%dn,n);Printf(此二叉数的叶子数有:%dn,n1);2.2代码:int get_deep(bitree T,i nt x) _if(T-data=x)Prin tf(%dn,get_deep(T); exit 1;elseif(T-lchild)get_deep(T-lchild,x); if(T-rchild)get_deep(T-rchild,x); _int get_depth(bitree T) _if(!T)return 0;else m=get_de
12、pth(T-lchild); n=get_depth(T-rchild);return(m n?m:n )+1;2.3代码:#i nclude#i ncludeStrUCt no deChar data;StrUCt node *lchild,*rchild;bno de;typedef StrUCt node *bli nk;bli nk Creatobli nk bt;Char ch;ch=getchar();if(ch= ) return(NULL);elsebt=(struct node *)malloc(sizeof(b no de); bt-data=ch;bt-lchild=cr
13、eat();bt-rchild=creat();return bt;void PreOrder(bli nk bt)if (bt)Prin tf(%c,bt-data);PreOrder(bt-lchild);PreOrder(bt-rchild);void ino rder(bli nk bt)if(bt)ino rder(bt-lchild);Prin tf(%c,bt-data);ino rder(bt-rchild);void postorder(bli nk bt)if(bt)postorder(bt-lchild);postorder(bt-rchild);Prin tf(%c,b
14、t-data);int max(i nt x,i nt y)if(xy)return x;elsereturn y;int depth(bli nk bt)if (bt)retur n 1+max(depth(bt-lchild),depth(bt-rchild);else return 0;VOid mai n()bli nk root;root=creat();Prin tf(n);Printf(按先序排列:);PreOrder(root);Pri ntf( n);Printf(按中序排列:);ino rder(root);Pri ntf( n);Printf(按后序排列:);Postor
15、der(root);Pri ntf( n);Printf(此二叉数的深度是:);Prin tf(depth=%dn,depth(root);4.实验小结通过本章学习实验,对树有了初步的认识。树就是一种非线性的数据结构, 描述了客观世界中事物之间的层次关系。这种结构有着广泛的应用,一切具 有层次关系的问题都可以用树来表示。实验四图1.实验要求1.1熟悉图的各种存储方法。1.2掌握遍历图的递归和非递归的算法。1.3理解图的有关算法。2.实验内容2.1写出将一个无向图的邻接矩阵转换成邻接表的算法2.2以邻接表作存储结构,给出拓扑排序算法的实现。3.实验代码2.1代码:VOid mattolist(i
16、nt a,adjlist b,int n) /*n 为图的结点个数 */for(i=0;in;i+)bi.firstarc=NULL; /* 邻接表置空 */for(i=0;i=0;j-)if(aij!=0)p=(arcnodetp *)malloc(sizeof(arcnodetp);/* 产生邻接点 */ p-adjvex=j;p-n extare=bi.firstare;bi.firstarc=p;2.2代码: typedef StrUCt VeX nodeVerteXTyPe vertex;int in;/*增加一个入度域*/AreCNOdeTP * fristarc;AdjListv
17、 num;typedef StrUCt graphAdjLiSt adjlist;int VeX nu m,arc num;GraphTp;Top_SOrt(GraPh TP g)LStaCkTP *p;/*建立入度为O的顶点栈S*/int m,i,v;ini tStack(S);for(i=0;ivPrintf(%d,v);/* 输出 v*/m+;p=g.adjlisti.fristarc;/*P=图 g 中顶点 V 的第一个邻接点 */WhiIe(P!=NULL)/p 存在(g.adjlistp-adjvex.in)-;/*P 的入度-*/ if(g.adjlistp-adjvex.i n
18、=0)*if(p 的入度=0)*/PUSh(S,p-adjvex);/*P 入 S 栈*/p=p-nextarc;/*P=图g中的顶点V的下一个邻接点*/if(m#include VString.h#defi ne MAXNUM 20int input(int *);/* 输入数据 */int SearCh(int *,int,int);/* 查找插入位置 */void plug(int *,int,int);/* 插入数据 */void main (VOid)int dataMAXNUM,m;int in Sert=1;m=i nput(data);Prin tf(I nput the in
19、 Sert nu m:);SCan f(%d,data);inSert=SearCh(data,1,m);/*返回插入位置 */plug(data,i nsert,m);for(insert=1;insert=m+1;insert+)/* 显示数据 */Prin tf(%3d,*(data+i nsert);getch();int in put(i nt *data)int i,m;Prin tf( nln PUt the max nu m:);SCan f(%d,&m);Prin tf(i nput datan);for(i=1;ihigh) return low;/*没有找到插入数据,返回
20、low*/ elsemid*/mid=(low+high)2;if(*(data+mid)=*data) retun mid;/* 找到插入数据,返回else if(*(data+mid)*data)SearCh(data,low,high);void plug(i nt *data,i nt in sert,i nt m)int i;for(i=m;ii nsert;i-)*(data+i+1)=*(data+i);(data+in Sert)=*data2.2代码:#i nclude VStdiO.h#in elude VCOni o.h#include #definr N 18 /* 元
21、素个数 */#defi nr Block num 3 /* 分块数 */typedef StrUCt in dextermint key;/*最大关键字*/int addr;/*块的起始地址*/index; /*索引表数据类型*/index * CreateList(int data,int n)/* 建索引表 */in dex *p;int m,j,k;m=n/BlockNum;/*分为BlockNum块,每块有 m个元素*/p=(i ndex *)malloc(BlockNum *sizeof(i ndex);for(k=O;kkey=dat am*k;(p+k)-addr=m*k;for
22、(j=m*k;j(p+k)-key)(p+k)-key=dataj;/* 块的最大关键字 */return p;int BlockSearch(index *list,int rectab,int n,int m,int k)/* 分块查找 */int low=0,high=m-1,mid,i;int b=n/m;/*每块有b个元素*/WhiIe(IOWV=high)* 块间折半查找 */mid=(low+high)2;if(list+mid)-key=k)high=mid+1;else low=mid+1;if(lowaddr;iadder+b-1 &rectabi!=k;i+);if(ia
23、ddr+b-1)return i;else return -1;return -1;void main()in t recordN=22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,49,86,53;int key;in dex *list;Prin tf(please in PUt key:n);SCa nf(%d,&key);IiSt=CreateLiSt(record,N);Prin tf(data postion id %dn,BlockSearch(list,record,N,BlockNum,key);4.实验小结通过本章的学习,对排序有较高层次的理解与认识,从平时的练习中可以 看出排序是数据处理中经常用到的重要运算。 有序的顺序表可以采用查找 效率较高的折半查找法,而无序的顺序表只能用效率较低的顺序查找法。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1