解题思路:

1、定义 student 结构体用于存储学生信息,定义 linklist 结构体用于表示链表节点。

2、实现 mergetwolinklist 函数,接收两个链表头节点 heada 和 headb,将两个无序链表合并并返回一个有序链表头节点。

3、实现 getinput 函数用于从输入中获取学生信息并创建链表节点,然后返回该节点的指针。

4、在 main 函数中,先输入 numa 和 numb,表示两个链表的学生数量。

5、使用 getinput 函数依次输入学生信息,并按照学号升序插入到链表 lista 和 listb 中。

6、调用 mergetwolinklist 函数,将 lista 和 listb 两个链表合并成一个有序链表 list3。

7、遍历 list3 链表,输出合并后的有序学生信息



注意事项:注意释放动态分配的内存,避免内存泄漏。
参考代码:

#include <algorithm>

#include <cstdio>

#include <iostream>

using namespace std;


typedef struct {

    int id;

    int grade;

} student;


typedef struct linklist {

    student data;

    struct linklist* next;

} node;


node* mergetwolinklist(node* heada, node* headb) {

    node* dummy = new node;  // 头结点

    dummy->next = NULL;


    node* pa = heada, * pb = headb, * pc = dummy;

    while (pa && pb) {

        if (pa->data.id < pb->data.id) {

            pc->next = pa;

            pa = pa->next;

        } else {

            pc->next = pb;

            pb = pb->next;

        }

        pc = pc->next;

    }

    if (pa) {

        pc->next = pa;

    } else {

        pc->next = pb;

    }

    node* res = dummy->next;

    delete (dummy);

    return res;

}


node* getinput() {

    int id;

    int grade;

    cin >> id >> grade;

    return new node{ {id, grade}, NULL };

}


int main() {

    node* lista = NULL;

    node* listb = NULL;

    int numa, numb;

    scanf("%d %d\n", &numa, &numb);


    student s;

    for (int i = 0; i < numa; i++) {

        cin >> s.id >> s.grade;

        node* newnode = new node{ s, NULL };  // 新结点

        if (!lista || s.id < lista->data.id) {  // 当前结点的学号是否小于头结点的学号

            newnode->next = lista;

            lista = newnode;

        } else {

            node* temp = lista;

            while (temp->next != NULL && temp->next->data.id < s.id)  // 当前结点的下个结点的学号是否小于当前结点的学号

            {

                temp = temp->next;

            }

            newnode->next = temp->next;

            temp->next = newnode;

        }

    }


    for (int i = 0; i < numb; i++) {

        cin >> s.id >> s.grade;

        node* newnode = new node{ s, NULL };  // 新结点

        if (!listb || s.id < listb->data.id) {  // 当前结点的学号是否小于头结点的学号

            newnode->next = listb;

            listb = newnode;

        } else {

            node* temp = listb;

            while (temp->next != NULL && temp->next->data.id < s.id)  // 当前结点的下个结点的学号是否小于当前结点的学号

            {

                temp = temp->next;

            }

            newnode->next = temp->next;

            temp->next = newnode;

        }

    }

    node* list3 = NULL;

    list3 = mergetwolinklist(lista, listb);

    for (node* p = list3; p; p = p->next) {

        cout << p->data.id << " " << p->data.grade << endl;

    }


    // 释放 lista 链表节点的内存

    while (lista) {

        node* temp = lista;

        lista = lista->next;

        delete temp;

    }


    // 释放 listb 链表节点的内存

    while (listb) {

        node* temp = listb;

        listb = listb->next;

        delete temp;

    }


    // 释放 list3 链表节点的内存

    while (list3) {

        node* temp = list3;

        list3 = list3->next;

        delete temp;

    }


    return 0;

}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论