程序功能:输入若干个学生成绩(输入-1为结束标志),建立两个已按升序排序的单向链表,头指针分别为list1、list2,把两个链表拼成一个升序排序的新链表,并输出新链表信息。要求自定义函数,实现将两个链表拼成一个链表,并返回拼组后的新链表。用C语言写
时间: 2023-05-27 15:02:55 浏览: 136
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node *next;
} Node;
// 自定义函数,将两个链表拼成一个链表
Node *merge(Node *list1, Node *list2) {
Node *newList = NULL; // 新链表的头结点
Node *p = NULL; // 新链表的当前结点
// 如果其中一个链表为空,则直接把另一个链表接到新链表末尾
if (list1 == NULL) {
return list2;
}
if (list2 == NULL) {
return list1;
}
// 比较链表中的数据,并将较小的数据加入新链表中
while (list1 != NULL && list2 != NULL) {
Node *tmp = (Node *)malloc(sizeof(Node));
if (list1->data <= list2->data) {
tmp->data = list1->data;
list1 = list1->next;
} else {
tmp->data = list2->data;
list2 = list2->next;
}
// 将新节点加入新链表中
if (newList == NULL) {
newList = tmp;
p = tmp;
} else {
p->next = tmp;
p = p->next;
}
}
// 将剩余的链表连接到新链表后面
if (list1 != NULL) {
p->next = list1;
}
if (list2 != NULL) {
p->next = list2;
}
return newList;
}
int main() {
Node *list1 = NULL; // 链表1的头指针
Node *list2 = NULL; // 链表2的头指针
printf("请输入学生成绩,以-1结束:\n");
int score;
scanf("%d", &score);
while (score != -1) {
// 创建新节点
Node *tmp = (Node *)malloc(sizeof(Node));
tmp->data = score;
tmp->next = NULL;
// 将新节点插入链表1中
if (list1 == NULL) {
list1 = tmp;
} else {
Node *p = list1;
while (p->next != NULL) {
p = p->next;
}
p->next = tmp;
}
scanf("%d", &score);
}
printf("请输入学生成绩,以-1结束:\n");
scanf("%d", &score);
while (score != -1) {
// 创建新节点
Node *tmp = (Node *)malloc(sizeof(Node));
tmp->data = score;
tmp->next = NULL;
// 将新节点插入链表2中
if (list2 == NULL) {
list2 = tmp;
} else {
Node *p = list2;
while (p->next != NULL) {
p = p->next;
}
p->next = tmp;
}
scanf("%d", &score);
}
// 将两个链表拼成一个新链表
Node *newList = merge(list1, list2);
// 输出新链表中的数据
printf("新链表中的数据为:\n");
Node *p = newList;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
阅读全文