2017-03-31 64 views
0

我的流行函數似乎不工作,因爲它應該。基本上,我的隊列有一個指向第一個和最後一個元素的指針。內存泄漏流行()爲A隊列

我的pop功能首先釋放第一個元素並將其分配給NULL

然後它使用指針curr每次都到達下一個元素,直到找到NULL

最後,我在我的隊列中的第一個指針被分配到上一頁,這是指向最後一個元素,我CURR達到零之前。

#include <stdlib.h> 

struct Queue { 
    struct Node* first; 
    struct Node* last; 
}; 

struct Node { 
    Item val; 
    struct Node* next; 
}; 


void initQueue (struct Queue **queue){ 
    (*queue) = malloc(sizeof(struct Queue)); 
    (*queue)->first = NULL; 
    (*queue)->last = NULL; 
} 

struct Node* createNewNode(){ 
    struct Node *newNode; 
    newNode = malloc(sizeof(struct Node)); 
    newNode->next = NULL; 

    return newNode; 
} 



void push (Item val, struct Queue *queue){ 
    struct Node* newNode = createNewNode(); 
    newNode->val = val; 


    if(queue->first == NULL){ 
     queue->first = newNode; 
     queue->last = newNode; 
    } 

    else{ 
     newNode->next = queue->last; 
     queue->last = newNode; 
    } 
} 

void pop(struct Queue *queue){ 

    struct Node* curr = queue->last; 
    struct Node* prev = queue->last; 


    free(queue->first); 
    queue->first = NULL; 

    while(curr != NULL){ 
     prev = curr; 
     curr = curr->next; 
    } 

    queue->first = prev; 

} 

回答

2

從列表中的前流行,只需firstfirst->next

void pop(struct Queue *queue) 
{ 
    if (NULL != queue->first) { 
     struct Node *first = queue->first; 
     // Update first ptr 
     queue->first = queue->first->next; 
     free(first); 
     // Only need to update tail if list is empty 
     if (NULL == queue->first) { 
      queue->last = NULL; 
     } 
    } 
} 

編輯 基於您的評論,它看起來像你沒有看到我在做什麼,所以這裏是一個例子。

假設隊列看起來像這樣:

queue->first

甲→ →乙Ç→ d ← queue->last

首先,使一暫時指針,並將它指向queue->first。然後移動queue->first,使其指向queue->first->next。該列表現在看起來像:

              queue->first
                ↓
一個→乙→Ç→ d ← queue->last

first(溫度VAR)

然後,刪除臨時var和清單是:

queue->first

乙→Ç→ d ← queue->last

編輯2我還發現您的push功能不正確。在隊列中,將新項目添加到列表的末尾,並從前面獲取項目(FIFO - 先進先出)。就像排隊等候觀看演出的人一樣。 第一人人到那裏並排隊將是第一個進入劇院。並且最後人到達線後面。所以push應該是:

void push (Item val, struct Queue *queue){ 
    struct Node* newNode = createNewNode(); 
    newNode->val = val; 

    if(queue->first == NULL) { 
     queue->first = newNode; 
     queue->last = newNode; 
    } 
    else{ 
     queue->last->next = newNode; // Add to END of list 
     queue->last = newNode; 
    } 
} 
+0

您的解決方案不會調整指針,它釋放** queue-> first **指向的內存位置。例如,一旦你**免費(第一)**,**隊列 - >第一**不再指向任何元素。相反,前一個元素現在應該指向** queue-> first **。 –

+0

@ M.S我將它重新分配在免費的_before_上。 –

+0

我已經添加了一個詳細的解釋,希望能夠澄清事情。 –