2014-01-28 39 views
0

添加元素時,我打印出鏈接列表的頭部和尾部,相當簡單。C簡單鏈接列表 - 錯誤輸出

int main(){ 

    struct node{ 
     struct node* next; 
     struct node* previous; 
     double value; 
    }; 

    struct LinkedList{ 
     struct node* head; 
     struct node* tail; 
    }; 

    void addValue(struct LinkedList* list,double newValue){ 
     struct node newNode; 
     newNode.next = NULL; 
     newNode.value=newValue; 
     if(list->head == NULL){ 
      newNode.previous=NULL; 
      list->head= &newNode; 
      list->tail=&newNode; 


     } 
     else 
     { 
      newNode.previous= list->tail; 
      list->tail->next= &newNode; 
      list->tail= &newNode; 



     } 
      printf("%f\n",list->head->value); 
      printf("%f\n",list->tail->value); 

    } 

    struct LinkedList l1; 
    l1.head=NULL; 
    l1.tail=NULL; 
    addValue(&l1,5); 
    addValue(&l1,6); 
    addValue(&l1,7); 
    addValue(&l1,8); 


} 

但輸出我得到的是

5.000000 5.000000 6.000000 6.000000 7.000000 7.000000 8.000000 8.000000

相反,我所期望

5.000000 5.000000 5.000000 6.000000 5.000000 7.000000 5.000000 8.000000

任何想法,爲什麼?

+2

您應該使用'malloc'命令在堆上創建新節點,而不是像當前所做的那樣在堆棧上創建新節點。 – catchmeifyoutry

+0

@catchmeifyoutry很好看,它看起來像懸掛指針。 – 2014-01-28 19:23:55

+0

@remyabel你可以嘗試寫一個答案,如果你想,我有一些其他的東西要做;) – catchmeifyoutry

回答

4

正如評論中所述,您應該在堆上創建newNode。當函數退出時,指針不再指向有效內存。幸運的是,你需要做的改變是最小的。

struct node* newNode = (struct node*)malloc(sizeof(struct node)); 
    newNode->next = NULL; 
    newNode->value=newValue; 
    if(list->head == NULL){ 
     newNode->previous=NULL; 
     list->head= newNode; 
     list->tail=newNode; 
    } 
    else 
    { 
     newNode->previous= list->tail; 
     list->tail->next= newNode; 
     list->tail=newNode; 
    } 

,避免內存泄漏,你應該free您的指針。下面是一個示例實現:

void deleteList(struct node** head_ref) 
{ 
    struct node* current = *head_ref; 
    struct node* next; 

    while (current != NULL) 
    { 
     next = current->next; 
     free(current); 
     current = next; 
    } 

    *head_ref = NULL; 
} 
deleteList(&l1.head); 

我測試了它在valgrind並應消除你的漏洞。

+0

不要忘記實施刪除功能,所以內存將被釋放在結束 – ItayB

+0

也許你可以提到內存應該是免費的,以完成執行 – catchmeifyoutry

+0

啊..謝謝。現在檢查它。 – gawicks

0

通過定義struct node newNode;在void addValue(struct LinkedList * list,double newValue)中,內存被分配到堆棧上。所以當從函數控制返回時,不再訪問堆棧。價值觀消失了!這就是它需要從堆中分配動態內存的地方,直到它被釋放爲止。