我正在尝试实现在插入节点时正在排序的链接列表。
我为Node定义了两个结构,另一个保存了列表的头尾
struct Node{
Node *prev;
Node *next;
int value;
};
struct List{
Node *head = nullptr;
Node *tail = nullptr;
};
我已定义了函数,它将插入节点作为head和tail(如果list为空)
void insertFirst(Node *&head,Node *&tail, int value ){
Node *tmp = new Node;
tmp -> prev = nullptr;
tmp -> next = nullptr;
tmp -> value = value;
head = tmp;
tail = tmp;
};
然后我定义了一个函数,它找到了一个(index - 1)它应该被放置的位置。 所以它返回放置节点的索引之前的元素。
Node &findIndex(Node *tail ,int value){
while(1){
if( tail -> value > value){
if( tail -> prev != nullptr)
tail = tail -> prev;
else
return *tail;
}else{
return *tail;
}
}
}
和在其位置插入元素的功能
void InsertAfter(Node *&x,int value){
Node *tmp = new Node;
tmp -> value = value;
tmp -> next = x -> next;
tmp -> prev = x;
x -> next -> prev = tmp;
x -> next = tmp;
}
我都调用了一个函数
void InsertNode(Node *&head, Node *&tail , int value){
if( head == nullptr){
insertFirst(head,tail,value);
}else{
InsertAfter(findIndex(tail,value),value);
}
}
和ofc main
List list;
InsertNode(list.head,list.tail,5);
InsertNode(list.head,list.tail,5);
InsertNode(list.head,list.tail,5);
Node *x = list.head;
while(x!=nullptr){
cout << x-> value << endl;
x = x->next;
}
但我一直收到错误
类型&#39;节点*&amp;&#39;的引用无效初始化从表达 类型&#39; Node&#39; |
这是什么意思? fintIndex的返回类型是对指针的引用,insertNode函数的参数也是如此。
答案 0 :(得分:1)
我仔细研究了代码。
首先,调整findIndex()
:
Node * findIndex(Node *tail ,int value) { // pass tail by value
// traverse to find the right index as it does
return tail; // return what tail points to
}
findIndex()
将返回指向即某些Node
的尾部。 InsertAfter()
将使用Node
作为参数,而不是指向Node 的指针。在这里,Node
通过引用传递。
void InsertAfter(Node *x, int value) {
// the same
}
我希望这会有所帮助。抱歉,我无法通过从findIndex()
返回指向的指针找不到解决方案。我正在关注这个问题并希望有人能得到更好的解决方案。
答案 1 :(得分:0)
FindIndex返回对Node的引用,但InsertAfter引用指向Node的指针。
答案 2 :(得分:0)
此错误:
“Node *&amp;”类型的引用无效初始化来自'Node'|
类型的表达式
表示您在代码中的某个位置将Node
类型的变量分配给Node*&
类型的变量,例如:
struct Node{};
Node node;
foo(node); // this is wrong and produces
// error: invalid initialization of reference of type 'Node*&' from expression of type 'Node'
Node* pnode = &node;
foo(pnode); // this is ok!
[编辑]
第二次看你的代码之后,我建议你把所有参数引用到指针:*&
看下面的固定代码。这适用于您的测试场景,我不确定它是否会在其他情况下失败:
http://coliru.stacked-crooked.com/a/45b3589d716da18a
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Node{
Node *prev;
Node *next;
int value;
};
struct List{
Node *head = nullptr;
Node *tail = nullptr;
};
void insertFirst(Node *&head,Node *&tail, int value ){
Node *tmp = new Node;
tmp -> prev = nullptr;
tmp -> next = nullptr;
tmp -> value = value;
head = tmp;
tail = tmp;
}
Node*& findIndex(Node*& tail ,int value){
while(1){
if( tail -> value > value){
if( tail -> prev != nullptr)
tail = tail -> prev;
else
return tail;
}else{
return tail;
}
}
}
void InsertAfter(Node *&x,int value){
Node *tmp = new Node;
tmp -> value = value;
tmp -> next = x -> next;
tmp -> prev = x;
// SO !!! - below two line order was changed
x->next = tmp;
x->next->prev = tmp;
}
void InsertNode(Node *&head, Node *&tail , int value){
if( head == nullptr){
insertFirst(head,tail,value);
}else{
InsertAfter(findIndex(tail,value),value);
}
}
int main()
{
List list;
InsertNode(list.head,list.tail,5);
InsertNode(list.head,list.tail,5);
InsertNode(list.head,list.tail,5);
Node *x = list.head;
while(x!=nullptr){
cout << x-> value << endl;
x = x->next;
}
}