Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在将一个元素推送到队列之前增加队列的大小是如何让我产生错误的,而反过来又如何?_C_Data Structures - Fatal编程技术网

C 在将一个元素推送到队列之前增加队列的大小是如何让我产生错误的,而反过来又如何?

C 在将一个元素推送到队列之前增加队列的大小是如何让我产生错误的,而反过来又如何?,c,data-structures,C,Data Structures,正如我所说,如果我将q->size++(在push_queue函数中)放在包含将元素推送到队列的代码的if语句之前,程序的运行会崩溃。但是,如果我将该行放在if语句之后,它会完美地工作,即使与队列大小无关,代码如下: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct queue_node { int value; struct queue_node *next

正如我所说,如果我将q->size++(在push_queue函数中)放在包含将元素推送到队列的代码的if语句之前,程序的运行会崩溃。但是,如果我将该行放在if语句之后,它会完美地工作,即使与队列大小无关,代码如下:

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

struct queue_node
{
    int value;
    struct queue_node *next;
};

typedef struct queue_node queue_node;
struct queue
{
    queue_node *front ;
    queue_node *back ;
    int size;
};
typedef struct queue queue;


queue * create_queue()
{
    queue * q = malloc(sizeof(queue));
    q->back = q->front = NULL;
    q->size = 0;
    return q;
}
bool empty(queue *q)
{
    return (q->size == 0) ;
}

void push_queue(queue *q , int value)
{
    queue_node *qn = malloc(sizeof(queue_node));
    qn->next = NULL;
    qn->value = value;
    q->size++;

        if (empty(q))
    {
        q->back = q->front = qn;

    }
    else
    {
        q->back->next = qn;
        q->back = qn;

    }

}

int pop_queue(queue *q)
{
    if (empty(q))
    {
        printf("vide");
        return 0;

    }
        int value = q->front->value;
        queue_node *qn = q->front;
        q->front = q->front->next;
        free(qn);
        q->size--;
        return value;
}


int main ()
{
    queue *q = create_queue();
    push_queue(q,5);
    push_queue(q,9);
    push_queue(q,7);

    while (!empty(q))
        printf("%d\t",pop_queue(q));
    free(q);
    return 0;
}

#包括
#包括
#包括
结构队列节点
{
int值;
结构队列节点*下一步;
};
typedef结构队列\节点队列\节点;
结构队列
{
队列节点*前端;
队列_节点*返回;
整数大小;
};
typedef结构队列;
队列*创建_队列()
{
queue*q=malloc(sizeof(queue));
q->back=q->front=NULL;
q->size=0;
返回q;
}
bool empty(队列*q)
{
返回(q->size==0);
}
无效推送队列(队列*q,int值)
{
queue_node*qn=malloc(sizeof(queue_node));
qn->next=NULL;
qn->value=value;
q->size++;
if(空(q))
{
q->back=q->front=qn;
}
其他的
{
q->back->next=qn;
q->back=qn;
}
}
int pop_队列(队列*q)
{
if(空(q))
{
printf(“vide”);
返回0;
}
int value=q->front->value;
队列_节点*qn=q->front;
q->front=q->front->next;
免费(qn);
q->尺寸--;
返回值;
}
int main()
{
队列*q=创建_队列();
推送队列(q,5);
推送队列(q,9);
推送队列(q,7);
而(!空(q))
printf(“%d\t”,pop_队列(q));
免费(q);
返回0;
}

推送队列
首先检查队列是否为空<代码>空使用
大小
。如果在检查
empty
之前增加大小,
empty
将始终为false。第一次按下时,
q->back
将为空,
q->back->next
将出现故障

注意:由于这是一个“pop”,所以“pop”是一个错误的术语。“推送”和“弹出”与。考虑“入队”和“脱队”。