顺序循环队列和顺序表差不多,但是队列他是一头进一头出,用两个指针来表示,对于入队和出队全靠这两个指针进行操作!
/-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
//顺序循环队列
typedef int data_t;
typedef struct list
{
data_t data[SIZE];
int front; //队头元素的下标
int rear; //对尾元素的下一个位置下标
}squeue;
//创建
squeue *creatsqueue()
{
squeue *sq=(squeue *)malloc(sizeof(squeue));
if(sq==NULL)
{
perror("malloc");
return NULL;
}
memset(sq->data,0,sizeof(data_t)*SIZE);
sq->front=sq->rear=0;
return sq;
}
//判空
int squeue_is_empty(squeue *sq)
{
return(sq->rear==sq->front)?1:0;
}
//判满
int squeue_is_full(squeue *sq)
{
return((sq->rear+1)%SIZE==sq->front)?1:0;
}
//求表长
int squeue_length(squeue *sq)
{
return((sq->rear-sq->front+SIZE)%SIZE);
}
//入队
int squeue_in(squeue *sq,data_t data)
{
if(squeue_is_full(sq))
return -1;
sq->data[sq->rear]=data;
sq->rear=(sq->rear+1)%SIZE;
return 0;
}
//出队
data_t squeue_out(squeue *sq)
{
if(squeue_is_empty(sq))
return -1;
squeue *p=sq;
data_t data=p->data[p->front];
p->front=(p->front+1)%SIZE;
return data;
}
//清空
void squeue_clear(squeue *sq)
{
sq->front=sq->rear; //栈内的元素没有消失,只是遍历不到
}
//销毁
void squeue_xiaohui(squeue **sq)
{
free(*sq);
*sq=NULL;
}
//打印
void squeue_printf(squeue *sq)
{
int temp =sq->front;
while(temp<sq->rear)
{
printf("%d ",sq->data[temp]);
temp=(temp+1)%SIZE;
}
puts("");
}
int main(int argc, const char *argv[])
{
squeue *sq=creatsqueue();
int m=squeue_is_empty(sq);
int n=squeue_length(sq);
int a=squeue_is_full(sq);
printf("m=%d n=%d a=%d\n",m,n,a);
//入队
int i=0;
while(i<10)
{
squeue_in(sq,i+1);
i++;
}
//打印
squeue_printf(sq);
//出栈
int j=0;
while(j<5)
{
data_t data = squeue_out(sq);
printf("data=%d \n",data);
j++;
}
squeue_printf(sq);
//清空链表
squeue_clear(sq);
squeue_printf(sq);
//销毁链表
squeue_xiaohui(&sq);
squeue_printf(sq);
printf("null\n");
return 0;
}