大数据结构课程设计实现两个链表地合并.docx

上传人:b****2 文档编号:1780041 上传时间:2022-10-24 格式:DOCX 页数:11 大小:45.12KB
下载 相关 举报
大数据结构课程设计实现两个链表地合并.docx_第1页
第1页 / 共11页
大数据结构课程设计实现两个链表地合并.docx_第2页
第2页 / 共11页
大数据结构课程设计实现两个链表地合并.docx_第3页
第3页 / 共11页
大数据结构课程设计实现两个链表地合并.docx_第4页
第4页 / 共11页
大数据结构课程设计实现两个链表地合并.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

大数据结构课程设计实现两个链表地合并.docx

《大数据结构课程设计实现两个链表地合并.docx》由会员分享,可在线阅读,更多相关《大数据结构课程设计实现两个链表地合并.docx(11页珍藏版)》请在冰豆网上搜索。

大数据结构课程设计实现两个链表地合并.docx

大数据结构课程设计实现两个链表地合并

一、需求分析:

题目:

实现两个链表的合并

问题描述:

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。

由题目的相关信息可以分析得到:

首先我们需要建立两个链表AB,A链表的元素个数为m;B链表的元素个数为n;在将A\B链表进行合并,更具m和n的大小关系决定链表C的元素顺序;再将C经行直接插入排序得到一个新的链表D;最后输出ABCD的相关信息。

二、算法的流程图

 

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语言的编程,而编程一直对我来说就是一个弱项,我觉的我选的这个题比较基础,自己也有一些思路,但在程序编写过程中还是遇到了不少问题,在开始前,我查阅相关资料,对这次课程谁过程中用到的知识做出了一个系统的归纳:

如链表的建立、链表的合并、直接插入排序以及SWITCH语句等知识点。

但在板鞋程序过程中还是遇到了一些问题。

经过修改、调试、运行然后再修改、调试、运行,有时虽然能运行,但对本次实验来说缺少一定程度的完整性,然后就上网查资料,在书上查看相关方面的知识,当编写的程序感觉符合要求时,在运行时却出现一些小错误导致整个程序无常运行。

最后在同学和老师的帮助下,我终于运行出结果,达到比本次实验的目的。

通过本次实验,我在C语言编程方面又有了一定程度的提高,同时也发现自己的不足,在今后的学习中,我一定会不断学习,努力弥补自己的一些缺点,让自己更优秀。

 

参考文献

耿国华数据结构----C语言描述高等教育

谭浩强C语言课程设计(第2版)清华大学209年

根强数据结构(C++版)(第2版)中国水利水电2009年

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1