2015年821:有序单链表合并

题目

西北师范大学2015年821:第六题算法设计题(数据结构部分)

Snipaste_2021-08-15_16-22-01

初始代码

1
2
3
4
5
6
typedef struct Inode{
int data;
struct Inode *next;
}Inode, *lklist;

void mergelklist(lklist &la,lklist &lb,lklist &lc)

我的笨方法

解题关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void mergelklist(lklist &la,lklist &lb,lklist &lc){
while(la!=NULL&&lb!=NULL){
if(la->data < lb->data){
LinkListAdd(lc, la->data);
la = la->next;
}else{
LinkListAdd(lc, lb->data);
lb = lb->next;
}
}
while(la!=NULL){
LinkListAdd(lc, la->data);
la = la->next;
}
while(lb!=NULL){
LinkListAdd(lc, lb->data);
lb = lb->next;
}
}

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct Inode{
int data;
struct Inode *next;
}Inode, *lklist;

//不带头结点
bool InitNullList(lklist &L){
L=NULL; //空表,暂时还没有任何结点。防止脏数据。
return true;
}

void LinkListAdd(lklist &L,int e){
Inode *p=L; //指针p指向当前扫描到的结点

Inode *s = (Inode *)malloc(sizeof(Inode));
s->data = e;
s->next = NULL;

if(p==NULL){
L = s;
return;
}

while(p->next!=NULL){ //循环找到末尾结点
p=p->next;
}
p->next=s;
}

//打印输出单链表
//---------------start-------------------
void LinkListPrint(lklist L){
Inode *p=L; //指针p指向当前扫描到的结点

if(L==NULL){
printf("NULL\n");
return;
}

// while无法输出最后一个结点的值
while(p->next!=NULL){
printf("%d\t",p->data);
p=p->next;
}
// 此处补充输出最后一个结点的值
if(p->next==NULL){
printf("%d\n",p->data);
}
}

void mergelklist(lklist &la,lklist &lb,lklist &lc){
while(la!=NULL&&lb!=NULL){
if(la->data < lb->data){
LinkListAdd(lc, la->data);
la = la->next;
}else{
LinkListAdd(lc, lb->data);
lb = lb->next;
}
}
while(la!=NULL){
LinkListAdd(lc, la->data);
la = la->next;
}
while(lb!=NULL){
LinkListAdd(lc, lb->data);
lb = lb->next;
}
}

main(){
lklist la,lb,lc;

InitNullList(la);
LinkListAdd(la,1);
LinkListAdd(la,3);
LinkListAdd(la,4);
LinkListAdd(la,6);
printf("-----输出la------\n\n");
LinkListPrint(la);

InitNullList(lb);
LinkListAdd(lb,2);
LinkListAdd(lb,5);
LinkListAdd(lb,7);
LinkListAdd(lb,8);
LinkListAdd(lb,9);
printf("-----输出lb------\n\n");
LinkListPrint(lb);

InitNullList(lc);
mergelklist(la,lb,lc);
printf("-----输出合并后的lc------\n");
LinkListPrint(lc);
}

运行结果

Snipaste_2021-08-15_16-30-46