参考代码:

#include <stdio.h>
#include <stdlib.h>     //热知识:stdlib库里面包含malloc函数
typedef struct Linklist //初始化链表结构
{
    int id;                //学号
    int score;             //成绩
    struct Linklist *next; //下一个节点的地址
} Linklist;

int main()
{
    void create_a(Linklist * head_a, int n); //函数声明,下同
    void create_b(Linklist * head_b, int m);
    void function1(Linklist * head_a, Linklist * head_b, int n, int m);
    int n, m, i;
    Linklist *head_a, *head_b;
    head_a = (Linklist *)malloc(sizeof(Linklist)); //创建A链表表头
    if (head_a == NULL)                            //此为创建链表失败后出现的提示,可删除,下同
        printf("A头节点创建失败");
    head_b = (Linklist *)malloc(sizeof(Linklist)); //创建B链表表头
    if (head_b == NULL)
        printf("B头节点创建失败");
    scanf("%d %d", &n, &m);          //读取所给的n,m值
    create_a(head_a, n);             //创建链表A
    create_b(head_b, m);             //创建链表B
    function1(head_a, head_b, n, m); //执行筛选、删除重复节点任务
    return 0;
}
void create_a(Linklist *head_a, int n)
{
    int i;
    Linklist *p_a = head_a;                //将p_a的地址初始化为A链表表头的地址
    scanf("%d %d", &p_a->id, &p_a->score); // A链表表头的数据单独赋值
    for (i = 0; i < n - 1; ++i)            //使用尾插法创建单向链表A
    {
        p_a->next = (Linklist *)malloc(sizeof(Linklist));
        p_a = p_a->next;
        p_a->next = NULL;
        if (p_a == NULL)
            printf("节点创建失败");
        scanf("%d %d", &p_a->id, &p_a->score);
    }
}
void create_b(Linklist *head_b, int m)
{
    int i;
    Linklist *p_b = head_b;                //将p_b的地址初始化为B链表表头的地址
    scanf("%d %d", &p_b->id, &p_b->score); // B链表表头表头的数据单独赋值
    for (i = 0; i < m - 1; ++i)            //使用尾插法创建单向链表B
    {
        p_b->next = (Linklist *)malloc(sizeof(Linklist));
        p_b = p_b->next;
        p_b->next = NULL;
        if (p_b == NULL)
            printf("节点创建失败");
        scanf("%d %d", &p_b->id, &p_b->score);
    }
}
void function1(Linklist *head_a, Linklist *head_b, int n, int m)
{
    int i, j, sum = n; // sum为A中还剩的节点数
    Linklist *p_a, *p_b;
    for (i = 0, p_a = head_a; i < n; ++i) //从A链表表头开始遍历所有节点
    {
        for (j = 0, p_b = head_b; j < m; ++j) //从B链表表头开始遍历所有节点
        {
            if (p_a->id == p_b->id) //注意:此为特殊解法,不为通解,当学号可能为0时,需要换种解法
            {                       //当A、B链表节点中的ID值相同时
                p_a->id = 0;        //将A节点的ID赋值为0
                --sum;              // A节点剩余节点数-1
            }
            p_b = p_b->next; //若不相同则进入B链表的下一个节点
        }
        p_a = p_a->next; //当B链表的节点全部遍历完后,进入A链表的下一个节点
    }
    printf("%d\n", sum); //输出A链表的剩余节点数
    for (i = 0, p_a = head_a; i < n; ++i)
    {
        if (p_a->id)                                //通过判断节点的ID值是否为0来决定是否输出
            printf("%d %d\n", p_a->id, p_a->score); //为0则输出
        p_a = p_a->next;                            //不为0则进入下一个节点
    }
}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论