C语言 双链表;新手尝试



我刚刚开始学习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(),但是,我读到经常使用它会导致相当大的执行时间成本,因为它是清理和分配的。想法吗?

使用calloc()来分配内存。malloc()函数不会将内存初始化为零(因此指针将被设置为NULL)。您假设指针默认为NULL。

C不为您做任何初始化。所以当你这样做的时候:

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

list->head可以是任何…可能不会是NULL。

一个问题是,您永远不会将list->tail设置为任何,然后尝试访问list->tail->next,如果list->head不是NULL(正如其他人指出的那样,无论如何都不能保证)

相关内容

  • 没有找到相关文章

最新更新