[英]C Queue cleanup pointers
您好,我在C語言中基於LinkedList隊列編寫了簡單代碼,但是在釋放指針時遇到了問題。
我在刪除隊列時遇到問題。 函數QueueDestroy應該迭代整個隊列,並依次刪除第一個元素,然后刪除下一個和下一個直到結束。
刪除第一個元素是由QueueDeleteFirst(struct * Queue)函數進行的,該函數檢查第一個元素是否與后面的元素相同
void QueueDeleteFirst(struct Queue * queue){
if(queue->front == queue->rear){
free(queue->front);
// free(queue->rear); //This Give me "double free or corruption (fasttop)"
//So I only set rear to null
queue->rear = NULL;
} else {
queueNodeT * tmp = queue->front->next;
free(queue->front);
queue->front = tmp;
}
}
我的問題是關於此(QueueDeleteFirst)函數的正確性,因為我正在學習C語言並且需要一些指導。
我知道在C中將指針傳遞到函數中按值傳遞它,所以我有本地副本,但就我而言,我不需要傳遞
struct Queue ** queue
因為我需要的只是釋放第一個元素,而不是整個struct Queue。 因此,刪除第一個元素的正確方法是什么?
接下來的事情是QueueDestroy(struct Queue ** queue),在這里我需要使用雙指針,因為我需要free(queue)指針,而QueueDestroy(struct Queue * queue)只會釋放本地指針?
整個我的代碼如下:
queue.h
typedef char queueElementT;
typedef struct queueNodeTag {
queueElementT element;
struct queueNodeTag *next;
} queueNodeT;
struct Queue {
queueNodeT *front, *rear;
} ;
void QueueDestroy(struct Queue * queue);
void QueueEnter(struct Queue * queue, queueElementT element);
void QueueDeleteFirst(struct Queue ** queue);
int QueueIsEmpty(struct Queue * queue);
struct Queue * QueueCreate(void);
queue.c
#include "queue.h"
static queueNodeT *NewNode(queueElementT element);
struct Queue * QueueCreate(void){
struct Queue * queue;
queue = (struct Queue *)malloc(sizeof(struct Queue));
if (queue == NULL) {
fprintf(stderr, "Insufficient memory for new queue.\n");
exit(1);
}
queue->front = queue->rear = NULL;
return queue;
}
void QueueDestroy(struct Queue ** queue){
while (!QueueIsEmpty(*queue))
QueueDeleteFirst(*queue);
(*queue)->front = (*queue)->rear = NULL;
free(*queue);
*queue = NULL;
}
void QueueEnter(struct Queue * queue, queueElementT element) {
queueNodeT *newNodeP;
newNodeP = NewNode(element);
if (queue->front == NULL) { /* Queue is empty */
queue->front = queue->rear = newNodeP;
} else {
queue->rear->next = newNodeP;
queue->rear = newNodeP;
}
}
static queueNodeT *NewNode(queueElementT element){
queueNodeT *newNodeP;
newNodeP = (queueNodeT *)malloc(sizeof(queueNodeT));
if (newNodeP == NULL) {
fprintf(stderr, "Insufficient memory for new node.\n");
exit(1);
}
newNodeP->element = element;
newNodeP->next = NULL;
return newNodeP;
}
int QueueIsEmpty(struct Queue * queue){
return queue->front == NULL || queue->rear == NULL;
}
void QueueDeleteFirst(struct Queue * queue){
if(queue->front == queue->rear){
free(queue->front);
queue->rear = NULL;
} else {
queueNodeT * tmp = queue->front->next;
free(queue->front);
queue->front = tmp;
}
}
您對參數傳遞的理解是完全正確的,但是QueueDeleteFirst
存在邏輯錯誤。 釋放前部時,您也隱式free
了rear
元素,並且兩個指針都應設置為NULL
( queue->front = queue->rear = NULL
)。 這樣可以解決您的清理問題。
我看不到QueueDestroy
將如何編譯,因為不存在queue->front
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.