队列

//用数组结构实现队列
# 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定义结构体。

原文地址:https://www.cnblogs.com/sunmarvell/p/6064386.html