Вставка узла в конец двусвязного списка

Я попытался вставить узел в конец двусвязного списка с помощью функции вставки, но выполнение процесса резко останавливается после второй вставки. Я попытался проверить адрес всех переменных указателя, используемых в функции вставки, и они показывают, что мой код работает нормально до третьей функции вставки. Как я могу исправить свой код?

#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
    struct node* next;
    struct node* prev;
};

void insert(struct node** header,int data) {
    struct node* newnode=(struct node*)malloc(sizeof(struct node*));
    newnode->data=data;
    newnode->prev=NULL;
    newnode->next=NULL;

    if(*header == NULL) {
        *header=newnode;
        return;
    }

    struct node* temp = *header;

    while(temp->next != NULL) {
        temp=temp->next;
    }

    temp->next = newnode;
    newnode->prev = temp;
    printf("%d\n**\n", temp->next);
}

void main() {
    struct node* head = NULL;
    insert(&head, 4);
    insert(&head, 45);
    printf("\n main head %d", head);
    insert(&head, 8);
    printf("testing");
    insert(&head, 69);
}

person user3201928    schedule 06.11.2014    source источник
comment
Предложение по архитектуре: пусть insert возьмет struct node * и вернет struct node *; Я обнаружил, что это немного легче понять, так как вам не нужно возиться с двойными указателями.   -  person APerson    schedule 06.11.2014
comment
Вы должны либо использовать формат %p для печати указателей, либо сохранить формат %d и распечатать данные узла.   -  person M Oehm    schedule 06.11.2014
comment
@APerson: Или, может быть, создайте структуру списка, которая сохраняет и голову, и хвост, и заставьте функции работать с указателями на эту структуру. (Возврат новой головы всегда создает избыточность - head = something(head) -, что я нахожу более уродливым, чем передача двойных указателей.)   -  person M Oehm    schedule 06.11.2014


Ответы (1)


Вы не выделяете достаточно памяти

struct node* newnode=(struct node*)malloc(sizeof(struct node*)); 
// here you allocate only 4 bytes (or 8 bytes on a 64 bit system)

должно быть:

struct node* newnode = (struct node*)malloc(sizeof(struct node));

Тогда все работает нормально.

person Jabberwocky    schedule 06.11.2014
comment
или sizeof *newnode, не оставляя сомнений, что то, что должно быть выделено, соответствует типу указателя, которому оно назначено. И потерять приведение на malloc() - person WhozCraig; 06.11.2014