循环队列
1.头文件
#ifndef __SEQUEUE_H__
#define __SEQUEUE_H__
#define N 7 //容量为10,最多存储9个数据
//需要空出一个位置,让判满和判空条件不一致
typedef int datatype;
//声明一个结构体,存放数组和下标
typedef struct
{
datatype data[N];
int front;
int rear;
}Sequeue;
//创建一个空的循环队列
Sequeue* create_sequeue(void);
//入队
void insert_sequeue(Sequeue* sq, datatype num);
//出队
datatype output_sequeue(Sequeue* sq);
//遍历
void show_sequeue(Sequeue* sq);
//获取列表长度
int counrlen_sequeue(Sequeue* sq);
//释放列表
void free_sequeue(Sequeue** p);
#endif
2.功能函数
#include <stdio.h>
#include <stdlib.h>
#include "./03_sequeue.h"
int isFull_sequeue(Sequeue* sq); //判满函数声明,如不想其他文件调用,加static限制成静态局部函数
//判空
int isNull_sequeue(Sequeue* sq);
//创建一个空的循环队列
Sequeue* create_sequeue(void)
{
//申请一个Sequeue类型大小的堆空间
Sequeue* sq = (Sequeue*)malloc(sizeof(Sequeue));
if (NULL == sq)
{
printf("申请循环队列失败\n");
return NULL;
}
//将队头和队尾赋值相等,且均为0
sq->front = sq->rear = 0;
return sq;
}
//判满
int isFull_sequeue(Sequeue* sq)
{
return (sq->rear+1)%N == sq->front ? 1:0;
}
//入队
void insert_sequeue(Sequeue* sq, datatype num)
{
//判断队列是否为满
if( 1 == isFull_sequeue(sq))
{
printf("循环队列已满,无法入队\n");
return ;
}
//将数据插入到队尾位置,即rear下标对应位置
sq->data[sq->rear] = num;
//更新队尾的下标位置,更新rear位置
sq->rear = (sq->rear+1)%N;
return ;
}
//判空
int isNull_sequeue(Sequeue* sq)
{
return sq->front == (sq->rear)%N ? 1:0;
}
//出队
datatype output_sequeue(Sequeue* sq)
{
//判断队列是否为空
if(1 == isNull_sequeue(sq))
{
printf("循环队列为空,出队失败\n");
return (datatype)-1;
}
//将数据从队头获取出来
datatype num = sq->data[sq->front];
//更新队头的下标位置,更新front位置
sq->front = (sq->front+1)%N;
return num;
}
//遍历
void show_sequeue(Sequeue* sq)
{
int i=0;
for(i=sq->front; i != sq->rear; i=(i+1)%N)
{
printf("%d ", sq->data[i]);
}
putchar(10);
return ;
}
//获取列表长度
int counrlen_sequeue(Sequeue* sq)
{
return ((sq->rear)-(sq->front)+N)%N;
}
//清空队列
void clean_sequeue(Sequeue* sq)
{
sq->rear = sq->front = 0;
return ;
}
//释放队列
void free_sequeue(Sequeue** p)
{
//p存储的是外部传入的sq的地址
//*p代表访问sq的空间
//清空队列
(*p)->rear = (*p)->front = 0;
//释放堆空间
free(*p);
(*p) = NULL;
return;
}
3.main函数
#include <stdio.h>
#include "./03_sequeue.h"
int main(int argc, const char *argv[])
{
Sequeue* sq = create_sequeue();
insert_sequeue(sq, 10);
insert_sequeue(sq, 20);
insert_sequeue(sq, 30);
insert_sequeue(sq, 10);
insert_sequeue(sq, 20);
insert_sequeue(sq, 30);
insert_sequeue(sq, 40);
show_sequeue(sq);
int a=counrlen_sequeue(sq);
printf("a=%d\n", a);
output_sequeue(sq);
output_sequeue(sq);
output_sequeue(sq);
output_sequeue(sq);
output_sequeue(sq);
output_sequeue(sq);
output_sequeue(sq);
show_sequeue(sq);
int b=counrlen_sequeue(sq);
printf("b=%d\n", b);
return 0;
}