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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

输入两个链表的长度和节点,输出合并后的链表。

算法设计:
使用递归的思想,对于传入的两个链表,比较他们的表头节点,将较小的节点加入到新链表中,然后递归将较小节点所在的链表和另一个链表继续合并,最后返回新链表即可。

实现过程如下:
Step 1:定义链表数据结构
typedef struct Node{
int data;
struct Node* next;
}Node, *List;
Step 2:定义合并函数
List merge(List List1, List List2){ 合并两个链表
if(List1 == NULL) return List2; 如果List1为空,则返回List2
if(List2 == NULL) return List1; 如果List2为空,则返回List1
List newList = NULL; 新链表的表头指针
if(List1->data < List2->data){ 如果List1的表头节点的值小于List2的表头节点的值
newList = List1; 将List1的表头节点作为新链表的表头节点
newList->next = merge(List1->next, List2); 递归将List1的剩余节点和List2继续合并
}
else{ 若List1的表头节点的值大于等于List2的表头节点的值newList = List2; 将List2的表头节点作为新链表的表头节点
newList->next = merge(List1, List2->next); 递归将List2的剩余节点和List1继续合并
}
return newList; 返回已合并的新链表的表头指针
}
Step 3:测试代码
#include<stdio.h>
#include<stdlib.h>
int main(){
int len1, len2, elem;
scanf("%d%d", &len1, &len2);
List List1 = NULL, List2 = NULL, p = NULL;
for(int i = 0; i < len1; i++){ 创建List1 scanf("%d", &elem);
List node = (List)malloc(sizeof(Node));
node->data = elem;
node->next = NULL;
if(List1 == NULL){
List1 = node;
p = List1;
}
else{
p->next = node;
p = p->next;
}
}
for(int i = 0; i < len2; i++){ 创建List2 scanf("%d", &elem);
List node = (List)malloc(sizeof(Node));
node->data = elem;
node->next = NULL;
if(List2 == NULL){
List2 = node;
p = List2;
}
else{
p->next = node;
p = p->next;
}
}
List newList = merge(List1, List2); 合并两个链表p = newList; 输出新链表
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
return 0;
}
示例输入:
3 4
1 5 10
3 6 8 9
示例输出:
1 3 5 6 8 9 10。

相关文档
最新文档