两个链表的并集
Union of two linked lists
我正在尝试为两个链表的并集开发一个友元函数。编译器一直给我一个错误,说Node没有在这个作用域中声明,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!=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;
}
请注意,我的插入函数按升序添加节点,我已经尝试过了,它确实适用于测试用例,当我实现并集函数时,事情就会误入歧途。。。
我认为您修复了编译错误,现在您想知道为什么它不起作用。
您没有正确合并这两个列表。问题是:
-
只有在两个列表中都有一个项时,才能插入该项-这是交集,而不是并集。
-
你同时推进两个指针。
你需要合并其中一个:
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;
}
}
现在,一旦这些列表指针中的任何一个到达末尾,您仍然需要添加另一个的剩余元素。这将发挥作用:
for(; q; q = q->next) result.insert(q->value);
for(; p; p = p->next) result.insert(p->value);
还要确保您已经为List
定义了一个复制构造函数。看起来你在那里做你自己的内存分配,所以你必须遵循三条规则。
首先,我不确定您的代码要做什么。您似乎希望输入是两个列表,并行地逐步通过,如果相应的值匹配,则构建第三个列表。这更像是一个交叉点,而不是一个联盟,尽管它更严厉,因为它关心立场。
插入似乎是一个排序的插入。
无论如何,这部分肯定是错误的:
if(q->值==p->值){result.insert(q->值);q=q->下一个;p=p->下一个;}
移除这些q=q->next和p=p->next。这导致了一个双重步骤,因为它是在if语句内部和外部完成的。
双击是不好的,因为它会让你超过列表的末尾,导致崩溃。
相关文章:
- 如何使用模板元编程在自由函数C++链接两个不相关的类
- 链接两个使用 c++ 构建的库_static
- 当我链接两个静态C++库时,我可以在两个主函数库中有两个主要功能吗?
- 在链接到两个 exe 的 dll 中共享全局变量
- 如何链接两个LLVM位码模块?
- 在没有额外代码的情况下链接两个独立类的最通用方法是什么?
- 在 Linux 上的 Visual Studio 中链接两个项目
- 在同一C++项目中链接两个不同版本的 protobuf 库
- 如何链接两个ArUco标记的姿势
- CMakeLists配置以链接两个C++项目
- 如何静态链接到两个版本的 xerces-c(或任何与此相关的库)
- Xcode 不链接两个结构
- 如何在 C/C++ 中链接两个 .so
- 链接两个具有相同函数签名的强函数符号的结果使用 G++ 以及原因
- 在 Visual Studio 解决方案中链接两个项目
- 链接两个枚举类型成员
- OpenGL - 链接两个纹理不起作用
- 我如何使用cmake链接两个库到我的程序
- 当链接到两个第三方共享库时,c++程序崩溃
- 在链接两个对象文件时,使用#ifndef防止定义一个函数两次