有人可以解释一下我做错了什么吗? 我正在学习链接列表。所以,我写了一个函数插入前面。
#include <iostream>
using namespace std;
typedef struct IntElement{
struct IntElement *next;
int data;
} IntElement;
bool insertInFront (IntElement **head, int data);
int main (void){
IntElement *head;
insertInFront ( &head, 10);
cout << head->data<<endl;
insertInFront ( &head, 20);
cout << head->data<<endl;
insertInFront ( &head, 30);
cout << head->data<<endl;
cout << head->data<<endl;
insertInFront ( &head, 40);
cout << head->data<<endl;
cout << head->data<<endl;
return 0;
}
bool insertInFront (IntElement **head, int data){
IntElement newElem;
newElem.data = data;
newElem.next = *head;
*head = &newElem;
return true;
}
整个程序似乎没问题,但是当我第二次打印结果时,它会返回错误的值。
例如:
10
20
30
1447361072
40
1447361072
答案 0 :(得分:2)
您可以使用在堆栈上创建的自动变量的内容,并使用InsertInFront()函数的本地内容。当InsertInfron()函数退出时,将删除此变量。然后,在从InsertInFront()函数返回后,头指针指向一些垃圾剩余。
bool insertInFront (IntElement **head, int data){
IntElement newElem; <-- create a IntElement (automatic variable)
newElem.data = data; <-- Fill a IntElement
newElem.next = *head;
*head = &newElem;
return true;
<-- delete a IntElement
}
以下是从堆中分配的,这些动态变量在从InsertInFront()返回后有效。
bool insertInFront (IntElement **head, int data){
IntElement *newElem = new IntElement;
newElem->data = data;
newElem->next = *head;
*head = newElem;
return true;
}
不要忘记初始化空列表的头部!!!
答案 1 :(得分:0)
您尚未初始化head
元素,例如
IntElement *head = 0;
下一个问题出在insertInFront
,您在列表中使用局部变量。当你离开这个函数时,这个局部变量就消失了。您需要在堆上分配内存
IntElement *newElem = new IntElement();
newElem->data = data;
newElem->next = *head;
*head = newElem;
我想这是一些学习/家庭作业,否则我建议使用std::list
。
答案 2 :(得分:0)
您正在newElem
函数中插入存在于堆栈中的insertElem
。因此,当您第二次打印#34;时,它会在打印过程中被覆盖。第一次工作只是因为没有别的东西触及堆栈的那一点。
使用
IntElement *newElem = new IntElement;
newElem->data = data;
newElem->next = *head;
*head = newElem;
return true;