将节点附加到链接列表

时间:2013-10-10 08:15:54

标签: c++

我正在尝试创建一个将节点添加到LinkedList末尾的函数。我知道如何使用循环来做,但我的教授希望它以某种方式完成,我不明白为什么它不起作用。他几乎给了我们所有的代码..

这是他给我们的伪代码:

process append(data) 
  if (not the end)
     next->append(data);

  else
     next=new Node();
     next->data=data;
     next->data = nullptr; 

这就是我想出来的:

struct Node {

int data;
Node* next;


};

struct LinkedList {
  Node* head;

  LinkedList() {head = nullptr;}

 void prepend(int data) {

  if (head == nullptr) {

       Node* tmp = new Node();
       tmp->data=data;
       tmp->next=nullptr;

}

  else  {

    Node* tmp = new Node();
    tmp->data=data;
    tmp->next=head;
    head=tmp;


  }
}

  void append(int data) {

  Node* tmp = head;

     if (tmp->next != nullptr) {

        tmp=tmp->next->append(data);

 }

else {

    tmp->next = new Node();
    tmp->next->data = data;
    tmp->next->next = nullptr;


    }


  }
};





int main()
{
    LinkedList LL = LinkedList();
    LL.prepend(7);
    LL.append(6);
    std::cout << LL.head->data << std::endl;
}

我的前置(添加到LinkedList的开头)工作正常,但是当我尝试这段代码时,我得到了

main.cpp:48:20:错误:'struct Node'没有名为'append'的成员 TMP-&GT;下一步 - &GT;附加(数据);

所以我很确定说next-&gt; append(data)有什么问题,根据我的理解,这应该是递归回调append函数直到它到达nullpointer。我想也许有某种方式可以写它,但我班上的人告诉我下一个&gt;追加(数据)的东西应该工作,所以我想我不确定为什么这不是做任何事情。我尝试在Node结构中编写append函数,但之后它表示head未在范围中声明,我真的只是不知道如何使用它。我对C ++中的类/结构也有点新意,所以我假设它是我不理解的东西。

5 个答案:

答案 0 :(得分:2)

Node没有任何名为append的方法,因此您收到错误消息:

tmp->next->append(data);
           ^^^^^^^^^^^^^

struct Node {

int data;
Node* next;

};

要将节点附加到链接列表,您在append中不需要Node方法。删除它。更正LinkedList::append中的追加流程:

void append(int data) {

 Node* tmp = head;

 while (tmp->next)
     tmp = tmp->next;


  tmp->next = new Node();
  tmp->next->data = data;
  tmp->next->next = nullptr;
}

我没有测试,但你需要像上面的代码一样。首先,它尝试访问列表的末尾。然后它附加一个节点。


递归实施:

void append(int data) {

   append(data, head);
}

void append(int data, Node *node) {

   if (node->next)
       append(data, node->next);
   else {
    tmp->next = new Node();
    tmp->next->data = data;
    tmp->next->next = nullptr;
  }
}

答案 1 :(得分:0)

您的追加方法未在结构节点上定​​义。相反,它在LinkedList类上定义,因此您需要相应地调用它。您可以重新定义append方法以将节点作为参数或向Struct节点本身添加append方法。此外,无需将附加结果分配给tmp =

您的追加方法无效。

答案 2 :(得分:0)

喜欢这个

struct Node
{
    void append(int data)
    {
        if (next)
            next->append(data);
        else
        {
            next = new Node();
            next->data = data;
            next->next= nullptr;
        }
    }
    int data;
    Node* next;
};

从伪代码next->append(data);可以清楚地看出,追加是Node的成员。

以下是您使用Node::append

中的LinkedList::append的方式
class LinkedList {
    void append(int data) {
        if (head == nullptr) {
            head = new Node();
            head->data=data;
            head->next=nullptr;
        }
        else {
            head->append(data);
        }
    }
}

答案 3 :(得分:0)

tmp-&gt; next是一个Node,所以要调用append函数,你必须在Node struct中声明它

答案 4 :(得分:0)

节点结构不包含任何追加方法。 此外,您正在分割可以在一种方法中完成两种方法的工作,编写更多代码。

使用我写的工作代码

,在这里查看我对另一个问题的回答

https://stackoverflow.com/a/37358192/6341507

如您所见,我在方法中解决所有问题

AddItem(int i)

我开始看到创建链表我对很多人来说很有用,所以我会在那里进一步编辑我的答案以提供更多信息。

祝你好运!