当前位置: 首页 > 知识库问答 >
问题:

c - C语言实现链表并集代码运行报错时什么原因导致的呢?

仲浩旷
2023-04-24

我在用C语言实现链表并集的时候,我的思路是:先将两个链表合并再将合并后的链表排序,最后进行链表去重操作,从而实现链表并集。

//3.5L1和L2并集的实现
LinkList UnionList(LinkList L1, LinkList L2, LinkList R) {
    LinkList P,Sort;
    LinkList p,q;
    P = (LinkList)malloc(sizeof(Node));
    R = mergeList(L1, L2,P);//R时合并后的链表
    Sort = sortLikt(R);//Sort时排序后的链表
    p = Sort;
    q = p->next;
    while (p != NULL && q != NULL) {
        if (p->data == p->next->data) {
            p->next = q->next;
        }
        else {
            p = p->next;
            q = q->next;
        }
    }
    return Sort;
}

上述代码实现的时候无法运行,但是像下面这样写就没问题,为什么代码里不可以定义q = p->next呢?

//3.5L1和L2并集的实现
LinkList UnionList(LinkList L1, LinkList L2, LinkList R) {
    LinkList P,Sort;
    LinkList p,q;
    P = (LinkList)malloc(sizeof(Node));
    R = mergeList(L1, L2,P);//R时合并后的链表
    Sort = sortLikt(R);//Sort时排序后的链表
    p = Sort;
    while (p != NULL && p->next != NULL) {
        if (p->data == p->next->data) {
            p->next = p->next->next;
        }
        else {
            p = p->next;
        }
    }
    return Sort;
}

共有1个答案

韩弘方
2023-04-24

问题主要出现在链表去重部分,你可以參考下面的修改一下:

LinkList UnionList(LinkList L1, LinkList L2, LinkList R) {
    LinkList P, Sort;
    LinkList p, q;
    P = (LinkList)malloc(sizeof(Node));
    R = mergeList(L1, L2, P); // R时合并后的链表
    Sort = sortLikt(R);       // Sort时排序后的链表
    p = Sort;
    q = p->next;
    while (q != NULL) {
        if (p->data == q->data) {
            p->next = q->next;
            free(q);          // 释放被删除节点的内存
            q = p->next;
        } else {
            p = q;
            q = q->next;
        }
    }
    return Sort;
}
 类似资料:
  • C语言快慢链表判断链表是否有环 hasCycle函数while(slow != NULL && fast !=NULL)时会报错 那为什么写成while(slow != NULL && fast->next != NULL)就没问题啊,快慢指针不是当slow和fast相遇的时候,证明链表有环吗?当slow和fast都不为空时,slow向后移动一位,fast移动两位,当他们相遇的时候即链表有环,若s

  • 本文向大家介绍C语言单链表的实现,包括了C语言单链表的实现的使用技巧和注意事项,需要的朋友参考一下 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 链表结构: SList.h SList.cpp Test.cpp 以上内容是小编给大家介绍的C语言单链表的实现代码,希望对大家有所帮助!

  • 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 我的链表合并以及排序的函数(mergeTwoLists)代码是哪里有问题吗,为什么我在VS上运行没报错,leetcode上运行就报错了 效果图片 leetcode报错图片

  • 本文向大家介绍C语言实现链表贪吃蛇,包括了C语言实现链表贪吃蛇的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现贪吃蛇的具体代码,供大家参考,具体内容如下 用C语言链表写的贪吃蛇(程序设计时做的,做的不好大佬勿喷) 借助游戏内容分析贪吃蛇所需的功能主要包括这几块: 1.移动光标模块 2.打印地图模块和基本规则信息 读取最高分文件 3.打印初始蛇模块 打印时给予蛇的初始移动方向

  • 本文向大家介绍C语言实现单链表反转,包括了C语言实现单链表反转的使用技巧和注意事项,需要的朋友参考一下 一、理解指针 看懂链表的结构并不是很难,但是一旦把它和指针混在一起,就很容易让人摸不着头脑。所以,要想写对链表代码,首先就要理解好指针。   有些语言有“指针”的概念,比如 C 语言;有些语言没有指针,取而代之的是“引用”,比如 Java、Python。不管是“指针”还是“引用”,实际上,它们的

  • 本文向大家介绍C语言实现单链表实现方法,包括了C语言实现单链表实现方法的使用技巧和注意事项,需要的朋友参考一下 C语言实现单链表实现方法 链表和我们之前实现过的顺序表一样,都是简单的数据结构,链表分为单向链表、双向链表、循环链表。而单向链表又分为两种实现方法,一种为带头节点的单链表,一种为不带头节点的单链表。我们来具体看看不带头节点的单链表的实现 单链表:它是一种链式存储的线性表,用一组地址任意的