返回对象的引用

时间:2016-03-18 16:27:11

标签: c++

我正在尝试实现在插入节点时正在排序的链接列表。

我为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函数的参数也是如此。

3 个答案:

答案 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;
    }
}