我在 C 中的动态队列显示无限奇怪的结果



我正在研究 C 语言的 dinamic 列表,这是我使用结构和指针创建的队列,它通常会对节点进行排队,但是当我按该顺序调用 Dequeue 和 Show 方法时,它会进入循环并显示奇怪的随机数。

struct Node {
int data;
struct Node *next;
};
typedef struct Node node;
int size = 0;
node* front = NULL;
node* rear = NULL; 

在列表末尾添加一个新节点 void Enqueue(int n({

node *new_node = (node*)malloc(sizeof(node));
new_node->data = n;
new_node->next = NULL;
if (front == NULL && rear == NULL){
front = new_node;
rear = new_node;
return;
}
rear->next = new_node;
rear = new_node;
}

在 show(( 之前调用此方法时,会出现循环问题 void Dequeue(({

node *tmp = front; if (front == rear){ front = rear = NULL; } else { front = front->next; } free(front); } //if just calling Enqueue() and Show() methods, it runs normally void Show(){ node *tmp = front; while(tmp != NULL){ printf("%d n", tmp->data); tmp = tmp->next; } } int main(void){ Enqueue(1); Enqueue(2); Enqueue(3); Dequeue(); Show(); system("pause"); return 0; }

检查您的Dequeue(...)函数。 重新分配节点后,您将释放前端的节点。 试试这个

void Dequeue(){

node *tmp = front;

if (front == rear){
front = rear = NULL;
}
else {
front = front->next;
}
free(tmp);
}
free(front);  // SHOULD BE `free(tmp)`

正确的代码

void Dequeue(){
node *tmp = front;
if (front == rear)
front = rear = NULL;
else
front = front->next;
free(tmp);
}

free(front);

我想你的意思是:

free(tmp);

在调用free()之前,您将front重新分配给队列的新头,因此释放该节点不是您想要做的。tmp是指向原始头节点的指针的副本,在重新分配front后释放该指针是安全的。

相关内容

  • 没有找到相关文章

最新更新