计算机课 程 设 计 报 告.docx
- 文档编号:25806967
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:17
- 大小:76.17KB
计算机课 程 设 计 报 告.docx
《计算机课 程 设 计 报 告.docx》由会员分享,可在线阅读,更多相关《计算机课 程 设 计 报 告.docx(17页珍藏版)》请在冰豆网上搜索。
计算机课程设计报告
目录
1.设计任务书………………………………………………………………3
1.1题目与要求…………………………………………………………3
1.2涉及知识点…………………………………………………………3
1.3输入输出分析………………………………………………………3
1.4测试数据……………………………………………………………3
2.概要设计…………………………………………………………………4
3.详细设计…………………………………………………………………4
3.1数据类型实现………………………………………………………4
3.2程序伪码……………………………………………………………5
3.3程序主要流程图……………………………………………………12
4.调试分析…………………………………………………………………14
4.1问题分析及回顾……………………………………………………14
4.2设想改进……………………………………………………………14
4.3经验和体会…………………………………………………………14
5.参考文献…………………………………………………………………14
6.致谢………………………………………………………………………14
7.指导教师评语
1、设计任务书
1.1题目与要求
题目:
实现两个链表的合并。
要求:
编一程序将A表和B表归并成一个新的递增有序的单链表C(值相同的元素均保留在C表中),并要求利用原表的空间存放C。
1.2设计知识点
对链表的交叉合并和直接插入排序,指针,链表的删除等。
1.3输入输出分析
输入:
(1)建立两个链表A和B,链表元素个数分别为m和n个。
(2)假设元素分别为(x1,x2,…xm),和(y1,y2,…yn)。
(3)把他们合并成一个单链表D。
输出:
(1)当m>=n时,C=x1,y1,x2,y2,…xn,yn,…xm
n>m时,C=y1,x1,y2,x2,…ym,xm,…yn
输出线性表D.
(2)将D安升序排列,输出单链表C。
1.4测试数据
(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)
2、概要设计
本次课程设计所需要用到的是关于链表的建立、合并以及插入排序的排序算法。
需要建立两个链表,再将其合并成一个安升序排列的单链表C,输出单链表C.
3详细设计
3.1线性表的单链表存储结构
typedefstructnode
{
intdate;
Structnode*next;
}
Node,*linklist;
实现链表的交叉合并
Linklistmergel(linklistA,linklistB)
链表的升序排列
Linklistsort(linklistL)
3.2程序伪码
#include
#include
typedefstructnode//节点定义
{
intdata;
structnode*next;
}node,*linklist;
linklistcreat(linklisthead)//该函数用来创建链表
{
node*r,*s;
inta;
r=(linklist)malloc(sizeof(node));
head=r;
scanf("%d",&a);
while(a!
=0)
{
s=(node*)malloc(sizeof(node));
s->data=a;
r->next=s;
r=s;
printf("pleaseinputadata:
");
scanf("%d",&a);
}
r->next=NULL;
returnhead;
}
intlength(linklistl)//返回L中数据元素个数
{
inti=0;
linklistp;
p=l->next;//p指向第一个结点
while(p)
{
i++;
p=p->next;
}
returni;
}
linklistmergel(linklistA,linklistB)//用于实现链表AB的交叉合并
{
intm,n;
node*p,*q,*s,*t;
linklistD;
p=A->next;
q=B->next;
m=length(A);
n=length(B);
D=A;
if(m { p=B->next; q=A->next; D=B; } while(p&&q) { s=p->next; p->next=q; if(s) { t=p->next; p->next=s; } p=s; q=t; } returnD; } linklistsort(linklistL)//链表内容升序排列 { linklistp,q,min; inttemp; p=L; while(p=p->next) { q=min=p; while(q=q->next) { if(q->data min=q; } if(min! =p) { temp=p->data; p->data=min->data; min->data=temp; } } returnL; } linklistDelete(linklistl,intindex)//删除链表指定位置元素 { linklistp,t; intcx=1;//用于计数 p=l; if(index { while(p&&(cx { t=p; p=p->next; cx++; } t->next=p->next; } else printf("inputindexterror"); returnl; } linklistDelete_element(linklistl,intdata)//删除指定的元素 {linklistp; p=l; if(p->next) { while(p->next->data! =data) { p=p->next; p->next=p->next->next; } else printf("don'tfaindtheelement"); returnl; } linklistdisplay(linklistl)//打印 {linklistp; printf("newlinklist: \n"); p=l->next; while(p) { printf("%d\n",p->data); p=p->next; } returnl; } main() { linklistp,q,A,B,C,D; intindexs; intdatas; charname; intcmd; printf("CreatlinklistA: \n");//创建A链表,并打印 printf("pleaseinputadata: "); A=creat(A); printf("CreatlinklistB: \n");//创建B链表,并打印 printf("pleaseinputadata: "); B=creat(B); D=mergel(A,B);//生成D链表,并打印 printf("linklistD\n"); p=D->next; while(p) { printf("%d\n",p->data); p=p->next; } C=D;//对D进行排序生成C sort(C); printf("linklistC: \n"); q=C->next; while(q) { printf("%d\n",q->data); q=q->next; } printf("\npleaseinput0or1\n");//用1和0判断是按位置删除还是直接删除 元素 scanf("%d",&cmd); if(cmd==0)//位置删除 { printf("pleaseinputlinklistname\n"); fflush(stdin); scanf("%c",&name); printf("\npleaseinputindex\n"); scanf("%d",&indexs); fflush(stdin); if(name=='A') { Delete(A,indexs); display(A); } elseif(name=='B') { Delete(B,indexs); display(B); } elseif(name=='D') { Delete(D,indexs); display(D); } elseif(name=='C') { Delete(C,indexs); display(C); } else printf("nameError"); } elseif(cmd==1)//元素删除 { fflush(stdin);//清除缓冲 printf("pleaseinputlinklistname\n"); //fflush(stdin); scanf("%c",&name); printf("\npleaseinputdatas\n"); scanf("%d",&datas); if(name=='A') { Delete_element(A,datas); display(A); } elseif(name=='B') { Delete_element(B,datas); display(B); } elseif(name=='D') { Delete_element(D,datas); display(D); } elseif(name=='C') { Delete_element(C,datas); display(C); } else printf("name2error"); } else printf("cmdError"); printf("\nOver\n"); getchar(); return0; } 3.3程序主要流程图 cmd=0cmd=1错误输入 正确错误正确错误 Cmd=0 4.调试分析 4.1问题分析及回顾 这两个链表的交叉合并算法用到的死链表的基本操作,定义节点,将链表的简历、计算链表的长度、链表A,B的交叉组合、链表内容生序排列、删除链表指定位置元素、删除指定的元素灯算法。 4.2设想改进 写独立函数,通过主函数调用。 这样就大大精简了主函数的操作。 但主函数中大篇幅的用到了if、else语句,用以指定链表指定结点和指定元素的删除操作,这样就是的本来很精简变的繁琐,降低了程序的质量。 所以有其优点和缺点,但需要不断改进,不断优化程序。 4.3经验和体会 通过本次课程设计,我收获了不少。 这次课程设计我做的是实现两个链表的合并,由于有C语言的编程,而编程一直对我来说就是一个弱项,我觉的我选的这个题比较基础,自己也有一些思路,但在程序编写过程中是遇到了不少问题,在开始前,我查阅相关资料,对这次课程谁过程中用到的知识做出了一个系统的归纳: 如链表的建立、链表的合并、直接插入排序以及SWITCH语句等知识点。 但在编写程序过程中还是遇到了问题。 经过修改、调试、运行然后再修改、调试、运行,有时虽然能运行,但对本次实验来说缺少一定程度的完整性,然后就上网查资料,在书上查看相关方面的知识,当编写的程序感觉符合要求时,在运行时却出现一些小错误导致整个程序无法正常运行。 最后在同学和老师的帮助下终于运行出结果,达到本次试验的目的通过本次实验,我在C语言编程方面又有了一定程度的提高,同时也发现自己的不足,在今后的学习中,我一定会不断学习,努力弥补自己的一些缺点,让自己更优秀。 5.参考文献 耿国华数据结构----C语言描述高等教育出版社 谭浩强C语言课程设计(第2版)清华大学出版社2009年 李根强数据结构(C++版)(第2版)中国水利水电出版社2009年 6.致谢 在此谨对那些无私帮助我的同学以及无私教育我的辛勤的老师及学院领导表示感谢,谢谢你们的帮助。 每一个语句、每一个算法,都来自于你们的无私帮助及辛勤教诲。 7指导教师评语
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机课 计算机