1、大连工业大学数据结构单链表课程设计设计报告 数据结构课程设计报告1) 需求分析此程序主要用来实现单链表的创建、插入、删除、排序、并、交、差运算及输出等基本操作。程序需要根据使用者的需要来运算得出符合要求的结果在程序运行的过程中根据提示进行输入,使用了scanf函数;使用了printf函数进行输出;程序输出符合使用者的需要的结果;程序能够输出任意运算的正确结果。2) 概要设计 1. 定义所需的数据结构 data *next typedef struct LNode int data; /数据域 struct LNode *next; /指针域LNode, *LinkList;2. 模块划分voi
2、d LinkListCreat(LinkList &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, L
3、inkList &Lb,LinkList &Lc); /交void LinkListcha(LinkList &La, LinkList &Lb,LinkList &Lc); /差void LinkListhebing(LinkList &La, LinkList &Lb,LinkList &Lc); /差集的并void main(); /主函数,分别调用以上的子函数3 .功能设计首先利用元素逆序插入法建立链表,然后导出菜单,用switch调用各个子函数,实现链表的创建,插入,删除,排序,交,并,差等运算,其中排序用的是冒泡法。3) 详细设计/单链表的创建void CreatList(Lnod
4、e *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=value; p-next=L-next; /*把后输入的插到前面*/ L-next=p; /单链表的输出void printList(Lnode *head) printf(输出的结果如下: n); Lnode *p = head-next;/
5、头结点赋给P if (p = NULL) printf(List 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);/给
6、插入的元素开辟空间 s-data = e;/改变指针指向 s-next = 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 *)
7、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=(Lnode *)malloc(sizeof(Lnode); /*必须再分配一次地址空间以
8、用来把原链表清空,否则每次运行都会使链表元素增加*/ break;/单链表的交运算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);
9、 printList(D); D=(Lnode *)malloc(sizeof(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; / 插入剩余段
10、free(B);/释放Lb printList(E); E=(Lnode *)malloc(sizeof(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 *)mal
11、loc(sizeof(Lnode); E=(Lnode *)malloc(sizeof(Lnode); 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:建立链表
12、n 2:对链表排序 n 3:在链表中插入元素 n 4:在链表中删除元素 n 5:返回上一级菜单 n 您的选择是:); 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函数*/ b
13、reak; case 3: printf(请输入想要插入的位置及插入的数值(以逗号分隔): ); scanf(%d,%d,&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(警告!
14、您输入的删除位置超过链表长度。 n); break; case 5: ca=0; break; default: printf(警告!只能选择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); Pri
15、ntList(B); break; case 2: printf(对B链表进行排序,结果为:n ); paixu(B); PrintList(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
16、(ListDelete_L(L,i)=1) printf(删除元素成功!目前B链表为:n); PrintList(L); else 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)
17、; switch(signc) case 1: printf( n 当前A); PrintList(A); printf( 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
18、-next = t; c = t; a=a-next; c-next = NULL; printf( n 进行差运算,结果为: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
19、 = 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(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所指节
20、点链接到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);/释放Lb printList(E); E=(Lnode *)malloc(sizeof(Lnode); break; case 5: cc=0; break; default: printf(警告!只能选择1-5。 n); break; else if (sign1=4) printf(谢谢使用,请按任意键退出!n); b
21、reak; else printf(提示:仅能在1-4之间选择!n); break; return 0;4. 流程图图1-1 单链表基本操作功能模块流程图4) 调试分析前边程序没什么问题,但到了最后发现运算程序的时候程序结果虽然正确,但是程序会出现崩溃现象,经过分析应该是指针存在指向重复的问题,后来发现如果单纯去找问题的所在会很麻烦,也不一定能找出来具体的地方,因为程序本身是没有问题的,所以我遍采用重新开辟空间,讲之前的A和B链表赋给新的空间来避免指针重复的问题5) 测试结果下面为部分运算截图单链表的创建单链表的插入单链表的删除单链表的排序单链表的差运算单链表的交运算 测试程序,进行全面的数据
22、输入,频繁的运行各种运算,人工检验运算的准确度。6) 用户使用说明 由于我们考虑到用户知识层次的不同,我们做了很贴心的服务,用户只需要按照提示一步步操作即可。7) 课设总结通过这周的课程设计,我们对数据结构中单链表的应用有了更深刻的理解,并且使我们深刻认识到时间的重要性,只有理论与实践相结合才能达到很好的学习效果,特别是程序语言的学习,只有将知识运用到实践中,能力才能的发哦提高。在我进行课程设计时,虽然大体上算法是正确的,但是常常会出现一些小的问题,是我们不得不花大量的时间来查找和修改错误。基本上是基本功的问题,一般都是格式上的错误。通过这次课程设计,让我们充分认识到在编写代码的时候,程序书写
23、规范的重要性。并且在做课程设计中也让我们充分认识到数据结构在编写程序方面的重要地位,因此我们希望在以后的学习过程中,能够多多的学习这方面的知识来弥补不足的地方。8)附录(源代码)#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,&val
24、ue); 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;/头结点赋给P if (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;r-next!=NULL;r=r-next) small=r; for(q=r-next;q;q=q-next) /*找到链表中最小元素*/ if(q-datadata) small=q; if(small!=r) te
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1