大连工业大学数据结构单链表课程设计设计报告.docx
《大连工业大学数据结构单链表课程设计设计报告.docx》由会员分享,可在线阅读,更多相关《大连工业大学数据结构单链表课程设计设计报告.docx(33页珍藏版)》请在冰豆网上搜索。
大连工业大学数据结构单链表课程设计设计报告
《数据结构》课程设计报告
1)需求分析
此程序主要用来实现单链表的创建、插入、删除、排序、并、交、差运算及输出等基本操作。
程序需要根据使用者的需要来运算得出符合要求的结果
①在程序运行的过程中根据提示进行输入,使用了scanf函数;
②使用了printf函数进行输出;
③程序输出符合使用者的需要的结果;
④程序能够输出任意运算的正确结果。
2)概要设计
1.定义所需的数据结构
data*next
typedefstructLNode{
intdata;//数据域
structLNode*next;//指针域
}LNode,*LinkList;
2.模块划分
voidLinkListCreat(LinkList&L,intn);//创建
voidListInsert(LinkListhead,inti,inte);//插入
voidListDelete(LinkListhead,inti,inte);//删除
voidprintList(LinkList&head);//输出
voidLinkListsort(LinkList&L);//排序
voidLinkListMerge(LinkList&La,LinkList&Lb,LinkList&Lc);//并
voidLinkListJiao(LinkList&La,LinkList&Lb,LinkList&Lc);//交
voidLinkListcha(LinkList&La,LinkList&Lb,LinkList&Lc);//差
voidLinkListhebing(LinkList&La,LinkList&Lb,LinkList&Lc);//差集的并
voidmain();//主函数,分别调用以上的子函数
3.功能设计
首先利用元素逆序插入法建立链表,然后导出菜单,用switch调用各个子函数,实现链表的创建,插入,删除,排序,交,并,差等运算,其中排序用的是冒泡法。
3)详细设计
//单链表的创建
voidCreatList(Lnode*L)/*建立链表CreastList函数*/
{Lnode*p;
intvalue;
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;
}
//单链表的输出
voidprintList(Lnode*head)
{
printf("输出的结果如下:
\n");
Lnode*p=head->next;//头结点赋给P
if(p==NULL)
printf("Listisempty!
while(p!
=NULL)
printf("%d",p->data);
p=p->next;
printf("\n");
//单链表的插入
voidListInsert(LinkListhead,inti,inte)//在单链表中第i个位置之前插入e元素
LinkListp,s;
intj=0;
p=head;
while(p&&j{p=p->next;++j;}if(!p||j>i-1){printf("要插入的位置错误!");}s=(LNode*)malloc(sizeof(LNode));//给插入的元素开辟空间s->data=e;//改变指针指向s->next=p->next;p->next=s;}//单链表的删除intListDelete_L(Lnode*L,inti)/*删除函数*/{Lnode*p=L->next;intj=0;Lnode*q;while(p->next&&jnext;++j;}/*找出第i节点,并令p指向其前趋*/if(!p->next||j>i-1)return0;q=p->next;p->next=q->next;free(q);return1;}//单链表的差运算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=(Lnode*)malloc(sizeof(Lnode));/*必须再分配一次地址空间以用来把原链表清空,否则每次运行都会使链表元素增加*/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");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<=p->data)//如果pa->data<=pb->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;//主函数main(){intsign,sign1,signa,signb,signc,i,x,ca,cb,cc;intchoice=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《数据结构课程设计--单链表的基本操作》\n\n");while(choice){printf("\t请选择您想进行的操作:\n1:对A链表操作\n2:对B链表操作\n3:两链表运算\n4:退出程序\n\n您的选择是:");scanf("%d",&sign1);/*输入选项*/if(sign1==1)/*如果选择1则输出下列选项界面*/{L=A;/*选择1对链表A进行操作*/ca=1;while(ca){printf("\t请选择对A链表进行的操作:\n1:建立链表\n2:对链表排序\n3:在链表中插入元素\n4:在链表中删除元素\n5:返回上一级菜单\n您的选择是:");scanf("%d",&signa);/*输入对链表A的操作选项*/switch(signa){case1:printf("\n请输入链表元素(输入去0结束)\n");CreatList(A);/*调用CreatList函数*/PrintList(A);/*调用PrintList函数*/break;case2:printf("对A链表进行排序,结果为:\n");paixu(A);/*调用排序函数*/PrintList(A);/*调用PrintList函数*/break;case3:printf("请输入想要插入的位置及插入的数值(以逗号分隔):");scanf("%d,%d",&i,&x);if(ListInsert_L(L,i,x)==1){printf("修改成功!目前A链表为:\n");PrintList(L);}elseprintf("警告!您输入的插入位置超过链表长度。\n");break;case4:printf("请输入想要删除的元素位置:");scanf("%d",&i);if(ListDelete_L(L,i)==1){printf("删除元素成功!目前A链表为:\n");PrintList(L);}elseprintf("警告!您输入的删除位置超过链表长度。\n");break;case5:ca=0;break;default:printf("警告!只能选择1-5。\n");break;}}}elseif(sign1==2){L=B;cb=1;while(cb){printf("\t请选择对B链表进行的操作:\n1:建立链表\n2:对链表排序\n3:在链表中插入元素\n4:在链表中删除元素\n5:返回上一级菜单\n您的选择是:");scanf("%d",&signb);switch(signb){case1:printf("\n请输入链表元素(输入0结束)\n");CreatList(B);PrintList(B);break;case2:printf("对B链表进行排序,结果为:\n");paixu(B);PrintList(B);break;case3:printf("请输入想要插入的位置及插入的数值(以逗号分隔):");scanf("%d,%d",&i,&x);if(ListInsert_L(L,i,x)==1){printf("修改成功!目前B链表为:\n");PrintList(L);}elseprintf("警告!您输入的插入位置超过链表长度。\n");break;case4:printf("请输入想要删除的元素位置:");scanf("%d",&i);if(ListDelete_L(L,i)==1){printf("删除元素成功!目前B链表为:\n");PrintList(L);}elseprintf("警告!您输入的删除位置超过链表长度。\n");break;case5:cb=0;break;default:printf("警告!只能选择1-5。\n");break;}}}elseif(sign1==3){cc=1;while(cc){printf("\t请选择操作的名称:\n1:显示当前的A、B链表\n2:进行差运算\n3:进行交运算\n4:进行并运算\n5:返回上一级菜单\n您的选择是:");scanf("%d",&signc);switch(signc){case1:printf("\n当前A");PrintList(A);printf("\n当前B");PrintList(B);break;case2: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=(Lnode*)malloc(sizeof(Lnode));/*必须再分配一次地址空间以用来把原链表清空,否则每次运行都会使链表元素增加*/break;case3: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(sizeof(Lnode));break;case4:Lnode*e;a=A->next;p=B->next;e=E=A;//用La的头结点作为Lc的头结点while(a&&p){if(a->data<=p->data)//如果pa->data<=pb->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;case5:cc=0;break;default:printf("警告!只能选择1-5。\n");break;}}}elseif(sign1==4){printf("谢谢使用,请按任意键退出!\n");break;}else{printf("提示:仅能在1-4之间选择!\n");break;}}return0;}4.流程图图1-1单链表基本操作功能模块流程图 4)调试分析前边程序没什么问题,但到了最后发现运算程序的时候程序结果虽然正确,但是程序会出现崩溃现象,经过分析应该是指针存在指向重复的问题,后来发现如果单纯去找问题的所在会很麻烦,也不一定能找出来具体的地方,因为程序本身是没有问题的,所以我遍采用重新开辟空间,讲之前的A和B链表赋给新的空间来避免指针重复的问题5)测试结果下面为部分运算截图单链表的创建 单链表的插入 单链表的删除 单链表的排序 单链表的差运算 单链表的交运算测试程序,进行全面的数据输入,频繁的运行各种运算,人工检验运算的准确度。6)用户使用说明由于我们考虑到用户知识层次的不同,我们做了很贴心的服务,用户只需要按照提示一步步操作即可。7)课设总结通过这周的课程设计,我们对数据结构中单链表的应用有了更深刻的理解,并且使我们深刻认识到时间的重要性,只有理论与实践相结合才能达到很好的学习效果,特别是程序语言的学习,只有将知识运用到实践中,能力才能的发哦提高。在我进行课程设计时,虽然大体上算法是正确的,但是常常会出现一些小的问题,是我们不得不花大量的时间来查找和修改错误。基本上是基本功的问题,一般都是格式上的错误。通过这次课程设计,让我们充分认识到在编写代码的时候,程序书写规范的重要性。并且在做课程设计中也让我们充分认识到数据结构在编写程序方面的重要地位,因此我们希望在以后的学习过程中,能够多多的学习这方面的知识来弥补不足的地方。8)附录(源代码)#include#include#includetypedefstructLnode{intdata;structLnode*next;}*Linklist,Lnode;voidCreatList(Lnode*L)/*建立链表CreastList函数*/{Lnode*p;intvalue;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;}} //单链表的输出voidprintList(Lnode*head){printf("输出的结果如下:\n");Lnode*p=head->next;//头结点赋给Pif(p==NULL){printf("Listisempty!\n");return;}while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");} voidpaixu(Lnode*L)/*排序函数*/{Linklistr,q,small;inttemp;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
++j;
if(!
p||j>i-1)
printf("要插入的位置错误!
");
s=(LNode*)malloc(sizeof(LNode));//给插入的元素开辟空间
s->data=e;//改变指针指向
s->next=p->next;
p->next=s;
//单链表的删除
intListDelete_L(Lnode*L,inti)/*删除函数*/
Lnode*p=L->next;
Lnode*q;
while(p->next&&jnext;++j;}/*找出第i节点,并令p指向其前趋*/
p->next||j>i-1)return0;
q=p->next;
p->next=q->next;
free(q);
return1;
//单链表的差运算
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->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进行差运算,结果为:
printList(C);
C=(Lnode*)malloc(sizeof(Lnode));/*必须再分配一次地址空间以用来把原链表清空,否则每次运行都会使链表元素增加*/
break;
//单链表的交运算
Lnode*d;
d=D=(Lnode*)malloc(sizeof(Lnode));
if(p&&p->data==a->data)
d->next=t;
d=t;
d->next=NULL;
printList(D);
D=(Lnode*)malloc(sizeof(Lnode));
//单链表的并运算
Lnode*e;
e=E=A;//用La的头结点作为Lc的头结点
while(a&&p)
if(a->data<=p->data)//如果pa->data<=pb->data,将pa所指节点链接到pc所指节点之后
e->next=a;
e=a;
else//否则将pb所指节点链接到pc所指节点之后
e->next=p;
e=p;
e->next=a?
a:
p;//插入剩余段
free(B);//释放Lb
printList(E);
E=(Lnode*)malloc(sizeof(Lnode));
//主函数
main()
intsign,sign1,signa,signb,signc,i,x,ca,cb,cc;
intchoice=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));
printf("\t《数据结构课程设计--单链表的基本操作》\n\n");
while(choice)
printf("\t请选择您想进行的操作:
\n1:
对A链表操作\n2:
对B链表操作\n3:
两链表运算\n4:
退出程序\n\n您的选择是:
scanf("%d",&sign1);/*输入选项*/
if(sign1==1)/*如果选择1则输出下列选项界面*/
{L=A;/*选择1对链表A进行操作*/
ca=1;
while(ca)
printf("\t请选择对A链表进行的操作:
建立链表\n2:
对链表排序\n3:
在链表中插入元素\n4:
在链表中删除元素\n5:
返回上一级菜单\n您的选择是:
scanf("%d",&signa);/*输入对链表A的操作选项*/
switch(signa)
case1:
printf("\n请输入链表元素(输入去0结束)\n");
CreatList(A);/*调用CreatList函数*/
PrintList(A);/*调用PrintList函数*/
case2:
printf("对A链表进行排序,结果为:
paixu(A);/*调用排序函数*/
case3:
printf("请输入想要插入的位置及插入的数值(以逗号分隔):
scanf("%d,%d",&i,&x);
if(ListInsert_L(L,i,x)==1)
{printf("修改成功!
目前A链表为:
PrintList(L);}
else
printf("警告!
您输入的插入位置超过链表长度。
case4:
printf("请输入想要删除的元素位置:
scanf("%d",&i);
if(ListDelete_L(L,i)==1)
{printf("删除元素成功!
您输入的删除位置超过链表长度。
case5:
ca=0;
default:
只能选择1-5。
elseif(sign1==2)
{L=B;
cb=1;
while(cb)
{printf("\t请选择对B链表进行的操作:
scanf("%d",&signb);
switch(signb)
printf("\n请输入链表元素(输入0结束)\n");
CreatList(B);
PrintList(B);
printf("对B链表进行排序,结果为:
paixu(B);
目前B链表为:
cb=0;
elseif(sign1==3)
{cc=1;
while(cc)
{printf("\t请选择操作的名称:
显示当前的A、B链表\n2:
进行差运算\n3:
进行交运算\n4:
进行并运算\n5:
scanf("%d",&signc);
switch(signc)
printf("\n当前A");
PrintList(A);
printf("\n当前B");
cc=0;
elseif(sign1==4)
printf("谢谢使用,请按任意键退出!
{printf("提示:
仅能在1-4之间选择!
return0;
4.流程图
图1-1单链表基本操作功能模块流程图
4)调试分析
前边程序没什么问题,但到了最后发现运算程序的时候程序结果虽然正确,但是程序会出现崩溃现象,经过分析应该是指针存在指向重复的问题,后来发现如果单纯去找问题的所在会很麻烦,也不一定能找出来具体的地方,因为程序本身是没有问题的,所以我遍采用重新开辟空间,讲之前的A和B链表赋给新的空间来避免指针重复的问题
5)测试结果
下面为部分运算截图
单链表的创建
单链表的插入
单链表的删除
单链表的排序
单链表的差运算
单链表的交运算
测试程序,进行全面的数据输入,频繁的运行各种运算,人工检验运算的准确度。
6)用户使用说明
由于我们考虑到用户知识层次的不同,我们做了很贴心的服务,用户只需要按照提示一步步操作即可。
7)课设总结
通过这周的课程设计,我们对数据结构中单链表的应用有了更深刻的理解,并且使我们深刻认识到时间的重要性,只有理论与实践相结合才能达到很好的学习效果,特别是程序语言的学习,只有将知识运用到实践中,能力才能的发哦提高。
在我进行课程设计时,虽然大体上算法是正确的,但是常常会出现一些小的问题,是我们不得不花大量的时间来查找和修改错误。
基本上是基本功的问题,一般都是格式上的错误。
通过这次课程设计,让我们充分认识到在编写代码的时候,程序书写规范的重要性。
并且在做课程设计中也让我们充分认识到数据结构在编写程序方面的重要地位,因此我们希望在以后的学习过程中,能够多多的学习这方面的知识来弥补不足的地方。
8)附录(源代码)
#include
typedefstructLnode
{intdata;
structLnode*next;
}*Linklist,Lnode;
voidpaixu(Lnode*L)/*排序函数*/
Linklistr,q,small;inttemp;
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