数据结构单链表课程设计设计报告

上传人:ren****ao 文档编号:126971417 上传时间:2022-07-29 格式:DOC 页数:28 大小:284.51KB
收藏 版权申诉 举报 下载
数据结构单链表课程设计设计报告_第1页
第1页 / 共28页
数据结构单链表课程设计设计报告_第2页
第2页 / 共28页
数据结构单链表课程设计设计报告_第3页
第3页 / 共28页
资源描述:

《数据结构单链表课程设计设计报告》由会员分享,可在线阅读,更多相关《数据结构单链表课程设计设计报告(28页珍藏版)》请在装配图网上搜索。

1、 数据结构课程设计报告1) 需求分析此程序主要用来实现单链表的创建、插入、删除、排序、并、交、差运算及输出等基本操作。程序需要根据使用者的需要来运算得出符合要求的结果在程序运行的过程中根据提示进行输入,使用了scanf函数;使用了printf函数进行输出;程序输出符合使用者的需要的结果;程序能够输出任意运算的正确结果。2)概要设计1. 定义所需的数据结构 data *next typedef struct LNodeint data; /数据域struct LNode *next; /指针域LNode, *LinkList;2. 模块划分void LinkListCreat(LinkList

2、&L,int n); /创建void ListInsert(LinkList head,int i,int e); /插入void ListDelete(LinkList head,int i,int e); /删除void printList(LinkList &head); /输出void LinkListsort(LinkList &L); /排序void LinkListMerge(LinkList &La, LinkList &Lb,LinkList &Lc); /并void LinkListJiao(LinkList &La, LinkList &Lb,LinkList &Lc);

3、 /交void LinkListcha(LinkList &La, LinkList &Lb,LinkList &Lc); /差void LinkListhebing(LinkList &La, LinkList &Lb,LinkList &Lc); /差集的并void main(); /主函数,分别调用以上的子函数3 .功能设计首先利用元素逆序插入法建立链表,然后导出菜单,用switch调用各个子函数,实现链表的创建,插入,删除,排序,交,并,差等运算,其中排序用的是冒泡法。3)详细设计/单链表的创建void CreatList(Lnode *L) /*建立链表CreastList函数*/

4、Lnode *p; int value; L-next=NULL; while (1) /*当输入非0数值时*/ scanf( %d,&value); if (value=NULL) return; p=(Lnode *)malloc(sizeof(Lnode); /*建立P链表*/ p-data=value; p-next=L-next; /*把后输入的插到前面*/ L-next=p; /单链表的输出void printList(Lnode *head) printf(输出的结果如下: n);Lnode *p = head-next;/头结点赋给Pif (p = NULL)printf(Li

5、st is empty!n);return;while (p != NULL)printf(%d , p-data);p = p-next;printf(n);/单链表的插入void ListInsert(LinkList head,int i,int e)/在单链表中第i个位置之前插入e元素 LinkList p,s; int j=0; p=head; while(p&jnext; +j; if(!p|ji-1) printf(要插入的位置错误!); s = (LNode *)malloc(sizeof(LNode);/给插入的元素开辟空间 s-data = e;/改变指针指向 s-next

6、 = p-next; p-next = s; /单链表的删除int ListDelete_L(Lnode *L,int i) /*删除函数*/ Lnode *p=L-next; int j=0; Lnode *q; while (p-next & jnext; +j; /*找出第i节点,并令p指向其前趋*/ if (!p-next | ji-1) return 0; q=p-next; p-next=q-next; free(q); return 1;/单链表的差运算Lnode *c,*a,*t; c=C=(Lnode *)malloc(sizeof(Lnode); a = A-next; w

7、hile(a) p = B-next; while(p & a-data != p-data) p = p-next; if(!(p & p-data = a-data) t=(Lnode *)malloc(sizeof(Lnode); t-data = a-data; c-next = t; c = t; a=a-next; c-next = NULL; printf( n 进行差运算,结果为:n); printList(C); C=(Lnode *)malloc(sizeof(Lnode); /*必须再分配一次地址空间以用来把原链表清空,否则每次运行都会使链表元素增加*/ break;/单

8、链表的交运算Lnode *d; d=D=(Lnode *)malloc(sizeof(Lnode); a = A-next; while(a) p = B-next; while(p & a-data != p-data) p = p-next; if(p & p-data = a-data) t=(Lnode *)malloc(sizeof(Lnode); t-data = a-data; d-next = t; d = t; a=a-next; d-next = NULL; printf( n 进行差运算,结果为:n); printList(D); D=(Lnode *)malloc(si

9、zeof(Lnode); break;/单链表的并运算Lnode *e;a =A-next;p = B-next;e = E = A; /用La的头结点作为Lc的头结点while(a&p)if(a-data data)/如果pa-data data,将pa所指节点链接到pc所指节点之后e-next = a;e = a;a = a-next;else/否则将pb所指节点链接到pc所指节点之后e-next = p;e = p;p = p-next;e-next = a ? a : p; / 插入剩余段free(B);/释放LbprintList(E);E=(Lnode *)malloc(sizeo

10、f(Lnode); break;/主函数main() int sign,sign1,signa,signb,signc,i,x,ca,cb,cc; int choice=1; Lnode *A,*B,*C,*D,*E,*L,*p,*q,*n,*m; A=(Lnode *)malloc(sizeof(Lnode);/*开辟地址空间*/ B=(Lnode *)malloc(sizeof(Lnode); C=(Lnode *)malloc(sizeof(Lnode); D=(Lnode *)malloc(sizeof(Lnode); E=(Lnode *)malloc(sizeof(Lnode);

11、printf(t 数据结构课程设计-单链表的基本操作nn); while (choice) printf(t 请选择您想进行的操作:n 1:对A链表操作 n 2:对B链表操作 n 3:两链表运算 n 4:退出程序 n n 您的选择是:); scanf(%d,&sign1); /*输入选项*/if (sign1=1)/*如果选择1则输出下列选项界面*/L=A;/*选择1对链表A进行操作*/ ca=1; while (ca) printf(t 请选择对A链表进行的操作:n 1:建立链表 n 2:对链表排序 n 3:在链表中插入元素 n 4:在链表中删除元素 n 5:返回上一级菜单 n 您的选择是:

12、);scanf(%d,&signa);/*输入对链表A的操作选项*/ switch(signa) case 1: printf(n请输入链表元素(输入去0结束)n); CreatList(A); /*调用CreatList函数*/ PrintList(A);/*调用PrintList函数*/ break; case 2: printf(对A链表进行排序,结果为:n ); paixu(A);/*调用排序函数*/ PrintList(A);/*调用PrintList函数*/ break; case 3: printf(请输入想要插入的位置及插入的数值(以逗号分隔): ); scanf(%d,%d,

13、&i,&x); if (ListInsert_L(L,i,x)=1) printf(修改成功!目前A链表为:n); PrintList(L); else printf(警告!您输入的插入位置超过链表长度。 n); break; case 4: printf(请输入想要删除的元素位置: ); scanf(%d,&i); if (ListDelete_L(L,i)=1) printf(删除元素成功!目前A链表为:n); PrintList(L); else printf(警告!您输入的删除位置超过链表长度。 n); break; case 5: ca=0; break; default: prin

14、tf(警告!只能选择1-5。 n); break; else if (sign1=2) L=B; cb=1; while (cb) printf(t 请选择对B链表进行的操作:n 1:建立链表 n 2:对链表排序 n 3:在链表中插入元素 n 4:在链表中删除元素 n 5:返回上一级菜单 n 您的选择是:);scanf(%d,&signb); switch(signb) case 1: printf(n请输入链表元素(输入0结束)n); CreatList(B); PrintList(B); break; case 2: printf(对B链表进行排序,结果为:n ); paixu(B); P

15、rintList(B); break; case 3: printf(请输入想要插入的位置及插入的数值(以逗号分隔): ); scanf(%d,%d,&i,&x); if (ListInsert_L(L,i,x)=1) printf(修改成功!目前B链表为:n); PrintList(L); else printf(警告!您输入的插入位置超过链表长度。 n); break; case 4: printf(请输入想要删除的元素位置: ); scanf(%d,&i); if (ListDelete_L(L,i)=1) printf(删除元素成功!目前B链表为:n); PrintList(L); e

16、lse printf(警告!您输入的删除位置超过链表长度。 n); break; case 5: cb=0; break; default: printf(警告!只能选择1-5。 n); break; else if (sign1=3) cc=1; while (cc) printf(t 请选择操作的名称:n 1:显示当前的A、B链表 n 2:进行差运算 n 3:进行交运算 n 4:进行并运算 n 5:返回上一级菜单 n 您的选择是:); scanf(%d,&signc); switch(signc) case 1: printf( n 当前A); PrintList(A); printf(

17、n 当前B); PrintList(B); break; case 2: Lnode *c,*a,*t; c=C=(Lnode *)malloc(sizeof(Lnode); a = A-next; while(a) p = B-next; while(p & a-data != p-data) p = p-next; if(!(p & p-data = a-data) t=(Lnode *)malloc(sizeof(Lnode); t-data = a-data; c-next = t; c = t; a=a-next; c-next = NULL; printf( n 进行差运算,结果为

18、:n); printList(C); C=(Lnode *)malloc(sizeof(Lnode); /*必须再分配一次地址空间以用来把原链表清空,否则每次运行都会使链表元素增加*/ break; case 3:Lnode *d; d=D=(Lnode *)malloc(sizeof(Lnode); a = A-next; while(a) p = B-next; while(p & a-data != p-data) p = p-next; if(p & p-data = a-data) t=(Lnode *)malloc(sizeof(Lnode); t-data = a-data; d

19、-next = t; d = t; a=a-next; d-next = NULL; printf( n 进行差运算,结果为:n); printList(D); D=(Lnode *)malloc(sizeof(Lnode); break; case 4:Lnode *e;a =A-next;p = B-next;e = E = A; /用La的头结点作为Lc的头结点while(a&p)if(a-data data)/如果pa-data data,将pa所指节点链接到pc所指节点之后e-next = a;e = a;a = a-next;else/否则将pb所指节点链接到pc所指节点之后e-n

20、ext = p;e = p;p = p-next;e-next = a ? a : p; / 插入剩余段free(B);/释放LbprintList(E);E=(Lnode *)malloc(sizeof(Lnode); break; case 5: cc=0; break; default: printf(警告!只能选择1-5。 n); break; else if (sign1=4) printf(谢谢使用,请按任意键退出!n); break; else printf(提示:仅能在1-4之间选择!n); break; return 0;4. 流程图图1-1 单链表基本操作功能模块流程图4)

21、 调试分析前边程序没什么问题,但到了最后发现运算程序的时候程序结果虽然正确,但是程序会出现崩溃现象,经过分析应该是指针存在指向重复的问题,后来发现如果单纯去找问题的所在会很麻烦,也不一定能找出来具体的地方,因为程序本身是没有问题的,所以我遍采用重新开辟空间,讲之前的A和B链表赋给新的空间来避免指针重复的问题5)测试结果下面为部分运算截图单链表的创建单链表的插入单链表的删除单链表的排序单链表的差运算单链表的交运算 测试程序,进行全面的数据输入,频繁的运行各种运算,人工检验运算的准确度。6)用户使用说明 由于我们考虑到用户知识层次的不同,我们做了很贴心的服务,用户只需要按照提示一步步操作即可。7)

22、课设总结通过这周的课程设计,我们对数据结构中单链表的应用有了更深刻的理解,并且使我们深刻认识到时间的重要性,只有理论与实践相结合才能达到很好的学习效果,特别是程序语言的学习,只有将知识运用到实践中,能力才能的发哦提高。在我进行课程设计时,虽然大体上算法是正确的,但是常常会出现一些小的问题,是我们不得不花大量的时间来查找和修改错误。基本上是基本功的问题,一般都是格式上的错误。通过这次课程设计,让我们充分认识到在编写代码的时候,程序书写规范的重要性。并且在做课程设计中也让我们充分认识到数据结构在编写程序方面的重要地位,因此我们希望在以后的学习过程中,能够多多的学习这方面的知识来弥补不足的地方。8)

23、附录(源代码)#include #include #include typedef struct Lnodeint data; struct Lnode *next; *Linklist,Lnode; void CreatList(Lnode *L) /*建立链表CreastList函数*/ Lnode *p; int value; L-next=NULL; while (1) /*当输入非0数值时*/ scanf( %d,&value); if (value=NULL) return; p=(Lnode *)malloc(sizeof(Lnode); /*建立P链表*/ p-data=val

24、ue; p-next=L-next; /*把后输入的插到前面*/ L-next=p; /单链表的输出 void printList(Lnode *head) printf(输出的结果如下: n);Lnode *p = head-next;/头结点赋给Pif (p = NULL)printf(List is empty!n);return;while (p != NULL)printf(%d , p-data);p = p-next;printf(n);void paixu(Lnode *L) /*排序函数*/ Linklist r,q,small;int temp; for(r=L-next;

25、r-next!=NULL;r=r-next) small=r; for(q=r-next;q;q=q-next) /*找到链表中最小元素*/ if(q-datadata) small=q; if(small!=r) temp=r-data; r-data=small-data; /*把最小的数值换到P指针所指的位置数值上(原P指针的next指向不变)*/ small-data=temp; /*把原先p指针所指位置的数值填入被置换出的最小元素位置*/ void PrintList(Lnode *L) /*打印链表PrintList函数*/ Lnode *p=L-next; /*带头节点,把指针置

26、于第一个数*/ if(p=0) printf(链表为空); else printf(链表为:); while(p) printf(%d, p-data); p=p-next; printf(n); inter(Lnode *L,int i) Lnode *k=L-next; while(k) if (k-data=i) return 1; k=k-next; return 0;int ListInsert_L(Lnode *L, int i, int e) /*插入函数*/ Lnode *p=L-next; Lnode *s; int j=0; while (p & jnext; +j; if

27、 (!p | ji-1) return 0; s=(Lnode *)malloc(sizeof(Lnode); s-data=e; s-next=p-next; p-next=s; return 1;int ListDelete_L(Lnode *L,int i) /*删除函数*/ Lnode *p=L-next; int j=0; Lnode *q; while (p-next & jnext; +j; /*找出第i节点,并令p指向其前趋*/ if (!p-next | ji-1) return 0; q=p-next; p-next=q-next; free(q); return 1;ma

28、in() int sign,sign1,signa,signb,signc,i,x,ca,cb,cc; int choice=1; Lnode *A,*B,*C,*D,*E,*L,*p,*q,*n,*m; A=(Lnode *)malloc(sizeof(Lnode);/*开辟地址空间*/ B=(Lnode *)malloc(sizeof(Lnode); C=(Lnode *)malloc(sizeof(Lnode); D=(Lnode *)malloc(sizeof(Lnode); E=(Lnode *)malloc(sizeof(Lnode); printf(t 数据结构课程设计-单链表的

29、基本操作nn); while (choice) printf(t 请选择您想进行的操作:n 1:对A链表操作 n 2:对B链表操作 n 3:两链表运算 n 4:退出程序 n n 您的选择是:); scanf(%d,&sign1); /*输入选项*/if (sign1=1)/*如果选择1则输出下列选项界面*/L=A;/*选择1对链表A进行操作*/ ca=1; while (ca) printf(t 请选择对A链表进行的操作:n 1:建立链表 n 2:对链表排序 n 3:在链表中插入元素 n 4:在链表中删除元素 n 5:返回上一级菜单 n 您的选择是:);scanf(%d,&signa);/*输

30、入对链表A的操作选项*/ switch(signa) case 1: printf(n请输入链表元素(输入去0结束)n); CreatList(A); /*调用CreatList函数*/ PrintList(A);/*调用PrintList函数*/ break; case 2: printf(对A链表进行排序,结果为:n ); paixu(A);/*调用排序函数*/ PrintList(A);/*调用PrintList函数*/ break; case 3: printf(请输入想要插入的位置及插入的数值(以逗号分隔): ); scanf(%d,%d,&i,&x); if (ListInsert

31、_L(L,i,x)=1) printf(修改成功!目前A链表为:n); PrintList(L); else printf(警告!您输入的插入位置超过链表长度。 n); break; case 4: printf(请输入想要删除的元素位置: ); scanf(%d,&i); if (ListDelete_L(L,i)=1) printf(删除元素成功!目前A链表为:n); PrintList(L); else printf(警告!您输入的删除位置超过链表长度。 n); break; case 5: ca=0; break; default: printf(警告!只能选择1-5。 n); bre

32、ak; else if (sign1=2) L=B; cb=1; while (cb) printf(t 请选择对B链表进行的操作:n 1:建立链表 n 2:对链表排序 n 3:在链表中插入元素 n 4:在链表中删除元素 n 5:返回上一级菜单 n 您的选择是:);scanf(%d,&signb); switch(signb) case 1: printf(n请输入链表元素(输入0结束)n); CreatList(B); PrintList(B); break; case 2: printf(对B链表进行排序,结果为:n ); paixu(B); PrintList(B); break; ca

33、se 3: printf(请输入想要插入的位置及插入的数值(以逗号分隔): ); scanf(%d,%d,&i,&x); if (ListInsert_L(L,i,x)=1) printf(修改成功!目前B链表为:n); PrintList(L); else printf(警告!您输入的插入位置超过链表长度。 n); break; case 4: printf(请输入想要删除的元素位置: ); scanf(%d,&i); if (ListDelete_L(L,i)=1) printf(删除元素成功!目前B链表为:n); PrintList(L); else printf(警告!您输入的删除位置

34、超过链表长度。 n); break; case 5: cb=0; break; default: printf(警告!只能选择1-5。 n); break; else if (sign1=3) cc=1; while (cc) printf(t 请选择操作的名称:n 1:显示当前的A、B链表 n 2:进行差运算 n 3:进行交运算 n 4:进行并运算 n 5:返回上一级菜单 n 您的选择是:); scanf(%d,&signc); switch(signc) case 1: printf( n 当前A); PrintList(A); printf( n 当前B); PrintList(B);

35、break; case 2: Lnode *c,*a,*t; c=C=(Lnode *)malloc(sizeof(Lnode); a = A-next; while(a) p = B-next; while(p & a-data != p-data) p = p-next; if(!(p & p-data = a-data) t=(Lnode *)malloc(sizeof(Lnode); t-data = a-data; c-next = t; c = t; a=a-next; c-next = NULL; printf( n 进行差运算,结果为:n); printList(C); C=(

36、Lnode *)malloc(sizeof(Lnode); /*必须再分配一次地址空间以用来把原链表清空,否则每次运行都会使链表元素增加*/ break; case 3:Lnode *d; d=D=(Lnode *)malloc(sizeof(Lnode); a = A-next; while(a) p = B-next; while(p & a-data != p-data) p = p-next; if(p & p-data = a-data) t=(Lnode *)malloc(sizeof(Lnode); t-data = a-data; d-next = t; d = t; a=a-

37、next; d-next = NULL; printf( n 进行差运算,结果为:n); printList(D); D=(Lnode *)malloc(sizeof(Lnode); break; case 4:Lnode *e;a =A-next;p = B-next;e = E = A; /用La的头结点作为Lc的头结点while(a&p)if(a-data data)/如果pa-data data,将pa所指节点链接到pc所指节点之后e-next = a;e = a;a = a-next;else/否则将pb所指节点链接到pc所指节点之后e-next = p;e = p;p = p-next;e-next = a ? a : p; / 插入剩余段free(B);/释放LbprintList(E);E=(Lnode *)malloc(sizeof(Lnode); break; case 5: cc=0; break; default: printf(警告!只能选择1-5。 n); break; else if (sign1=4) printf(谢谢使用,请按任意键退出!n); break; else printf(提示:仅能在1-4之间选择!n); break; return 0;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!