C语言
已知链表节点信息为学号、姓名、课程成绩。现有两个链表分别包含三个节点。编程实现两个链表的合并然后输出。(静态链表)
这种问题已经被问了无数遍了,动动手搜索下就有
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 50
// 静态链表结构体
typedef struct Student {
char id[10];
char name[20];
int grade;
} Student;
typedef struct Node {
Student data;
int next;
} Node;
Node list[MAXSIZE];
int length = 0;
// 初始化链表
void initList() {
for (int i = 0; i < MAXSIZE; i++) {
list[i].next = -1;
}
}
// 添加节点
int addNode(Student s) {
int index;
for (int i = 0; i < MAXSIZE; i++) {
if (list[i].next == -1) {
index = i;
break;
}
}
list[index].data = s;
list[index].next = length;
length = index;
return index;
}
// 合并两个链表
void mergeList(int head1, int head2) {
int p1 = list[head1].next, p2 = list[head2].next;
int p = addNode(list[p1].data);
while (p1 != -1 && p2 != -1) {
if (list[p1].data.grade > list[p2].data.grade ||
(list[p1].data.grade == list[p2].data.grade && strcmp(list[p1].data.id, list[p2].data.id) < 0)) {
p = addNode(list[p1].data);
p1 = list[p1].next;
} else {
p = addNode(list[p2].data);
p2 = list[p2].next;
}
}
while (p1 != -1) {
p = addNode(list[p1].data);
p1 = list[p1].next;
}
while (p2 != -1) {
p = addNode(list[p2].data);
p2 = list[p2].next;
}
}
// 输出链表
void printList(int head) {
printf("head -> ");
for (int i = list[head].next; i != -1; i = list[i].next) {
printf("[%s, %s, %d] -> ", list[i].data.id, list[i].data.name, list[i].data.grade);
}
printf("NULL\n");
}
int main() {
Student s1 = {"1001", "Tom", 90};
Student s2 = {"1002", "Jerry", 80};
Student s3 = {"1003", "Jack", 70};
Student s4 = {"1004", "Lily", 85};
Student s5 = {"1005", "Lucy", 95};
Student s6 = {"1006", "Bob", 75};
initList();
addNode(s1);
addNode(s2);
addNode(s3);
int head1 = length;
initList();
addNode(s4);
addNode(s5);
addNode(s6);
int head2 = length;
mergeList(head1, head2);
printf("The merged list is: ");
printList(length);
return 0;
}