循环队列,运行不出结果,求赐教

C语言 码拜 8年前 (2016-04-08) 999次浏览
/* @filename list.h */
#include<stdlib.h>
#include<malloc.h>
#include<stdio.h>
typedef struct queue 队列
{
	int *arr;//数组arr地址
	size_t cap;//容量
	size_t front;//队首位置
	size_t rear;//队尾位置
	size_t size;//当前队列中元素个数
}QUEUE;
void init_queue(QUEUE * que, size_t cap)  //初始化
{
	que = (QUEUE*)malloc(cap*sizeof(int));
	que->cap = cap;
	que->front = 0;
	que->rear = 0;
	que->size = 0;
}
void destroy_queue(QUEUE *que)  //删除
{
	free(que->arr);
	que->arr = NULL;
	que->cap = 0;
	que->front = 0;
	que->rear = 0;
	que->size = 0;
}
int  pop_queue(QUEUE *que)  //出队
{
	if (que->front >= que->cap)
	{
		que->front = 0;
	}
	que->size--;
	return que->arr[que->front++];
}
void push_queue(QUEUE *que, int data)  //入队
{
	if (que->rear >= que->cap)//下标越界
		que->rear = 0;
	que->arr[que->rear++] = data;//数据放进队尾,队尾后移
	que->size++;//个数加1
}
int  isfull_queue(QUEUE *que) //判断能否满
{
	if ((que->size) ==( que->cap))
		return 1;
	else
		return -1;
}
int isempty_queue(QUEUE *que) //能否为空
{
	if (que->size == 0)
		return 0;
	else
		return -1;
}
int getsize_queue(QUEUE *que) //当前元素个数
{
	return que->size;
}
void show_front(QUEUE *que)  //显示队首元素
{
	if (que->front >= que->cap)
		que->front = 0;
	printf("%d\n", que->arr[que->front]);
}
int main()
{
	QUEUE * qu=NULL;
	init_queue(qu, 5);
	int i;
	for (i = 0; i<5; i++)
	{
		if (isfull_queue(qu))
			push_queue(qu,i);
	}
	printf("size%d\n", getsize_queue(qu));
	while (!isempty_queue(qu))
	{
		printf("%d\n", pop_queue(qu));
	}
	destroy_queue(qu);
	getchar();
	return 0;
}
解决方案

80

三个问题:
1.你想通过init_queue给main函数的qu初始化分配空间,必须传二级指针或一级指针的引用才行
(传一级指针是没有用的,操作的只是他的一个副本而已)
2.没有给int *arr分配空间
3.main函数内while (!isempty_queue(qu))应该是while (isempty_queue(qu))

/* @filename list.h */
#include<stdlib.h>
#include<malloc.h>
#include<stdio.h>
typedef struct queue
{
	int *arr;
	size_t cap;
	size_t front;
	size_t rear;
	size_t size;
}QUEUE;
void init_queue(QUEUE ** que, size_t cap)
{
	*que = (QUEUE*)malloc(cap*sizeof(int));
	(*que)->arr = (int *)malloc(cap*sizeof(int));
	(*que)->cap = cap;
	(*que)->front = 0;
	(*que)->rear = 0;
	(*que)->size = 0;
}
void destroy_queue(QUEUE *que)
{
	free(que->arr);
	que->arr = NULL;
	que->cap = 0;
	que->front = 0;
	que->rear = 0;
	que->size = 0;
}
int  pop_queue(QUEUE *que)
{
	if (que->front >= que->cap)
	{
		que->front = 0;
	}
	que->size--;
	return que->arr[que->front++];
}
void push_queue(QUEUE *que, int data)
{
	if (que->rear >= que->cap)//下标越界
		que->rear = 0;
	que->arr[que->rear++] = data;//数据放进队尾,队尾后移
	que->size++;//个数加1
}
int  isfull_queue(QUEUE *que)
{
	if ((que->size) ==( que->cap))
		return 1;
	else
		return -1;
}
int isempty_queue(QUEUE *que)
{
	if (que->size == 0)
		return 0;
	else
		return -1;
}
int getsize_queue(QUEUE *que)
{
	return que->size;
}
void show_front(QUEUE *que)
{
	if (que->front >= que->cap)
		que->front = 0;
	printf("%d\n", que->arr[que->front]);
}
int main()
{
	QUEUE * qu=NULL;
	init_queue(&qu, 5);
	int i;
	for (i = 0; i<5; i++)
	{
		if (isfull_queue(qu))
			push_queue(qu,i);
	}
	printf("size%d\n", getsize_queue(qu));
	while (isempty_queue(qu))
	{
		printf("%d\n", pop_queue(qu));
	}
	destroy_queue(qu);
	getchar();
	return 0;
}

单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明循环队列,运行不出结果,求赐教
喜欢 (0)
[1034331897@qq.com]
分享 (0)