我正在队列实现中,发生了一些奇怪的事情。入队似乎有效,但是更改尚未注册(大小保持不变,为0)。据我所知,代码将使一个元素入队,但立即将其遗忘。输出为:传递的数据:a34返回之前:(空)返回a:a34传递的数据:bg返回之前:(空)返回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不是“按值传递”,因此代码将编辑队列的副本,而不是实际的内容。通过传递一个指针来解决此问题,该指针将更改地址中的值