李俊毅


私信TA

用户名:ahdoawhfo

访问量:1430

签 名:

3212052051006

等  级
排  名 1677
经  验 2604
参赛次数 0
文章发表 5
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

参考代码:

#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 人评分

  评论区