数据结构课程设计.docx
- 文档编号:3190316
- 上传时间:2022-11-19
- 格式:DOCX
- 页数:9
- 大小:17.45KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
目录
一、问题描述1
二、测试数据1
三、算法思想1
四、模块划分1
五、数据结构2
六、源程序2
七、测试情况7
八、设计体会及今后的改进意见8
参考文献9
一、问题描述
(1)建立两个链表A和B,链表元素个数分别为m和n个。
(2)假设元素分别为(x1,x2,…xm),和(y1,y2,…yn)。
把它们合并成一个线性表C,使得:
当m>=n时,C=x1,y1,x2,y2,…xn,yn,…,xm
当n>m时,C=y1,x1,y2,x2,…ym,xm,…,yn
输出线性表C。
(3)用直接插入排序法对C进行升序排序,生成链表D,并输出链表D。
二、测试数据
(1)A表(30,41,15,12,56,80)
B表(23,56,78,23,12,33,79,90,55)
(2)A表(30,41,15,12,56,80,23,12,34)
B表(23,56,78,23,12)
三、算法思想
Merge()函数是实现问题要求的主要函数,其算法思想是:
利用需要合并的链表LA和LB中的结点空间来建立新的链表LC,通过更改结点的next域来重建新的元素之间的线性关系。
同时为保证链表LC中元素之间的顺序不发生变化,所以利用尾插入法建立单链表的方法。
首先对链表LC进行初始化,然后比较链表LA和链表LB的长度,如果lengtha不小于lengthb,则依次在链表LC中插入LA的第一个结点、LB的第一个结点、LA的第二个结点、LB的第二个结点……当LB中的结点全部插入LC后,再把LA中剩余的结点插入LC;如果lengtha小于lengthb则正好相反。
四、模块划分
(1)带头结点的单链表抽象数据类型LinearList,其中包括基本操作的函数有:
建立链表操作函数、两个链表的合并操作函数、链表排序操作函数和链表输出操作函数。
该抽象数据类型文件名为LinearList.h。
(2)voidCreateList(LinkListL,intlength),其功能是采用尾差法建立长度为length的链表。
(3)voidCreateeList(LinkListL,intlength),其功能是采用尾差法建立长度为length的链表(不定义结点的数值)。
(4)LinkListMerge(LinkListLA,intlengtha,LinkListLB,intlengthb),其功能是实现两个链表的合并。
(5)LinkListList(LinkListLC,intlengthc),其功能是实现链表的排序。
(6)voidPrintList(LinkListL),其功能是实现链表的输出。
(7)voidmain(),主函数,其功能是建立链表LA和LB,调用以上函数以实现链表的合并和排序。
五、数据结构
(1)带头结点单链表抽象数据类型LinearList。
(2)带头结点单链表抽象数据类型的结点结构定义如下:
typedefstructNode
{
intdata;
structNode*next;
}Node,*LinkList;
六、源程序
源程序存放在两个文件中,文件LinearList.h是带头结点单链表抽象数据类型,文件Run.c是主程序。
文件LinearList.h:
#include"stdio.h"
#include"malloc.h"
#defineNULL0
#defineMAX100
typedefstructNode//链表的存储结构描述
{
intdata;
structNode*next;
}Node,*LinkList;
voidCreateList(LinkListL,intlength)//采用尾差法建立长度为length的链表
{
Node*r,*s;
intx;//接收输入的结点数值
inti=0;//设置结束标志,初值为0,当输入结点个数为length时,建表结束
r=L;
while(i { scanf("%d",&x); s=(Node*)malloc(sizeof(Node)); s->data=x; r->next=s; r=s; i++; } r->next=NULL; } voidCreateeList(LinkListL,intlength)//采用尾差法建立长度为length的链表(不定义结点的数值) { Node*r,*s; inti=0;//设置结束标志,初值为0,当输入结点个数为length时,建表结束 r=L; while(i { s=(Node*)malloc(sizeof(Node)); r->next=s; r=s; i++; } r->next=NULL; } LinkListMerge(LinkListLA,intlengtha,LinkListLB,intlengthb)//两个链表的合并函数 { Node*pa,*pb,*r; LinkListLC; pa=LA->next; pb=LB->next; LC=(LinkList)malloc(sizeof(Node)); LC->next=NULL;r=LC;//初始化操作 if(lengtha>=lengthb) { while(pa! =NULL&&pb! =NULL) { r->next=pa;r=pa;pa=pa->next; r->next=pb;r=pb;pb=pb->next; } r->next=pa; } else { while(pa! =NULL&&pb! =NULL) { r->next=pb;r=pb;pb=pb->next; r->next=pa;r=pa;pa=pa->next; } r->next=pb; } returnLC; } LinkListList(LinkListLC,intlengthc)//链表排序函数 { inttemp,i,j; intr[MAX+1]; Node*s; LinkListLD; LD=(LinkList)malloc(sizeof(Node)); LD->next=NULL; CreateeList(LD,lengthc); s=LC->next; for(i=1;i<=lengthc;i++) { r[i]=s->data; s=s->next; } for(i=2;i<=lengthc;i++) { r[0]=r[i];j=i-1; while(r[0] { r[j+1]=r[j];j=j-1; } r[j+1]=r[0]; } s=LD->next; for(i=1;i<=lengthc;i++) { s->data=r[i]; s=s->next; } returnLD; } voidPrintList(LinkListL)//链表输出函数 { Node*r; r=L; while(r->next! =NULL) { r=r->next; printf("%d",r->data); } printf("\n"); } 文件Run.c: #include"stdio.h" #include"LinearList.h" voidmain()//主函数 { intlengtha,lengthb; LinkListLA,LB,LC,LD; LA=(LinkList)malloc(sizeof(Node));//读入链表A LA->next=NULL; printf("请输入链表A的元素个数: "); scanf("%d",&lengtha); printf("请依次输入链表A的元素: \n"); CreateList(LA,lengtha); LB=(LinkList)malloc(sizeof(Node));//读入链表B LB->next=NULL; printf("请输入链表B的元素个数: "); scanf("%d",&lengthb); printf("请依次输入链表B的元素: \n"); CreateList(LB,lengthb); LC=Merge(LA,lengtha,LB,lengthb);//合并链表A和链表B printf("将链表A和链表B合并,得链表C为: \n"); PrintList(LC); LD=List(LC,lengtha+lengthb);//升序排列链表C printf("将链表C按升序排序,得链表D为: \n"); PrintList(LD); } 七、测试情况 测试数据 (1)的程序输出为: 请输入链表A的元素个数: 6 请依次输入链表A的元素: 304115125680 请输入链表B的元素个数: 9 请依次输入链表B的元素: 235678231233799055 将链表A和链表B合并,得链表C为: 233056417815231212563380799055 将链表C按升序排序,得链表D为: 121215232330334155565678798090 Pressanykeytocontinue 测试数据 (2)的程序输出为: 请输入链表A的元素个数: 9 请依次输入链表A的元素: 304115125680231234 请输入链表B的元素个数: 5 请依次输入链表B的元素: 2356782312 将链表A和链表B合并,得链表C为: 3023415615781223561280231234 将链表C按升序排序,得链表D为: 1212121523232330344156567880 Pressanykeytocontinue 八、设计体会及今后的改进意见 通过这次课程设计,我对数据结构中链表方面的知识掌握地更加熟练,包括单链表抽象数据类型的定义,用尾插入法建立链表,以及通过一系列的单链表插入操作实现两个链表的合并和链表的排序。 同时,对直接插入排序算法的算法思想有了进一步的理解。 此外,这也提升了自己用C语言来解决实际问题的能力,对所学到的知识达到活学活用。 同时,也要认识到自己的不足之处: 在实现链表的排序时,由于链表定义的是单链表,在进行直接插入排序时,时间复杂度很大,所以我是先将链表转化为数组,对数组进行排序后再转化为链表。 如果把链表定义为双向链表,则可以实现程序的优化。 参考文献 [1]耿国华编著.《数据结构: C语言描述》.北京: 高等教育出版社,2005.7 [2]王国军,唐国民编著.《数据结构实验教程(C语言版)》.北京: 清华大学出版社,2009.9
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)