作业帮 > 综合 > 作业

链表实现集合交并差//求交集函数Node* qiujiaoji(Node *h1,Node *h2){//h为交集所在链

来源:学生作业帮 编辑:搜搜做题作业网作业帮 分类:综合作业 时间:2024/05/17 09:38:56
链表实现集合交并差
//求交集函数
Node* qiujiaoji(Node *h1,Node *h2)
{
//h为交集所在链表的头指针
Node *h=new Node;
Node *p=h,*q; //p,q为交集中移动的指针
Node *p1=h1,*p2=h2; //p1,p2为两个集合中移动的指针
//找出相同的元素加入
while(p1!=NULL)
{
p2=h2;
while(p2!=NULL)
{
if(p1->content==p2->content)
{
p->content=p1->content;
p->next=new Node;
q=p;
p=p->next;
}
p2=p2->next;
}
p1=p1->next;
}
q->next=NULL;
delete p;
return h;
}
//求并集函数
Node* qiubingji(Node *h1,Node *h2)
{
//h为并集所在链表的头指针
Node *h=new Node;
Node *p=h,*q; //p,q为并集中移动的指针
Node *p1=h1,*p2=h2; //p1,p2为两个集合中移动的指针
//把第一个集合复制到并集中
while(p1!=NULL)
{
p->content=p1->content;
p->next=new Node;
q=p;
p=p->next;
p1=p1->next;
}
//找出第二个集合中不包含在第一个集合内的元素补充进去
while(p2!=NULL)
{
p1=h1;
while(p1!=NULL)
{
if(p2->content!=p1->content)
{
p->content=p2->content;
p->next=new Node;
q=p;
p=p->next;
p2=p2->next;
}
p1=p1->next;
}
p2=p2->next;
}
q->next=NULL;
delete p;
return h;
}
//求第一个集合/第二个集合的函数
Node* qiuchaji_A_and_B(Node *h1,Node *h2)
{
//h为差集所在链表的头指针
Node *h=new Node;
Node *p=h,*q; //p,q为差集中移动的指针
Node *p1=h1,*p2=h2; //p1,p2为两个集合中移动的指针
//把第一个集合复制到差集中
while(p1!=NULL)
{
p->content=p1->content;
p->next=new Node;
q=p;
p=p->next;
p1=p1->next;
}
q->next=NULL;
delete p;
//把第二个集合中出现的元素删除
p=h;
while(p->next!=NULL)
{
p2=h2;
while(p2!=NULL)
{
if(p==h && p->content==p2->content)
{
q=p;
h=h->next;
p=p->next;
delete q;
}
else if(p->next->content==p2->content)
{
q=p->next;
p->next=q->next;
p=p->next;
delete q;
}
p2=p2->next;
}
}
return h;
}
——————————————————————————
三个函数都运行不起来 好像是什么访问到了不对的内存空间 但我找不出来哪错了.
链表实现集合交并差//求交集函数Node* qiujiaoji(Node *h1,Node *h2){//h为交集所在链
从思路上看,
交集的函数是对的,但并集和差集的做法不对.
并集函数中,先把h1的队列复制过去是对的,但要把h2中不存在h1的元素补充进去时,每拿出一个h2的元素,需要遍历所有h1的元素,然后才能决定是否放进结果集,不能一有不同就放.
差集的错误与并集类似

还有一个小的建议,
先创建头结点 Node *h=new Node; 这种做法不错,
但在添加新节点时,用下面的顺序可以更方便
p->next = new Node;
p = p->next;
p->content=p1->content;
p->next = NULL;
在最后,把头结点删掉就行
p = h->next;
delete h;
return p;
再问: 谢谢。。成功了。。但是之前完全运行不起来原来是main函数有地方写错了。。。