簡體   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