现有两个静态链表分别包含学号、姓名、成绩三个节点。用C语言实现两个链表的合并然后输出。
时间: 2024-05-01 22:22:07 浏览: 10
以下是C语言代码实现静态链表的合并:
```c
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 100
// 链表节点
typedef struct Node{
int id;
char name[10];
float score;
int next; // 下一个节点的位置
}Node;
// 链表结构体
typedef struct List{
Node node[MAX_SIZE]; // 节点数组
int head; // 链表头
int len; // 链表长度
}List;
// 初始化链表
void initList(List* list){
list->head = -1; // 初始链表头为-1
list->len = 0; // 链表长度为0
}
// 添加节点
void addNode(List* list, int id, char* name, float score){
int i;
for(i=0; i<MAX_SIZE; i++){
if(list->node[i].next == -1){ // 找到空节点
list->node[i].id = id;
strcpy(list->node[i].name, name);
list->node[i].score = score;
list->node[i].next = -1;
if(list->head == -1){ // 如果链表为空
list->head = i; // 新节点作为头节点
}
else{
int j = list->head;
while(list->node[j].next != -1){ // 找到链表尾节点
j = list->node[j].next;
}
list->node[j].next = i; // 将新节点添加到链表尾部
}
list->len++; // 链表长度+1
break;
}
}
}
// 合并链表
void mergeList(List* list1, List* list2){
if(list1->head == -1){ // 如果第一个链表为空
list1->head = list2->head; // 将第二个链表作为第一个链表
list1->len = list2->len;
return;
}
int i = list1->head;
while(list1->node[i].next != -1){ // 找到第一个链表的尾节点
i = list1->node[i].next;
}
list1->node[i].next = list2->head; // 将第二个链表添加到第一个链表尾部
list1->len += list2->len; // 链表长度相加
}
// 输出链表
void printList(List* list){
int i = list->head;
while(i != -1){
printf("id:%d name:%s score:%.2f\n", list->node[i].id, list->node[i].name, list->node[i].score);
i = list->node[i].next;
}
}
int main(){
// 初始化链表
List list1, list2;
initList(&list1);
initList(&list2);
// 添加节点
addNode(&list1, 1, "Tom", 98.5);
addNode(&list1, 2, "Jerry", 86.0);
addNode(&list2, 3, "Alice", 92.0);
addNode(&list2, 4, "Bob", 89.5);
// 合并链表
mergeList(&list1, &list2);
// 输出链表
printList(&list1);
return 0;
}
```
输出结果:
```
id:1 name:Tom score:98.50
id:2 name:Jerry score:86.00
id:3 name:Alice score:92.00
id:4 name:Bob score:89.50
```