一、queue.h
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include <stdio.h>
#include <stdlib.h>
#define MAX 8
typedef int DataType;
typedef struct sequence
{
DataType data[MAX];
int front;
int tail;
}queue, *queuePtr;
//创建
queuePtr create();
//判空
int empty(queuePtr Q);
//判满
int fill(queuePtr Q);
//入队
int push(queuePtr Q, DataType e);
//遍历
void show(queuePtr Q);
//出队
int pop(queuePtr Q);
//顺序队列的大小
int size(queuePtr Q);
//销毁
void my_free(queuePtr Q);
#endif
二、queue.c
#include "queue.h"
//创建
queuePtr create()
{
queuePtr Q = (queuePtr)malloc(sizeof(queue));
if(NULL == Q)
{
printf("创建失败!\n");
return NULL;
}
Q->front = Q->tail = 0;
printf("创建成功!\n");
return Q;
}
//判空
int empty(queuePtr Q)
{
if(NULL == Q)
{
printf("判空失败!\n");
return -1;
}
return Q->front == Q->tail;
}
//判满
int fill(queuePtr Q)
{
if(NULL == Q)
{
printf("判满失败!\n");
return -1;
}
return (Q->tail+1)%MAX == Q->front;
}
//入队
int push(queuePtr Q, DataType e)
{
//判断所接受的顺序队列是否合法
//判满
if(NULL == Q || fill(Q))
{
printf("入队失败!\n");
return 0;
}
//入队(将数据放入下标为tail的位置)
Q->data[Q->tail] = e;
//成功入队,队尾偏移
Q->tail = (Q->tail+1)%MAX;
return 1;
}
//遍历
void show(queuePtr Q)
{
//判断所接受的顺序队列是否合法
//判空
if(NULL == Q || empty(Q))
{
printf("遍历失败!\n");
return ;
}
for(int i=Q->front; i%MAX != Q->tail;)
{
printf("%d ", Q->data[i]);
i = (i+1)%MAX;
}
printf("\n");
}
//出队
int pop(queuePtr Q)
{
if(NULL == Q || empty(Q))
{
printf("出队失败!\n");
return 0;
}
printf("%d出队\n", Q->data[Q->front]);
Q->front = (Q->front+1)%MAX;
return 1;
}
//顺序队列的大小
int size(queuePtr Q)
{
if(NULL == Q)
{
printf("失败!\n");
return -1;
}
//
if(Q->tail%MAX > Q->front%MAX)
{
Q->data[Q->tail] = (Q->tail%MAX) - (Q->front%MAX);
printf("顺序队列大小为:%d\n", Q->data[Q->tail]);
}
else
{
Q->data[Q->tail] = (Q->front%MAX) - (Q->tail%MAX);
printf("顺序队列大小为:%d\n", Q->data[Q->tail]);
}
}
//销毁
void my_free(queuePtr Q)
{
if(NULL == Q)
{
printf("销毁失败!\n");
return ;
}
free(Q);
Q=NULL;
printf("销毁成功!\n");
}
三、main.c
#include "queue.h"
int main()
{
//创建
queuePtr Q = create();
//入队
push(Q, 10);
push(Q, 20);
push(Q, 30);
push(Q, 40);
push(Q, 50);
push(Q, 60);
push(Q, 70);
//遍历
show(Q);
//出队
pop(Q);
show(Q);
pop(Q);
show(Q);
pop(Q);
show(Q);
//再次入队测试
push(Q, 11);
show(Q);
push(Q, 22);
show(Q);
push(Q, 33);
show(Q);
//顺序队列大小
size(Q);
//销毁
my_free(Q);
Q=NULL;
return 0;
}
四、知识点思维导图