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