【问题标题】:Singly Linked List, insert at end单链表,插入到最后
【发布时间】:2021-03-22 16:32:12
【问题描述】:

由于我无法控制的原因,函数声明不得更改。我不太擅长使用指针,所以 NODE** 声明真的让我很反感。

我知道基本要点或多或少是正确的。由于指针,我不断收到错误,不知道如何解决。

else语句的这一行目前有错误:

NODE* last = data;

//a value of type "NODE **" cannot be used to initialize an entity of type "NODE *"

但我不知道我是否正确处理了指针。

class NODE {
  public:
    string firstname;
    string lastname;
    string email;
    NODE* next;
};

void add_node_tail(NODE** data, string firstname,string lastname, string email) {
    NODE* temp = new NODE;
    temp->firstname = firstname;
    temp->lastname = lastname;
    temp->email = email;
    temp->next = NULL;

    if(!data) { // empty list becomes the new node
        data = &temp;
        return;
    } else { // find last and link the new node
        NODE* last = data;
        while(last->next) {
            last=last->next;
            last->next = temp;
        }
    }
}

如果您能给我简要说明指针在正确实现中的工作方式,那将是完美的答案。

【问题讨论】:

  • "由于我无法控制的原因" = "这是学校作业",不是吗?请务必检查您学校的政策是否允许您提出有关家庭作业的问题。
  • 你有没有一个例子说明add_node_tail 是如何被调用的,为什么它被这样调用?
  • @NikitaDemodov 我查过了!没有提及任何关于提问的规则。那为什么不呢?

标签: c++ linked-list singly-linked-list


【解决方案1】:

NODE** data 是指向NODE* 的指针,因此您应该像*data 这样取消引用指针以获取NODE* 的值。

void add_node_tail(NODE** data, string firstname,string lastname, string email) {
    NODE* temp = new NODE;
    temp->firstname = firstname;
    temp->lastname = lastname;
    temp->email = email;
    temp->next = NULL;

    // *** dereference data to get the value ***
    if(!*data) { // empty list becomes the new node
        // *** dereference data to set the value ***
        // also remove the extra & not to save a pointer to local variable
        *data = temp;
        return;
    } else { // find last and link the new node
        // *** dereference data to get the value ***
        NODE* last = *data;
        while(last->next) {
            last=last->next;
            last->next = temp;
        }
    }
}

【讨论】:

  • 请注意,您可以使用一个巧妙的技巧来跳过第一个测试并减少所需的代码量。 Community Addition here 展示了如何使用指向指针的指针移除节点,但插入逻辑类似。
  • 谢谢!您的 cmets 真的很有帮助!
【解决方案2】:

看待问题的方式略有不同。

data 是(或者最好是因为提问者的代码和所有答案都不起作用)指向下一个指针。头指针是另一个名称的下一个指针;将其视为第一个下一个指针。它没有什么特别之处,所以如果你通过一个指向它的指针抽象出不同的名字,你可以编写更简单的代码。 data 已经完成了这第一步。

这意味着您需要做的就是找到第一个空的 next 指针并将其指向新节点。

void add_node_tail(NODE** data, string firstname,string lastname, string email) {
    while (*data) { // if data points at a non-null next
        data = &(*data)->next; // point at the pointer to the next node
    }
    *data = new NODE{ firstname, lastname, email, NULL }; // insert at last next
}

注意:new NODE{ firstname, lastname, email, NULL }; 使用aggregate initialization 使初始化更容易编写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多