单向链表,在末尾插入
Singly Linked List, insert at end
由于我无法控制的原因,函数声明不得更改。我不太擅长指针,所以 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;
}
}
}
如果您能简要说明指针在正确实现中的工作方式,那将是完美的答案。
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;
}
}
}
看待问题的方式略有不同。
data
是(或者更好的是,因为提问者的代码和所有的答案都不起作用)指向下一个指针。头指针是另一个名称的下一个指针;将其视为第一个下一个指针。它没有什么特别之处,所以如果您通过指向它的指针来抽象出不同的名称,您可以编写更简单的代码。 data
已经完成了第一步。
这意味着您需要做的就是找到第一个 null 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使初始化更容易编写。
由于我无法控制的原因,函数声明不得更改。我不太擅长指针,所以 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;
}
}
}
如果您能简要说明指针在正确实现中的工作方式,那将是完美的答案。
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;
}
}
}
看待问题的方式略有不同。
data
是(或者更好的是,因为提问者的代码和所有的答案都不起作用)指向下一个指针。头指针是另一个名称的下一个指针;将其视为第一个下一个指针。它没有什么特别之处,所以如果您通过指向它的指针来抽象出不同的名称,您可以编写更简单的代码。 data
已经完成了第一步。
这意味着您需要做的就是找到第一个 null 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使初始化更容易编写。