0

我目前正在測試一個鏈表,我正在構建,當我運行下面的代碼時,我得到一個「指針是免費的沒有分配」我知道這是用delete_queue功能,但我無法弄清楚。指針是免費的沒有分配

#include <stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include "smb.h" 

#define BUFLEN (25) 

struct Queue { 
    stage *front, *back; 
}; 

typedef struct Queue * Queue; 

Queue queue_create(void) { 
    Queue q = malloc(sizeof(struct Queue)); 
    q->front = q->back = NULL; 
    return q; 
} 

void queue_delete(Queue q) { 
    stage *current, *tmp; 
    current = q->front; 
    while (current!= NULL) { 
    tmp = current->next; 
    free(current); 
    current = tmp; 
    } 


    free(q); 
} 

void queue_push(Queue q, char * name, int ncoins, int npipes) { 
    stage *n =malloc(sizeof(struct stage)); 
    strcpy(n->name, name); 
    n->ncoins = ncoins; 
    n->npipes = npipes; 
    n->next = NULL; 
    stage *current; 

    if (q->front == NULL) { 
    q->front = n; 
    } else { 


    current = q->front; 
    while(current!= NULL){ 
     current = current->next; 
    } 
    current = n; 

    } 
    q->back = n; 
    q->back->next = q->front; 
} 



int main(void) { 
    Queue q = queue_create(); 
    queue_push(q, "courtyard", 1, 2); 

    int data1 = q->front->ncoins; 
    int data2 = q->front->npipes; 








    printf("%d\n", data1); 
    printf("%d\n", data2); 
    printf("%s\n", q->front->name); 



    queue_delete(q); 
    return 0; 
} 
+0

我們應該假設q-> back-> next = q-> front'不是一個錯誤,而是*有意*形成一個**循環鏈表**?如果是這樣,當非空作爲終止條件不起作用時,在這樣的列表上清楚地檢查NULL。您的刪除代碼最終會刪除已刪除的節點,並且您的推送代碼將進入無限循環。 – WhozCraig

回答

0

試試這個

while(current->next!=NULL) 

與此相反

while(current!=NULL) 

,當你到你調用TMP->未來是過去的最後一個節點的最後一個節點。所以你的指針指向不中途。

+0

不會'tmp'和'current'在最初的代碼中都以'NULL'結尾,沒有問題?如果'current-> next'是'NULL',我們給它設置'tmp',我們釋放'current',將'current'設置爲'NULL',我們停止。那裏我沒有問題。 – Dukeling

+0

如果在創建新節點時將下一個節點初始化爲NULL,那麼它不應該是一個問題,但如果它不是那麼當你指向下一個節點時它不會指向NULL,而是將指向內存中的隨機點。 –

+0

哦,等等,等一下,有兩行含有'while(current!= NULL)',你在說什麼? – Dukeling