数据结构课程设计 实验报告 心得体会 链表 C语言.docx
《数据结构课程设计 实验报告 心得体会 链表 C语言.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 实验报告 心得体会 链表 C语言.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计实验报告心得体会链表C语言
数
据
结
构
课
程
设
计
设计题目:
两个链表的交叉合并
专业班级:
08软件工程3班
姓名:
xxxxxx
学号:
080107031123
设计时间:
2010/9/25
指导教师:
杨薇薇
一、设计题目
实现两个链表的合并
设计目的
1.掌握线性链表的建立。
2.掌握线性链表的基本操作。
设计内容和要求
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。
4.能删除指定单链表中指定位子和指定值的元素。
二、运行环境(软、硬件环境)
软件环境:
VC++6.0编程软件,运行平台:
Win32
硬件:
普通个人pc机、算法设计的思想
三、算法的流程图
cmd=0cmd=1错误输入
正确错误正确错误
四、算法设计分析
这个两个链表的交叉合并算法主要运用到的是链表的基本操作,定义节点,将链表的创建、计算链表的长度、链表A,B的交叉组合、链表内容升序排列、删除链表指定位置元素、删除指定的元素等算法写成了独立函数,通过主函数调用。
这样就大大精简了主函数的操作。
但主函数中很大篇幅用到了if、else语句,用以指定链表指定结点和指定元素的删除操作,这样就使得本来很精简变得繁琐,降低了程序的质量。
所以其有优点和缺点,但需要不断的改进,不断优化该程序。
五、源代码
程序源代码:
#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;
}
linklistlength(linklistl)//返回L中数据元素个数
{
inti=0;
linklistp=l->next;//p指向第一个结点
while(p)
{
i++;
p=p->next;
}
returni;
}
linklistmergel(linklistA,linklistB)//用于实现链表A,B的交叉组合
{
intm,n;
node*p,*q,*s,*t;
linklistC;
p=A->next;
q=B->next;
m=length(A);
n=length(B);
C=A;
if(m{
p=B->next;
q=A->next;
C=B;
}
while(p&&q)
{
s=p->next;
p->next=q;
if(s)
{
t=q->next;
q->next=s;
}
p=s;
q=t;
}
returnC;
}
linklistsort(linklistL)//链表内容升序排列
{
linklistp,q,min;
inttemp;
p=L;
while(p=p->next)
{
q=min=p;
while(q=q->next){
if(q->datadata)
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);
C=mergel(A,B);//生成C链表,并打印
printf("linklistC\n");
p=C->next;
while(p)
{
printf("%d\n",p->data);
p=p->next;
}
D=C;//对C进行排序生成D
sort(D);
printf("linklistD:
\n");
q=D->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=='C')
{
Delete(C,indexs);
display(C);
}
elseif(name=='D')
{
Delete(D,indexs);
display(D);
}
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=='C')
{
Delete_element(C,datas);
display(C);
}
elseif(name=='D')
{
Delete_element(D,datas);
display(D);
}
else
printf("name2error");
}
else
printf("cmdError");
printf("\nOver\n");
getchar();
return0;
}
六、运行结果分析
截图:
结果分析:
大体来说,该程序都实现了课程设计的算法要求及功能,但还是有很多问题,由于时间问题该算法做得比较粗糙,还不能很好的处理问题,例如,如果想在一次操作完成后还像再次操作,但此时已经结束算法了,需
要重新运行程序再次输入操作才能达到要求,这样很繁琐。
同时还存在一些其他的问题需要改进,程序就是在不断改进中不断完善。
七、收获及体会
这学期开始两周时间是我们自己选题上机的时间,虽然上机时间只有短短两个星期但从中确实学到了不少知识。
数据结构可以说是计算机里一门基础课程,但我觉得我们一低定要把基础学扎实,然而这次短短的上机帮我又重新巩固了C语言知识,让我的水平又一部的提高。
数据结构这是一门纯属于设计的科目,它需用把理论变为上机调试。
它对我们来说具有一定的难度。
它是其它编程语言的一门基本学科。
我选的上机题目是交叉合并两个链表,对这个题目,我觉得很基础。
刚开始调试代码的时候有时就是一个很小的错误,导致整个程序不能运行,然而开始的我还没从暑假的状态转到学习上,每当程序错误时我都非常焦躁,甚至想到了放弃,但我最终找到了状态,一步一步慢慢来,经过无数次的检查程序错误的原因后慢慢懂得了耐心是一个人成功的必然具备的条件!
同时,通过此次课程设计使我了解到,硬件语言必不可缺少,要想成为一个有能力的人,必须懂得硬件基础语言。
在这次课程设计中,虽然不会成功的编写一个完整的程序,但是在看程序的过程中,不断的上网查资料以及翻阅相关书籍,通过不断的模索,测试,发现问题,解决问题和在老师的帮助下一步一步慢慢的正确运行程序,终于完成了这次课程设计,虽然这次课程设计结束了但是总觉得自已懂得的知识很是不足,学无止境,以后还会更加的努力深入的学习。
专业班级:
08软件工程3班
学号:
080107031123
姓名:
彭德伟
2010/9/25