[英]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
。
您至少可以通過兩種方式做到這一點:
calloc
替換對malloc
的調用,這也會將分配的 memory 清零: list* L1 = (list*)calloc(sizeof(list), 1);
malloc
之后添加顯式初始化: list* L1 = (list*)malloc(sizeof(list)); L1->head = NULL; /* <--- initialization */
也可以加一個function來封裝初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.