Двойной связанный список; попытка новичка - PullRequest
0 голосов
/ 05 мая 2011

Я только начал изучать C и (, по-видимому, ), пока что большинство вещей щелкает. Тем не менее, у меня возникают проблемы с поиском проблемы с попыткой двойного связанного списка . Я продолжаю получать seg-fault, когда пытаюсь собрать / запустить этот код. Я компилирую с Cygwin, поставляемым gcc через NetBeans.

Я не хочу просто выбросить блок кода и сказать "помощь", но я не знаю, какие еще детали уместны в настоящее время, поэтому не стесняйтесь спрашивать подробности, если необходимо:

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

struct node_t{
    struct node_t *prev;
    struct node_t *next;
};

struct list_t{
    struct node_t *head;
    struct node_t *tail;
    int length;
};

struct node_t *new_node(void);
struct list_t *new_list(void);
int append_list_node(struct list_t *list, struct node_t *node);

int main(void) {

    int i = 0, length = 0;
    struct node_t *node;
    struct list_t *list = new_list();

    for(i = 0; i < 10; i++){
        length = append_list_node(list, new_node());
        printf("%d", length);
    }

    return 0;

}

struct node_t *new_node(void){
    struct node_t *node = malloc(sizeof(struct node_t));
    return node;
}

struct list_t *new_list(void){
    struct list_t *list = malloc(sizeof(struct list_t));
    list->length = 0;
    return list;
}

int append_list_node(struct list_t *list, struct node_t *new_node){
    if(list->head == NULL){
        list->head          = new_node; // edited
        new_node->prev      = NULL;
    }else{
        list->tail->next    = new_node;
        new_node->prev      = list->tail;
    }
    return (++list->length);
}

Спасибо за супер быстрые ответы всем, все ответы верны. Кратко просматривая код между F5 -ing, я понял, что не устанавливал tail, поэтому я решил изменить строку, помеченную edited, следующим образом:

list->head = list->tail = new_node;

Я также решу использовать calloc(), однако, я читал, что частое его использование может привести к значительным затратам времени выполнения, поскольку оно очищается и выделяется. Мысли?

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Используйте calloc () для выделения памяти.Функция malloc () не инициализирует память нулями (поэтому указатели будут установлены в NULL).Вы делаете предположение, что указатели по умолчанию равны NULL.

2 голосов
/ 05 мая 2011

C не выполняет никакой инициализации для вас. Итак, когда вы делаете:

struct list_t *new_list(void){
    struct list_t *list = malloc(sizeof(struct list_t));
    list->length = 0;
    return list;
}

list->head может быть чем угодно .. и, вероятно, не будет NULL.

0 голосов
/ 05 мая 2011

Одна проблема заключается в том, что вы никогда не устанавливаете list-> tail в что-либо , а затем пытаетесь получить доступ к list-> tail-> next, если list-> head не NULL (который, как и другиеуказал, не гарантируется в любом случае.)

...