gpt4 book ai didi

C 队列清理指针

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:24 25 4
gpt4 key购买 nike

你好,我正在用 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

因为我只需要释放第一个元素而不是整个结构队列。那么删除第一个元素是正确的方法吗?

接下来是 QueueDestroy(struct Queue ** queue) 这里我需要使用双指针,因为我需要 free(queue) 指针,而 QueueDestroy(struct 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);

队列.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 中存在逻辑错误。当释放 front 时,你也隐式地 free rear 元素,并且两个指针都应该设置为 NULL (queue->front = queue->rear = NULL).这将解决您的清理问题。

我看不到 QueueDestroy 将如何编译,因为 queue->front 不存在?

关于C 队列清理指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25989752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com