2022年数据结构c语言版实验及源代码整理 .pdf
《2022年数据结构c语言版实验及源代码整理 .pdf》由会员分享,可在线阅读,更多相关《2022年数据结构c语言版实验及源代码整理 .pdf(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验 1 求两个多项式的相加运算(线性表)编写一个程序用单链表存储多项式,并实现两个多项式相加的函数。/*文件名 :实验 1.cpp*/ #include #include #define MAX 20 /*多项式最多项数*/ typedef struct /*定义存放多项式的数组类型*/ float coef; /*系数 */ int exp; /*指数 */ PolyArrayMAX; typedef struct pnode /*定义单链表结点类型*/ float coef; /*系数 */ int exp; /*指数 */ struct pnode *next; PolyNode; v
2、oid DispPoly(PolyNode *L) /*输出多项式 */ PolyNode *p=L-next; while (p!=NULL) printf(%gX%d ,p-coef,p-exp); p=p-next; printf(n); void CreateListR(PolyNode *&L,PolyArray a,int n) /*尾插法建表 */ PolyNode *s,*r;int i; L=(PolyNode *)malloc(sizeof(PolyNode); /*创建头结点 */ L-next=NULL; r=L; /*r 始终指向终端结点,开始时指向头结点*/ for
3、 (i=0;icoef=ai.coef; s-exp=ai.exp; r-next=s; /*将*s 插入 *r 之后 */ r=s; r-next=NULL; /*终端结点 next 域置为 NULL*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 22 页 - - - - - - - - - void Sort(PolyNode *&head) /*按 exp 域递减排序 */ PolyNode *p=head-next,*q,*r; if (p!=NULL) /
4、*若原单链表中有一个或以上的数据结点*/ r=p-next; /*r 保存 *p 结点后继结点的指针*/ p-next=NULL; /*构造只含一个数据结点的有序表*/ p=r; while (p!=NULL) r=p-next; /*r 保存 *p 结点后继结点的指针*/ q=head; while (q-next!=NULL & q-next-expp-exp) q=q-next; /*在有序表中找插入*p 的前驱结点 *q*/ p-next=q-next; /*将*p 插入到 *q 之后 */ q-next=p; p=r; void Add(PolyNode *ha,PolyNode *
5、hb,PolyNode *&hc) /*求两有序集合的并*/ PolyNode *pa=ha-next,*pb=hb-next,*s,*tc; float c; hc=(PolyNode *)malloc(sizeof(PolyNode); /*创建头结点 */ tc=hc; while (pa!=NULL & pb!=NULL) if (pa-exppb-exp) s=(PolyNode *)malloc(sizeof(PolyNode); /* 复制结点 */ s-exp=pa-exp;s-coef=pa-coef; tc-next=s;tc=s; pa=pa-next; else if
6、(pa-expexp) s=(PolyNode *)malloc(sizeof(PolyNode); /* 复制结点 */ s-exp=pb-exp;s-coef=pb-coef; tc-next=s;tc=s; pb=pb-next; else /*pa-exp=pb-exp*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 22 页 - - - - - - - - - c=pa-coef+pb-coef; if (c!=0) /*系数之和不为0 时创建新结点*/ s
7、=(PolyNode *)malloc(sizeof(PolyNode); /*复制结点 */ s-exp=pa-exp;s-coef=c; tc-next=s;tc=s; pa=pa-next; pb=pb-next; if (pb!=NULL) pa=pb; /*复制余下的结点*/ while (pa!=NULL) s=(PolyNode *)malloc(sizeof(PolyNode); /*复制结点 */ s-exp=pa-exp;s-coef=pa-coef; tc-next=s;tc=s; pa=pa-next; tc-next=NULL; void main() PolyNod
8、e *ha,*hb,*hc; PolyArray a=1.2,0,2.5,1,3.2,3,-2.5,5; PolyArray b=-1.2,0,2.5,1,3.2,3,2.5,5,5.4,10; CreateListR(ha,a,4); CreateListR(hb,b,5); printf( 原多项式A: );DispPoly(ha); printf( 原多项式B: );DispPoly(hb); Sort(ha); Sort(hb); printf( 有序多项式A: );DispPoly(ha); printf( 有序多项式B: );DispPoly(hb); Add(ha,hb,hc);
9、 printf( 多项式相加 : );DispPoly(hc); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 22 页 - - - - - - - - - 实验 2 求解迷宫问题的所有路径及最短路径程序(堆栈)改进教材中3.2.4 节中的求解迷宫问题程序,要求输出如图所示的迷宫的所有路径,并求出最短路径成都及最短路径。/*文件名 :实验 2.cpp*/ #include #define M 6 /*行数 */ #define N 6 /*列数 */ #define M
10、axSize 100 /*栈最多元素个数*/ int mgM+1N+1= /*一个迷宫 ,其四周要加上均为1 的外框 */ 1,1,1,1,1,1, 1,0,0,0,1,1, 1,0,1,0,0,1, 1,0,0,0,1,1, 0 1 2 3 4 0 1 2 3 4 5 5 入口出口名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 22 页 - - - - - - - - - 1,1,0,0,0,1, 1,1,1,1,1,1 ; struct int i;int j;int
11、 di; StackMaxSize,PathMaxSize; /*定义栈和存放最短路径的数组*/ int top=-1; /*栈指针 */ int count=1; /*路径数计数 */ int minlen=MaxSize; /*最短路径长度 */ void mgpath() /*路径为 :(1,1)-(M-2,N-2)*/ int i,j,di,find,k; top+; /*进栈 */ Stacktop.i=1; Stacktop.j=1; Stacktop.di=-1;mg11=-1; /*初始结点进栈 */ while (top-1) /*栈不空时循环 */ i=Stacktop.i
12、;j=Stacktop.j;di=Stacktop.di; if (i=M-2 & j=N-2) /*找到了出口 ,输出路径 */ printf(%4d: ,count+); for (k=0;k=top;k+) printf(%d,%d) ,Stackk.i,Stackk.j); if (k+1)%5=0) printf(nt); /*输出时每 5 个结点换一行*/ printf(n); if (top+1minlen) /*比较找最短路径*/ for (k=0;k=top;k+) Pathk=Stackk; minlen=top+1; mgStacktop.iStacktop.j=0; /
13、*让该位置变为其他路径可走结点*/ top-; i=Stacktop.i;j=Stacktop.j;di=Stacktop.di; find=0; while (di4 & find=0) /*找下一个可走结点*/ di+; switch(di) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 22 页 - - - - - - - - - case 0:i=Stacktop.i-1;j=Stacktop.j;break; case 1:i=Stacktop.i;j=Sta
14、cktop.j+1;break; case 2:i=Stacktop.i+1;j=Stacktop.j;break; case 3:i=Stacktop.i,j=Stacktop.j-1;break; if (mgij=0) find=1; if (find=1) /*找到了下一个可走结点*/ Stacktop.di=di; /* 修改原栈顶元素的di 值*/ top+;Stacktop.i=i;Stacktop.j=j;Stacktop.di=-1;/*下一个可走结点进栈*/ mgij=-1; /*避免重复走到该结点*/ else /*没有路径可走 ,则退栈 */ mgStacktop.iS
15、tacktop.j=0; /*让该位置变为其他路径可走结点*/ top-; printf( 最短路径如下 :n); printf( 长度 : %dn,minlen); printf( 路径 : ); for (k=0;kminlen;k+) printf(%d,%d) ,Pathk.i,Pathk.j); if (k+1)%5=0) printf(nt); /*输出时每 5 个结点换一行*/ printf(n); void main() printf( 迷宫所有路径如下:n); mgpath(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
16、 - - - - 名师精心整理 - - - - - - - 第 6 页,共 22 页 - - - - - - - - - /实验 3 求一个串中出现的第一个最长重复字符串(串)编写一个程序,求串s 中出现的第一个最长重复字符串的下标和长度。*文件名 :实验 3.cpp*/ #include #include #include #define MaxSize 100 typedef struct char chMaxSize; int len; /*串长 */ SqString; extern void StrAssign(SqString &,char ); /*在 algo4-1.cpp 文
17、件中 */ extern void DispStr(SqString); SqString *MaxSubstr(SqString s) SqString *sp; int index=0,length=0,length1,i=0,j,k; while (is.len) j=i+1; while (jlength) /* 将较大长度者赋给index 与 length*/ index=i; length=length1; j+=length1; else j+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
18、 - - - - - 第 7 页,共 22 页 - - - - - - - - - i+; /*继续扫描第i 字符之后的字符*/ sp=(SqString *)malloc(sizeof(SqString); sp-len=length; for (i=0;ichi=s.chindex+i; return sp; void main() char strMaxSize; SqString s,*sp; printf( 输入串 :); gets(str); StrAssign(s,str); /*创建串 s*/ sp=MaxSubstr(s); printf( 求最长重复子串:n); print
19、f( 原串 : ); DispStr(s); printf( 最长重复子串 :); /*输出最长重复子串*/ DispStr(*sp); 实验 4 求解背包问题(递归)背包问题: 设有不同价值、 不同重量的物品n 件, 求从这 n 件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和为最大。编写一个程序求解背包问题。/*文件名 :实验 4.cpp*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 22 页 - - - - - - -
20、 - - #include #define N 100 int limitw; /*限制的总重量*/ int totv; /*全部物品的总价*/ int maxv; int optionN,copN; struct int weight; int value; aN; int n; /*物品种数次 */ void find(int i,int tw,int tv) int k; if (tw+ai.weight=limitw) copi=1; if (in-1) find(i+1,tw+ai.weight,tv); else for (k=0;kmaxv) if (in-1) find(i+1
21、,tw,tv-ai.value); else for (k=0;kn;k+) optionk=copk; maxv=tv-ai.value; void main() int k,w,v; printf( 物品种数 :); scanf(%d,&n); for (totv=0,k=0;kn;k+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 22 页 - - - - - - - - - printf( 第 %d 种物品 (重量 ,价值 ):,k+1); scanf(%d,
22、%d,&w,&v); ak.weight=w; ak.value=v; totv+=v; printf( 背包所能承受的总重量:); scanf(%d,&limitw); maxv=0; for (k=0;kn;k+) copk=0; find(0,0,totv); printf( 最佳装填方案是:n); for (k=0;kn;k+) if (optionk) printf( 第%d 种物品 n,k+1); printf( 总价值 =%dn,maxv); 实验 5 求二叉树中从根节点到叶子节点的路径对一棵二叉树,编写程序完成下述功能:输出所有的叶子结点输出所有从叶子结点到根节点的路径输出上述
23、路径中的第一条最长的路径/*文件名 :实验 5.cpp*/ #include #include #define MaxSize 100 typedef char ElemType; typedef struct node ElemType data; /*数据元素 */ struct node *lchild; /*指向左孩子 */ struct node *rchild; /*指向右孩子 */ BTNode; extern void CreateBTNode(BTNode *&b,char *str); /* 在 algo7-1.cpp 文件中 */ 名师资料总结 - - -精品资料欢迎下载
24、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 22 页 - - - - - - - - - extern void DispBTNode(BTNode *b); void AllPath(BTNode *b) struct snode BTNode *node; /*存放当前结点指针*/ int parent; /*存放双亲结点在队列中的位置*/ QuMaxSize; /*定义顺序队列 */ int front,rear,p; /*定义队头和队尾指针*/ front=rear=-1; /*置队列为空队列*/
25、 rear+; Qurear.node=b; /*根结点指针进入队列*/ Qurear.parent=-1; /*根结点没有双亲结点*/ while (frontlchild=NULL & b-rchild=NULL) /*b 为叶子结点 */ printf( %c 到根结点路径 :,b-data); p=front; while (Qup.parent!=-1) printf(%c ,Qup.node-data); p=Qup.parent; printf(%cn,Qup.node-data); if (b-lchild!=NULL) /* 左孩子入队列 */ rear+; Qurear.n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年数据结构c语言版实验及源代码整理 2022 数据结构 语言版 实验 源代码 整理
限制150内