C语言链表合并:使用尾插法合并两个有序链表
C语言链表合并:使用尾插法合并两个有序链表
问题: 给定两个按学号升序排列的单链表 L1 和 L2,如何将它们合并成一个新的单链表,并保持新的链表仍然按学号升序排列?
解答:
可以使用链表的尾插法将两个链表合并成一个链表。具体实现如下:
// student结构体存储学生信息
typedef struct student{
int num;//学号
char name[10];//姓名
int score;//分数
}ElemType;
// 定义节点
typedef struct LNode{
ElemType data; //数据域
LNode *next; //指针域
}LNode, *LinkList;
LinkList mergeList(LinkList L1, LinkList L2) {
LinkList mergedList = (LinkList)malloc(sizeof(LNode));
LNode *tail = mergedList;
LNode *p1 = L1->next;
LNode *p2 = L2->next;
while (p1 != NULL && p2 != NULL) {
if (p1->data.num <= p2->data.num) {
tail->next = p1;
p1 = p1->next;
} else {
tail->next = p2;
p2 = p2->next;
}
tail = tail->next;
}
if (p1 != NULL) {
tail->next = p1;
}
if (p2 != NULL) {
tail->next = p2;
}
return mergedList;
}
代码说明:
mergedList为合并后的链表的头结点,tail指向合并链表的尾部结点。p1和p2分别指向两个待合并链表的第一个节点。- 循环遍历两个链表,比较
p1和p2指向节点的学号,将学号较小的节点插入到mergedList的尾部,并更新tail和p1或p2指针。 - 当其中一个链表遍历完毕后,将另一个链表剩余的节点全部插入到
mergedList的尾部。 - 最后返回合并后的链表
mergedList。
总结:
通过使用尾插法,可以将两个有序链表合并成一个新的有序链表。此方法简洁易懂,且效率较高。
注意:
此代码示例中的 student 结构体仅包含学号,您可根据实际需求添加其他字段。
希望此代码和解释对您有所帮助!
原文地址: https://www.cveoy.top/t/topic/peQg 著作权归作者所有。请勿转载和采集!