每次操作后队列都会重置

问题描述 投票:0回答:1

我正在队列实现中,发生了一些奇怪的事情。入队似乎有效,但是更改尚未注册(大小保持不变,为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;
}
c queue abstract-data-type
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.