0

我正在尝试创建一个将节点添加到 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:错误:“结构节点”没有名为“附加”的成员 tmp->next->append(data);

所以我很确定说 next->append(data) 有问题,据我了解,它应该递归地回调 append 函数,直到它到达一个空指针。我在想也许有某种方法可以编写它,但是我班上的人告诉我 next->append(data) 应该起作用,所以我想我不确定为什么这不起作用任何事物。我尝试在 Node 结构中编写 append 函数,但是它说 head 没有在作用域中声明,我真的不知道如何使用它。我对 C++ 中的类/结构也有点陌生,所以我假设这是我不理解的东西。

4

5 回答 5

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;
  }
}
于 2013-10-10T08:18:44.033 回答
0

您的 append 方法未在 Struct 节点上定义。相反,它是在 LinkedList 类上定义的,因此您需要相应地调用它。您可以重新定义 append 方法以将节点作为参数或将 append 方法添加到 Struct Node 本身。也没有必要将追加的结果分配给tmp =

您的附加方法无效。

于 2013-10-10T08:18:12.810 回答
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);看出 append 是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);
        }
    }
}
于 2013-10-10T08:20:01.267 回答
0

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

于 2013-10-10T08:22:29.693 回答
0

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

用我写的工作代码在这里查看我对另一个问题的回答

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

如您所见,我用方法解决了所有问题

AddItem(int i)

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

祝你好运!

于 2016-05-21T18:31:40.927 回答