#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);
}