C队列清理指针

时间:2014-09-23 07:51:39

标签: c pointers queue

您好我在C语言中基于LinkedList队列写简单,我在发布指针时遇到了问题。

我在删除队列时遇到了问题。函数QueueDestroy应该迭代整个队列并按顺序删除第一个元素,然后是next和next,直到结束。

删除第一个元素是由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 **队列)这里我需要使用双指针,因为我需要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;
     }
}

1 个答案:

答案 0 :(得分:1)

您对参数传递的理解非常正确,但您的QueueDeleteFirst中存在逻辑错误。在释放前面时,您也隐含free rear元素,并且两个指针都应设置为NULLqueue->front = queue->rear = NULL)。这将解决您的清理问题。

由于QueueDestroy不存在,我无法看到queue->front将如何编译?