我查看了关于这个问题的其他帖子,原因似乎是没有正确分配内存/取消引用。输出仅显示存储在第一个节点中的数据,该节点是在Main函数中创建的。但是,我使用new
分配每个新节点。下面是我的代码,如果有人可以看看的话:
struct people{
Name name;
double height;
int weight;
};
struct Queue{
people* ppl;
int data;
Queue* next;
};
void print(Queue * queueHead){
Queue * traverse = queueHead;
while(traverse!=NULL){
cout << "height " << traverse->ppl->height << endl;
traverse = traverse->next;
}
}
void addNode(Queue*& queue, const people ppl){
people* node = new people;
node->name = ppl.name;
node->height = ppl.height;
node->weight = ppl.weight;
Queue* traverse = queue;
Queue* new_node = new Queue;
while(traverse!= NULL){
traverse= traverse->next;
}
new_node->ppl = node;
new_node->next = NULL;
traverse=new_node;
traverse->next = NULL;
}
int main(){
Queue * queueHead = new Queue;
people * node = new people;
node->name = Ashley;
node->height = 5.5;
node->weight = 125;
queueHead->ppl = node;
queueHead->next = NULL;
node=NULL;
people node2 = {
.name = Peter,
.height = 5.8,
.weight = 145
};
people node3 = {
.name = Bill,
.height = 6.0,
.weight = 160
};
people node4 = {
.name = Mike,
.height = 6.2,
.weight = 150
};
people node5 = {
.name = Chris,
.height = 6.2,
.weight = 140
};
addNode(queueHead,node2);
addNode(queueHead,node3);
addNode(queueHead,node4);
addNode(queueHead,node5);
//queueHead->next = NULL;
print(queueHead);
发布于 2018-06-19 06:47:45
在addNode
中
Queue* traverse = queue;
是queue
地址的副本,这意味着它们指向相同的位置,但这并不是那么有帮助。作为示例,请注意循环迭代到列表末尾时发生的情况:
while(traverse->next != NULL){
traverse= traverse->next;
}
遍历列表,但每次都会让traverse
指向NULL,并且它与附加到列表的任何内容都是分开的。
traverse=new_node;
将新节点分配给traverse
,但traverse是一个局部变量,它只指向与上一个节点的next
相同的内容。遍历不在作用域之外,列表不会更新,并且新节点会泄漏。
但
Queue** traverse = &queue;
让traverse
始终指向一个next
,而不仅仅是next的副本。如果更新*traverse
,则可以修改该列表。例如,
void addNode(Queue*& queue, const people ppl){
// I think you dropped a & here const pass by value isn't all that useful.
people* node = new people;
node->name = ppl.name;
node->height = ppl.height;
node->weight = ppl.weight;
// the above should be done in a people copy constructor
Queue** traverse = &queue;
Queue* new_node = new Queue;
while((*traverse)!= NULL){
traverse= &(*traverse)->next; //traverse points at next instead of
// being a copy.
}
new_node->ppl = node;
new_node->next = NULL;
*traverse=new_node; // pointing what traverse points at at the new node
(*traverse)->next = NULL; // this should really be done in a Queue constructor
}
发布于 2018-06-19 06:30:50
您的add node函数实际上从未将新节点添加到现有队列中。
试试这个吧
void addNode(Queue*& queue, const people ppl){
people* node = new people;
node->name = ppl.name;
node->height = ppl.height;
node->weight = ppl.weight;
Queue* traverse = queue;
Queue* new_node = new Queue;
while(traverse->next != NULL){
traverse= traverse->next;
}
new_node->ppl = node;
new_node->next = NULL;
traverse->next = new_node;
}
https://stackoverflow.com/questions/50918075
复制相似问题