链表的合并 实验报告.docx
《链表的合并 实验报告.docx》由会员分享,可在线阅读,更多相关《链表的合并 实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
链表的合并实验报告
课程设计报告
课程设计题目:
两个链表的合并
专业:
软件工程
班级:
姓名:
学号:
指导教师:
年月日
1.课程设计的目的及要求
2.课程设计的内容(分析和设计)
3.算法流程图
4.详细步骤
5.代码
6.显示结果
7.课程设计的总结
一.课程设计的目的及要求
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)能删除指定单链表中指定位子和指定值的元素。
二.课程设计的内容(分析和设计)
1..分析
由题目的相关信息可以分析得:
首先我们需要建立两个链表AB,A链表的元素个数为m,B链表的元素个数为n;在将A、B链表进行合并,根据m和n的大小关系决定链表C的元素顺序;再将C进行直接插入排序得到一个新的链表D;没次输入完一次链表信息,程序都会对相应的链表进行输入操作以此确保程序输入的数据是你想要输入的数据。
同时当你合并好和排序好后都会进行输出操作。
最后当排序好后你可以指定你所要删除数据的位置来删除你所要删除的数据。
2.设计
本次课程设计所需要用到的是关于链表的建立、合并以及直接插入排序的排序算法。
需要先建立两个链表,再将其合并为一个无序链表,最后对这个无序链表进行直接插入排序并将其输出。
难点在于将AB合并为链表C的操作以及对链表C进行直接插入排序的操作和根据用户的意愿可以对链表进行删除的操作。
三.算法流程图
四.详细步骤
(1)结构体的创建:
structNode
(2)链表的创建:
structNode*create()链表的创建。
(3)链表的输出:
voidprint(structNode*head)功能是对链表进行输出。
(4)链表的合并:
structNode*inter_link(structNode*chain1,inta,structNode*chain2,intb)
算法的功能是实现两个链表的交叉合并,并且可以根据两链表的长短将行不通的插入。
(5)排序:
voidInsertSort(structNode*p,intm)算法的功能是对一合并好的链表进行升序插入排序。
(6)按位删除操作:
structNode*delete_link(structNode*p,inti)。
(7)按值删除操作:
structNode*delete_linkz(structNode*p,inti)。
(8)主函数:
main()函数主要是对算法进行测试。
五.代码
structNode//数据结构定义如下:
{
longintnumber;
structNode*next;
}Node,*linkList;
#include//源程序:
#include
#include
#include
#defineerror0
#definenull1
#defineLsizeof(structNode)
structNode*create(inta)//链表创建函数
{
intn;
structNode*p1,*p2,*head;
head=NULL;
n=0;
p2=p1=(structNode*)malloc(L);//分配内存
scanf("%ld",&p1->number);
while(a)//录入链表信息
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(structNode*)malloc(L);
if(a!
=1)//分配内存
scanf("%ld",&p1->number);
a--;//控制输入的个数
}
p2->next=NULL;
return(head);
}//链表创建函数结束
voidprint(structNode*head)//输出函数
{
structNode*p;
p=head;
printf("数字:
\n");
if(head!
=NULL)
do//循环实现输出
{
printf("%ld",p->number);
printf("");
p=p->next;
}while(p!
=NULL);
printf("\n");
}
//链表的交叉合并算法
structNode*inter_link(structNode*chain1,inta,structNode*chain2,intb){
inttemp;
structNode*head,*p1,*p2,*pos;
/*判断a,b大小并合并*/
if(a>=b){
head=p1=chain1;
p2=chain2;
}else/*b>a*/{
head=p1=chain2;
p2=chain1;
temp=a,a=b,b=temp;/*交换a和b*/
}
/*下面把p1的每个元素插在p2相应元素之前,p1长a,p2长b*/
pos=head;/*此时pos指向p1中的第一个元素*/
while(p2!
=NULL){//漂亮,蛇形插入
p1=p1->next;
pos->next=p2;
pos=p2;
p2=p2->next;
pos->next=p1;
pos=p1;
}
returnhead;
}
//对合并好的链表进行排序
voidInsertSort(structNode*p,intm)//排序函数
{
inti,j,t;
structNode*k;
k=p;
for(i=0;ifor(j=0;jif(p->number>(p->next)->number){
t=p->number;
p->number=(p->next)->number;
(p->next)->number=t;
}
p=p->next;
}
p=k;
}
}
structNode*delete_link(structNode*p,inti)//按位删除
{structNode*q;
intj=0;
while(jnext)
{p=p->next;
j++;
}
if(j==i-1&&p->next)
{
q=p->next;
p->next=q->next;
free(q);
}
elsereturnerror;
}
structNode*delete_linkz(structNode*p,inti)//按值删除
{structNode*q;
structNode*k;
intj=0;
inth=0;
while(p&&p->number!
=i)
p=p->next;
j++;
if(p)
{
while(hnext){
p=p->next;
h++;
}
if(h==j-1&&p->next){
k=p->next;
p->next=k->next;
free(k);
}
}
else
returnerror;
}
//主函数
intmain()//main函数
{
structNode*p1,*p2;
inta;
intb;
inth;
intt;
intm;
printf("请输入第一个链表:
\n");
printf("\n输入链表的长度a:
\n");
scanf("%d",&a);
printf("请输入链表数据:
");
p1=create(a);
printf("\n你刚才输入的第一个链表信息:
\n");
print(p1);
printf("\n请输入第二个链表:
\n");
printf("\n输入链表的长度b:
\n");
scanf("%d",&b);
printf("请输入链表数据:
");
p2=create(b);
printf("\n你刚才输入的第二个链表的信息:
\n");
print(p2);
p1=inter_link(p1,a,p2,b);
h=a+b;
printf("\n合并后的链表\n:
");
print(p1);
InsertSort(p1,h);
printf("\n排序后的链表:
\n");
print(p1);
printf("\n请输入链表中你所要删除数据的所在位置:
\n");
scanf("%d",&t);
delete_link(p1,t);
printf("\n链表删除数据后链表的信息:
\n");
print(p1);
printf("\n请输入你想要删除的数值:
\n");
scanf("%d",&m);
delete_linkz(p1,m);
printf("\n链表删除数据后链表的信息:
\n");
print(p1);
return0;
}六.显示结果
(1)m(2)m>n
3.m=n
4.按位删除操作
5.按值删除
七.课程设计的总结
通过进一周的学习和实践,解决实际问题,让我对链表有了更深的了解,也让我提高了解决实际问题的能力。
在上机的同时改正了自己对某些算法的错误使用,使自己在通过程序解决问题时抓住关键算法,有了算法设计思想和流程图,并用C语言描绘出关键算法。
在运行过程中,用户可输入你所需合并的两个链表,首先输入你所要输入链表的长度再输入链表的数据,完成第一个链表的输入后,按照同样的方法输入第二个链表,每输入完一个链表程序都会执行输出函数voidprint(structNode*head)对链表进行输出,以此让用户可以确认自己输入的数据是否准确。
当用户输入完第二个链表时,程序会先执行structNode*inter_link(structNode*chain1,inta,structNode*chain2,intb)再执行voidInsertSort(structNode*p,intm)来进行合并和排序。
合并之后和排序后又分别会再次执行输出函数,以此输出合并后和排序后的链表数据。
之后相应的按照用户的需要可以删除所要删除的数据。