问题描述:设两单链表A、B按data值(设为整型)递增有序,将表A和B合并成一表A,且表A也按data值递增有序。
算法思路:
设指针p、q分别指向表A和B中的结点,若p->data ≤q->data则p结点进入结果表,否则q结点进入结果表。
代码实现:
实现一个功能函数需要三个文件(三个文件在同一目录)。
linklist.h(定义顺序表)
linklist.c(实现接口函数)
test.c(主函数实现)
注:以下函数功能都是在之前发布的完整代码基础上增加函数,故下面代码只放增加的函数代码,其余多余代码不再赘述,其余代码可看往期发布的链表内容。
linklist.h
主要添加定义链表倒置函数int list_merge(linklist H1, linklist H2);
//链表归并
int list_merge(linklist H1, linklist H2);
linklist.c
主要实现链表合并函数int list_merge(linklist H1, linklist H2);
int list_merge(linklist H1, linklist H2){
linklist p, q, r;
if (H1 == NULL || H2 == NULL){
printf("H1 || H2 is NULL\n");
return -1;
}
p = H1->next;
q = H2->next;
r = H1;
H1->next = NULL;
H2->next = NULL;
while (p && q){
if (p->data <= q->data){
r->next = p;
p = p->next;
r = r->next;
r->next = NULL;
}
else{
r->next = q;
q = q->next;
r = r->next;
r->next = NULL;
}
}
if (p == NULL) {
r->next = q;
}else {
r->next = p;
}
return 0;
return 0;
}
test.c
主函数程序:首先创建两个链表H1,H2,将数组a数组b中的元素通过尾部插入函数list_tail_insert();插入H1和H2,最后通过int list_merge(linklist H1, linklist H2);将H1和H2合并。
#include <stdio.h>
#include "linklist.h"
void test_get();
void test_insert();
void test_delete();
void test_reverse();
void test_adjmax();
int main(int argc, const char *argv[]) {
linklist H1, H2;
int a[] = {1, 4, 6, 8,10};
int b[] = {2, 4, 16, 18,30};
int i;
H1 = list_create();
if (H1 == NULL){
return -1;
}
H2 = list_create();
if (H1 == NULL){
return -1;
}
for (i = 0; i < sizeof(a)/sizeof(int); i++){
list_tail_insert(H1, a[i]);
}
for (i = 0; i < sizeof(a)/sizeof(int); i++){
list_tail_insert(H2, b[i]);
}
list_show(H1);
list_show(H2);
list_merge(H1, H2);
printf("merge:\n");
list_show(H1);
list_show(H2);
list_free(H1);
list_free(H2);
return 0;
}
Clion编译运行
想要用Clion编译运行上述三个文件,需要创建一个CMakeLists.txt文件,文件内容如下:
运行结果:
有上述结果可知,两链表实现了合并操作。