簡體   English   中英

C隊列清理指針

[英]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存在邏輯錯誤。 釋放前部時,您也隱式freerear元素,並且兩個指針都應設置為NULLqueue->front = queue->rear = NULL )。 這樣可以解決您的清理問題。

我看不到QueueDestroy將如何編譯,因為不存在queue->front

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM