/* @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))
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执行停在该断点处。)是程序员必须掌握的技能之一。