C++ 单链表,在末尾插入

C++ 单链表,在末尾插入,c++,linked-list,singly-linked-list,C++,Linked List,Singly Linked List,由于我无法控制的原因,函数声明不得更改。我对指针不是很在行,所以节点**声明真的让我很反感 我知道基本要点或多或少是正确的。我只是不断地因为指针而出错,不知道如何解决它 else语句的此行中当前有一个错误: NODE* last = data; //a value of type "NODE **" cannot be used to initialize an entity of type "NODE *" 但我不知道我是否正确地处理了指针 clas

由于我无法控制的原因,函数声明不得更改。我对指针不是很在行,所以节点**声明真的让我很反感

我知道基本要点或多或少是正确的。我只是不断地因为指针而出错,不知道如何解决它

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

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

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

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

用一种稍微不同的方式来看待这个问题

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

这意味着您只需找到第一个空的下一个指针并将其指向新节点

void add\u node\u tail(节点**数据、字符串firstname、字符串lastname、字符串email){
while(*data){//如果数据指向非空的下一个
data=&(*data)->next;//指向下一个节点的指针
}
*data=new节点{firstname,lastname,email,NULL};//最后插入下一个
}

注意:
新节点{firstname,lastname,email,NULL}
正在利用使初始化更易于编写。

用一种稍微不同的方式来看待问题

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

这意味着您只需找到第一个空的下一个指针并将其指向新节点

void add\u node\u tail(节点**数据、字符串firstname、字符串lastname、字符串email){
while(*data){//如果数据指向非空的下一个
data=&(*data)->next;//指向下一个节点的指针
}
*data=new节点{firstname,lastname,email,NULL};//最后插入下一个
}

注意:
新节点{firstname,lastname,email,NULL}
正在利用使初始化更容易编写。

“由于我无法控制的原因”=“这是学校作业”,不是吗?请务必检查你们学校的政策是否允许你们提出关于家庭作业的问题。你们有没有一个例子说明
add\u node\u tail
是如何被调用的,以及为什么被这样调用的?@nikitademov我查过了!没有提到任何关于提问的规则。那为什么不呢?“由于我无法控制的原因”=“这是学校的作业”,不是吗?请务必检查你们学校的政策是否允许你们提出关于家庭作业的问题。你们有没有一个例子说明
add\u node\u tail
是如何被调用的,以及为什么被这样调用的?@nikitademov我查过了!没有提到任何关于提问的规则。那么为什么不呢?请注意,有一个巧妙的技巧可以用来跳过第一个测试并减少所需的代码量。显示了如何使用指向指针的指针删除节点,但插入逻辑类似。谢谢!你的评论真的很有帮助!注意,您可以使用一个巧妙的技巧跳过第一个测试并减少所需的代码量。显示了如何使用指向指针的指针删除节点,但插入逻辑类似。谢谢!你的评论真的很有帮助!