Я только начал изучать 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()
, однако, я читал, что частое его использование может привести к значительным затратам времени выполнения, поскольку оно очищается и выделяется. Мысли?