c语言单链表并集差集


#include 
#include 
#include 
using namespace std;
typedef struct LinkNode
{
    int data;
    struct LinkNode* next;
}LinkNode;
void InitList(LinkNode*& L)
{
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
}
void CreatList(LinkNode*& L, int a[], int n)
{
    LinkNode* p;
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
    for (int i = 0; i < n; i++)
    {
        p = (LinkNode*)malloc(sizeof(LinkNode));
        p->data = a[i];
        p->next = L->next;
        L->next = p;
    }
}
void DisList1(LinkNode* L)
{
    LinkNode* p = NULL;
    if (!L || !L->next)     
        printf("NULL");
    else {
        p = L->next;
        while (p != NULL)
        {
            printf(" %d", p->data);
            p = p->next;
        }
    }
    printf("\n");
}
void sort(LinkNode*& L)
{
    LinkNode* p, * pre, * q;
    if (!L || !L->next)       //修改
        return;               //修改
    p = L->next->next;
    L->next->next = NULL;
    while (p != NULL)
    {
        q = p->next;
        pre = L;
        while (pre->next != NULL && pre->next->data < p->data)
        {
            pre = pre->next;
        }
        p->next = pre->next;
        pre->next = p;
        p = q;
    }
}
void combine(LinkNode *L1,LinkNode *L2)
{
    LinkNode *h,*p,*s;
    LinkNode *L3;
    L3=(LinkNode*)sizeof(LinkNode);
    L3->next=NULL;
    s=L2->next;
    bool flag=false;
    LinkNode *t;
    while(s!=NULL)
    {
        p=L1->next;
        flag=false;
        while(p!=NULL)
        {
            if(s->data==p->data)
            {
                flag=true;
            }
            p=p->next;
        }
        h=L1->next;
        if(flag==false)
        {
            t=(LinkNode*)malloc(sizeof(LinkNode));
            t->next=NULL;
            t->data=s->data;
            t->next=h;
            L3->next=t;
        }
        s=s->next;
    }
    LinkNode *pre;
    sort(*&L3);
    pre=L3->next;
    printf("L3->");
    while(pre!=NULL)
    {
        printf(" %d",pre->data);
        pre=pre->next;
    }
    printf("\n");
}
void ListDelete(LinkNode *&L,int n)
{
    LinkNode *q;
    q=L->next;
    while(q!=NULL)
    {
        LinkNode *p;
        p=q->next;
        if(q->data==n)
        {
            q->next=p->next;
            free(p);
        }
        q=q->next;
    }
}
void cha(LinkNode *L1,LinkNode *L2)
{
    LinkNode *p,*s;
    s=(LinkNode*)sizeof(LinkNode);
    s=L1;
    p=L1->next;
    while(p!=NULL)
{
        LinkNode *q=L2->next;
        while(q!=NULL)
        {
            if(p->data==q->data)
            {
                ListDelete(s,p->data);
                break;
            }
            q=q->next;
        }
        p=p->next;
    }
    printf("L5->");
    DisList1(s);
}

void connect(LinkNode* L1, LinkNode* L2)
{
    LinkNode* L3;
    L3 = (LinkNode*)malloc(sizeof(LinkNode));
    L3->next = NULL;
    LinkNode* s = L3;
    LinkNode* p = L1->next;
    while (p != NULL)
    {
        int flag = 0;
        LinkNode* q = L2->next;
        while (q != NULL)
        {
            if (p->data == q->data)
            {
                flag = 1;
                break;
            }
            q = q->next;
        }
        if (flag == 1)
        {
            LinkNode* pt = (LinkNode*)malloc(sizeof(LinkNode));
            pt->next = NULL;
            pt->data = p->data;
            s->next = pt;
            s = s->next;
        }
        p = p->next;
    }
    printf("L4->");  DisList1(L3);
}
int main()
{
    LinkNode* L1, * L2, * L3;
    int a[100], b[100], ret;
    int m = 0, n = 0;
    while (scanf("%d", &a[m]) == 1 && a[m] != -1) m++;
    while (scanf("%d", &b[n]) == 1 && b[n] != -1) n++;
    CreatList(L1, a, m);
    CreatList(L2, b, n);
    sort(*&L1);
    sort(*&L2);
    printf("L1->");
    DisList1(L1);
    printf("L2->");
    DisList1(L2);
    combine(L1,L2);
    connect(L1, L2);
    cha(L1,L2);

    return 0;
}



请问是哪里错了呀,感觉逻辑没问题呀,差集的函数是cha,并集的函数是combine,请各位神仙帮帮我,真的很着急

在你的代码中,cha 函数中的 s 变量被赋值为 L1,但实际上 L1 是一个链表结构体指针,不应该直接赋值给 s。正确的操作是先创建一个新的链表,然后将 L1 中所有元素复制到新的链表中,最后删除新的链表中与 L2 中相同的元素即可。

以下是修改后的 cha 函数代码:

void cha(LinkNode *L1, LinkNode *L2)
{
    LinkNode *p, *s;
    s = (LinkNode*)malloc(sizeof(LinkNode));
    s->next = NULL;

    // 将 L1 中的所有元素复制到新链表 s 中
    p = L1->next;
    while (p != NULL) {
        LinkNode* node = (LinkNode*)malloc(sizeof(LinkNode));
        node->data = p->data;
        node->next = s->next;
        s->next = node;
        
        p = p->next;
    }

    // 从新链表 s 中删除与 L2 相同的元素
    p = s->next;
    while (p != NULL) {
        LinkNode *q = L2->next;
        while (q != NULL) {
            if (p->data == q->data) {
                ListDelete(s, p->data);
                break;
            }
            q = q->next;
        }
        p = p->next;
    }

    printf("L5->");
    DisList1(s);
}