繁体   English   中英

C中打印双向链表进入死循环

[英]Printing doubly linked list in C goes into infinite loop

我正在尝试学习双向链表。 我使用以下内容进行打印:

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

typedef struct List{
    node *head; 
}list;

node * createNode(int data) {
    node * newNode = (node*)malloc(sizeof(node));
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

_Bool isEmpty(const list *L)
{
    if (L->head == NULL)
        return 1;
    return 0;
}

_Bool insert(list *L, node *N) {
    if(isEmpty(L)) { 
        L->head = N;
    }
    else{
        L->head->prev = N; 
        N->next = L->head; 
        L->head = N; 
    }
    if (L->head==N)
        return 1;
    return 0;
}

void _print(list *L){
    node *temp=L->head;
    while(temp!=NULL){
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

int main(int argc, char *argv[]){
    list *L1=(list *)malloc(sizeof(list));

    node *N1=createNode(3);
    node *N2=createNode(1);
    node *N3=createNode(5);

    insert(L1, N3);
    insert(L1, N2);
    insert(L1, N1);
    _print(L1);

}

作为参考,我的列表结构仅包含一个指针“head”,而我的节点结构包含下一个、上一个和数据。

它打印正确的数据但进入无限循环。
是什么原因?

问题是main中的这一行:

list *L1=(list *)malloc(sizeof(list));

list分配 memory,但不对其进行初始化

如果没有初始化, L1->head的值可以是任何东西。 如果它碰巧不同于0 (即NULL ), insert会将其解释为指向一个有效node (实际上不是)。

结果是未定义的行为UB ),这意味着任何事情都可能发生。 它可能看起来有效,它可能会崩溃,或者进入无限循环等。

为了修复它,您需要初始化L1指向的list
您至少可以通过两种方式做到这一点:

  1. calloc替换对malloc的调用,这也会将分配的 memory 清零:
     list* L1 = (list*)calloc(sizeof(list), 1);
  2. malloc之后添加显式初始化:
     list* L1 = (list*)malloc(sizeof(list)); L1->head = NULL; /* <--- initialization */
    也可以加一个function来封装初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM