C++ 两个链表的并集
我正在尝试为两个链接列表的并集开发一个friend函数。编译器不断给我一个错误,说节点未在此范围内声明,以及p,q未在此范围内声明。所以我添加了List::Node,但它仍然没有执行联合C++ 两个链表的并集,c++,C++,我正在尝试为两个链接列表的并集开发一个friend函数。编译器不断给我一个错误,说节点未在此范围内声明,以及p,q未在此范围内声明。所以我添加了List::Node,但它仍然没有执行联合 const List getunion(const List&a, const List&b) { List::Node * p=a.list; List::Node* q=b.list; List result; while (q!=N
const List getunion(const List&a, const List&b) {
List::Node * p=a.list;
List::Node* q=b.list;
List result;
while (q!=NULL && p!=NULL) {
if(q->value==p->value) {
result.insert(q->value);
q=q->next;
p=p->next;
}
q=q->next;
p=p->next;
}
return result;
}
void insert(int x) {
Node* tmp=new Node;
tmp->value=x;
if(list==NULL || list->value >x){
tmp->next=list;
list=tmp;
}
else {
Node *curr=list;
while (curr->next !=NULL && curr->next->value < x) {
curr=curr->next;
}
tmp->next=curr->next;
curr->next=tmp;
}
const List getunion(const List&a、const List&b){
List::Node*p=a.List;
列表::节点*q=b.List;
列出结果;
while(q!=NULL&&p!=NULL){
如果(q->value==p->value){
结果.插入(q->值);
q=q->next;
p=p->next;
}
q=q->next;
p=p->next;
}
返回结果;
}
空白插入(整数x){
Node*tmp=新节点;
tmp->value=x;
if(list==NULL | | list->value>x){
tmp->next=列表;
列表=tmp;
}
否则{
节点*curr=列表;
while(curr->next!=NULL&&curr->next->value下一步;
}
tmp->next=当前->next;
当前->下一步=tmp;
}
请注意,我的insert函数按升序添加节点,我已经尝试过了,它在测试用例中也能工作,当我实现union函数时,事情就误入歧途了…我认为您修复了编译错误,现在您想知道为什么它不工作了 您没有正确合并这两个列表。问题是:
while ( q && p ) {
if( q->value < p->value ) {
result.insert(q->value);
q = q->next;
} else if( q->value > p->value ) {
result.insert(p->value);
p = p->next;
} else {
result.insert(q->value);
q = q->next;
p = p->next;
}
}
另外,请确保您已经为
列表定义了一个复制构造函数。看起来您正在其中进行自己的内存分配,因此必须遵循三个规则。首先,我不确定您编写的代码打算做什么。
似乎您希望输入是两个列表,您可以并行地逐步遍历它们,如果相应的值匹配,则构建第三个列表。
这更像是一个十字路口,而不是一个联盟,尽管它比这更严酷,因为它关心的是位置
插入内容似乎是已排序的插入内容
无论如何,这部分肯定是错误的:
如果(q->value==p->value){
结果.插入(q->值);
q=q->next;
p=p->next;
}
删除这些q=q->next和p=p->next。
这导致了一个双重步骤,因为它是在if语句内部和外部完成的
双击是不好的,因为它会让你越过列表的末尾,导致崩溃。union
在C++oops中是一个保留字,它实际上是getunion,节点是如何声明的?@kotlinski请参阅edit,现在我在list::中添加了这个函数,但实际的函数仍然没有将它们联合起来,因为我希望下次发布整个类时使用它。没有任何一个函数会这样做o偷你的名单
班,注意安全。是的,我把他们弄糊涂了。谢谢
for(; q; q = q->next) result.insert(q->value);
for(; p; p = p->next) result.insert(p->value);