struct ll
{
int data;
ll *next;
};
void display(ll **head) {
ll *t = *head;
while(t){
cout<<t->data<<"-->";
t = t->next;
}
}
void add(ll **head, int d) {
ll *c = *head;
ll temp;
temp.data = d;
temp.next = NULL;
if(*head == NULL) {
*head = &temp;
} else {
while(c->next) {
c = c->next;
}
c->next = &temp;
}
}
int main() {
ll *head = NULL;
add(&head,1);
add(&head,2);
//add(&head,3);
//add(&head,4);
//add(&head,10);
//display(&head);
getchar();
}
为什么在add()中使用ll temp不工作。如果我把它转换成ll *temp= new ll;所有w
Add()函数创建了一个局部all结构体。访问它会导致未定义的行为。您需要在内存的堆部分分配节点。
void add(ll **head, int d) {
ll *c = *head;
ll *temp = new ll;
temp->data = d;
temp->next = NULL;
if(*head == NULL) {
*head = temp;
} else {
while(c->next) {
c = c->next;
}
c->next = temp;
}
}
您在函数中创建了一个超出作用域的局部结构(在函数结束时释放所有内存)。但是,当您将节点指向它:*head = &temp;
时,它将导致未定义的行为,因为它将指向函数结束时被破坏的内存(一旦temp
超出范围),这对于解引用是不安全的。
然而,如果temp
与new
分配,这意味着temp
将不会被破坏,直到您调用delete
关键字,允许它安全有效地指向函数中创建的变量。
试试这个:
struct ll
{
int data;
ll *next;
};
void display(ll** head)
{
ll* cur = *head;
while(cur != NULL){
cout<< cur->data << "-->";
cur = cur->next;
}
}
void add(ll** head, int d)
{
ll* cur = *head, *temp = new ll;
temp->data = d;
temp->next = NULL;
if(*head == NULL) {
*head = temp;
}
else {
while(cur->next != NULL) {
cur = cur->next;
}
c->next = temp;
}
}
void free_list(ll** head)
{
ll* cur = *head, *next = NULL;
while(cur != NULL){
next = cur->next;
delete cur;
cur = next;
}
}
int main()
{
ll *head = NULL;
add(&head,1);
add(&head,2);
display(&head);
free_list(&head);
getchar();
}