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;
}

代码说明:

  1. mergedList 为合并后的链表的头结点,tail 指向合并链表的尾部结点。
  2. p1p2 分别指向两个待合并链表的第一个节点。
  3. 循环遍历两个链表,比较 p1p2 指向节点的学号,将学号较小的节点插入到 mergedList 的尾部,并更新 tailp1p2 指针。
  4. 当其中一个链表遍历完毕后,将另一个链表剩余的节点全部插入到 mergedList 的尾部。
  5. 最后返回合并后的链表 mergedList

总结:

通过使用尾插法,可以将两个有序链表合并成一个新的有序链表。此方法简洁易懂,且效率较高。

注意:

此代码示例中的 student 结构体仅包含学号,您可根据实际需求添加其他字段。

希望此代码和解释对您有所帮助!

C语言链表合并:使用尾插法合并两个有序链表

原文地址: https://www.cveoy.top/t/topic/peQg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录