链表的合并 实验报告材料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程设计题目:两个链表的合并
专业:软件工程
班级:
姓名:
学号:
指导教师:
年月日
目录
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, (x)
当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)结构体的创建:struct Node
(2)链表的创建:struct Node *create()链表的创建。
(3)链表的输出:void print(struct Node *head)功能是对链表进行输出。
(4)链表的合并:struct Node * inter_link(struct Node * chain1, int a, struct Node *
chain2, int b)
算法的功能是实现两个链表的交叉合并,并且可以根据两链表的长短将行不通的插入。
(5)排序:void InsertSort(struct Node *p,int m)算法的功能是对一合并好的链表进行升
序插入排序。
(6)按位删除操作:struct Node * delete_link(struct Node *p,int i)。
(7)按值删除操作:struct Node * delete_linkz(struct Node *p,int i)。
(8)主函数:main()函数主要是对算法进行测试。
五.代码
struct Node //数据结构定义如下:
{
long int number;
struct Node *next;
}Node,*linkList;
#include
#include
#include
#include
#define error 0
#define null 1
#define L sizeof(struct Node)
struct Node *create(int a)//链表创建函数
{
int n;
struct Node *p1, *p2, *head;
head = NULL;
n = 0;
p2 = p1 = (struct Node *) malloc(L); //分配存scanf("%ld", &p1->number);
while (a)//录入链表信息
{
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct Node *) malloc(L);
if (a != 1)//分配存
scanf("%ld", &p1->number);
a--; //控制输入的个数
}
p2->next = NULL;
return (head);
}//链表创建函数结束
void print(struct Node *head)//输出函数
{
struct Node *p;
p = head;
printf("数字:\n");
if (head != NULL)
do//循环实现输出
{
printf("%ld", p->number);
printf(" ");
p = p->next;
} while (p != NULL);
printf("\n");
}
//链表的交叉合并算法
struct Node * inter_link(struct Node * chain1, int a, struct Node * chain2, int b) { int temp;
struct Node *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;
}
return head;
}
//对合并好的链表进行排序
void InsertSort(struct Node *p, int m)//排序函数
{