向链表中添加节点


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超出范围),这对于解引用是不安全的。

然而,如果tempnew分配,这意味着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();
}

相关内容

  • 没有找到相关文章

最新更新