gpt4 book ai didi

c - 队列结构在被调用一次后丢失元素值

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

我正在用 C 编写一个队列结构,它将字符串(字符指针)作为元素。我遇到的问题是,在打印一次元素值后,它会在之后返回 null。

使用下面的代码,我期待这样的输出:

1 Hello
1 Hello
2 World
Hello World
1

但是我得到了这个输出:

1 Hello
1 (null)
2 World
(null) (null)
1

谁能告诉我我做错了什么?

#include <stdlib.h>
#include <stdio.h>

struct Node {
struct Node *next;
char* element;
};
struct Queue {
int size;
struct Node *head;
struct Node *tail;

};

void Enqueue(struct Queue *q, char* str) {
struct Node newNode = {0,str};
if(q->size == 0) {
q->head = &newNode;
}
else {
q->tail->next = &newNode;
}
q->tail = &newNode;
q->size = q->size + 1;
}
char* Dequeue(struct Queue *q) {
if(q->size < 0) {
return -1;
}
char* tbr = q->head->element;
struct Node* oldNode = q->head;
q->head = oldNode->next;
q->size = q->size - 1;
if(q->size == 0) {
q->tail = NULL;
}
return tbr;
}
int IsEmpty(struct Queue *q) {
return q->size == 0;
}
char* Peek(struct Queue *q) {
return q->head->element;
}
int main() {
struct Queue q = {0};
Enqueue(&q,"Hello");
printf("%d %s\n",q.size,q.head->element);
printf("%d %s\n",q.size,q.head->element);
Enqueue(&q,"World");
printf("%d %s\n",q.size,q.head->next->element);
printf("%s %s\n",Dequeue(&q),Dequeue(&q));
printf("%d\n",IsEmpty(&q));
printf("%s %s\n","Hello","World");
Dequeue(&q);
return 0;
}

最佳答案

内部Enqueue ,您不能使用局部变量在队列中插入新节点,因为您将在函数生命周期之外使用它,并且局部变量在函数返回后被销毁。

因此,当您从 Enqueue 返回时,插入的元素 ( newNode ) 指向一个无效的内存位置,当您调用另一个函数时,该位置很可能会被覆盖。所有的赌注都关闭了。如果您希望节点生命周期更长,则必须使用动态分配:

void Enqueue(struct Queue *q, char* str) {
struct Node *newNode = malloc(sizeof(struct Node));
newNode->next = NULL;
newNode->element = str;
if(q->size == 0) {
q->head = newNode;
}
else {
q->tail->next = newNode;
}
q->tail = newNode;
q->size = q->size + 1;
}

另外,请注意现在您需要 free出队时的节点。 Dequeue变成:

char* Dequeue(struct Queue *q) {
if(q->size < 0) {
return -1;
}
char* tbr = q->head->element;
struct Node* oldNode = q->head;
q->head = oldNode->next;
q->size = q->size - 1;
if(q->size == 0) {
q->tail = NULL;
}
free(oldNode);
return tbr;
}

内部main , 你的决赛 Dequeue将导致段错误,因为队列为空,并且您不在 Dequeue 中检查这种情况.要么你不调用Dequeue什么时候IsEmpty返回 true,或者您在 Dequeue 中添加代码来检查这种情况.

最后说明:在 main 中,这一行:

printf("%s %s\n",Dequeue(&q),Dequeue(&q));

不一定会打印Hello World ,因为参数评估顺序是实现定义的。例如,在我的机器中,它打印 World Hello .

关于c - 队列结构在被调用一次后丢失元素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19740521/

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