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

我在用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.5k
1 个回答

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

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;
}
推荐问题
logo
Microsoft
子站问答
访问
宣传栏