gpt4 book ai didi

c - 每次操作后队列都会重置

转载 作者:行者123 更新时间:2023-11-30 16:09:27 28 4
gpt4 key购买 nike

我正在研究队列实现,但发生了一些奇怪的事情。 Enqueue 似乎可以工作,但更改没有被注册(大小保持为 0 不变)。据我所知,代码会将一个元素排入队列,但立即忘记它。输出为:
传递的数据:a34
返回之前:(null)
返回a:a34
传递的数据:bg
返回之前:(null)
返回a:bg
打印(空)
打印0
基于此,我猜测这与内存和范围有关,但我不确定如何解决它。下面是代码。

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

typedef struct node_s{
void* data;
struct node_s* next;
} node;

// queue structure
typedef struct queue_s{
node* back;
node* front;
int size;
} queue_t;

//helpers
node *newNode(void *data)
{
//create a new node* with data->data. @return: a node*
node *temp = (node *)malloc(sizeof(node));
temp->data = data;
temp->next = NULL;
return temp;
}

//deep copy a n2
node* copy(node* n2){
node *temp = (node *)malloc(sizeof(node));
temp->data=n2->data;
temp->next=n2->next;
return temp;
}
queue_t que_create(void)
{
queue_t new;
new.size = 0;
node *front = (node *)malloc(sizeof(node));
node *back = (node *)malloc(sizeof(node));
new.front=front;
new.back=back;
return new;
}

void que_destroy(queue_t queue)
{
while (queue.size > 0)
{
que_dequeue(queue);
}
}

void que_clear(queue_t queue)
{
while (que_size(queue) != 0)
{
que_dequeue(queue);
}
}

void que_enqueue(queue_t queue, void *data)
{
// Create a new LL node
printf("Data passed: %s\n",data);
node *temp = newNode(data);
// If queue is empty, then new node is front and back
if (queue.size == 0){
printf("Back befor:%s\n",queue.back->data);
queue.front = copy(temp);
queue.back = copy(temp);
queue.size=queue.size+1;
free(temp);
printf("Back a:%s\n",queue.back->data);
return;
}
// Add the new node at the end of queue
queue.back->next = copy(temp);
queue.back = temp;
printf("Back2:%s\n",queue.back->data);

if (data != NULL){
queue.size=queue.size+1;
}
//free(temp);
}

void que_dequeue(queue_t queue)
{
if (queue.size == 0)
{
printf("Deq on an empty q");
return; //break here
}
else if (queue.size == 1)
{
//only 1 element
queue.front = NULL;
queue.back = NULL;
}
else
{
node* temp = newNode(NULL);
temp=queue.front->next;
queue.front = copy(temp);
free(temp);
}
queue.size=queue.size-1;
}

const void *que_front(const queue_t queue)
{
//return queue.front->data;
return queue.front;
}

size_t que_size(queue_t queue)
{
return (size_t)queue.size;
}

int main(void){
queue_t q=que_create();
que_enqueue(q,"a34");
que_enqueue(q,"bg");
node* f=(node *)que_front(q);
printf("Print %s\n",f->data);
printf("Print %d\n",q.size);
return 0;
}

最佳答案

@Paul Ogilvie 在评论中回答了这个问题。 C 不是“按值传递”,因此代码将编辑队列的副本而不是实际的东西。这是通过传递一个指针来修复的,该指针将更改地址处的值

关于c - 每次操作后队列都会重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59140622/

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