//用数组结构实现队列 # include<stdio.h> #include<stdlib.h> #define maxsize 10 //数组大小不能是变量,必须宏定义或者写进去 typedef struct { int que[maxsize]; int tail,head;//数组实际存储的头下标和尾下标 int *q; } QUEUE; QUEUE initialize(QUEUE queue)//队列初始化 ????为什么成指针类型了,已会 { queue.tail=queue.head=0; queue.q=(int*)malloc(sizeof(int)*maxsize); return (queue); }//刚开始在这块把结构体指针变量和结构体一般变量搞混了, //结构体指针变量是p1->q这个结构,结构体一般变量就是p1.q就好了 int show(QUEUE* queue)//显示队列 { int i; if(queue->head==queue->tail) { printf("该队列为空\n"); return; } for(i=(queue->head+1)%maxsize;i<=queue->tail;i=(i+1)%maxsize) //由于43,44行的原因,此处head要+1 printf("queue->que[%d]=%d\n",i,queue->que[i]); printf("\nQueue head is %d\n",queue->head); printf("Queue tail is %d\n\n",queue->tail); } int inqueue(QUEUE* queue,int x)//元素进队列 { if(((queue->tail+1)%maxsize)==queue->head)//此处舍弃了一个存储空间,因为若 //不舍弃,空和满的判断条件就一样,分辨不出来 //也不能少申请一个空间,因为是循环队列 //也不能让head指向当前第一个数据,因为无法区分存放了一个数据还是空 { printf("The queue is overflow\n"); return; } queue->tail=(queue->tail+1)%maxsize;//最开始tail等于0,所以第一圈是 //从que[1]开始插入数据的.所以第一圈que[0]是乱码 queue->que[queue->tail]=x; } int outqueue(QUEUE* queue)//列表删除元素 { if(queue->head==queue->tail) { printf("该队列为空\n"); return; } queue->head=(queue->head+1)%maxsize; } void main() { QUEUE queue; queue =initialize(queue);//若子函数是指针类型,则为initialize(&queue),传地址 show(&queue); inqueue(&queue,32); inqueue(&queue,42); inqueue(&queue,52); inqueue(&queue,62); inqueue(&queue,92); inqueue(&queue,82); // inqueue(&queue,72); show(&queue); outqueue(&queue); show(&queue); }
这次代码的可读性好多了,中间碰到很多问题,都写在注释里了,学会了用typeof定义结构体。