头文件 seqqueue.h
#ifndef _SEQQUEUE_H_
#define _SEQQUEUE_H_
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int datatype; //定义数据类型为int
#define MAXSIZE 10
typedef struct seqqueue{
datatype data[MAXSIZE];
int front,rear; //分别指向头尾元素
}seq_queue,*seq_pqueue;
seq_pqueue init_seqqueue1(); //构造一个空队列 方法1
void init_seqqueue2(seq_pqueue *Q); //构造一个空队列 方法2
bool is_full_seqqueue(seq_pqueue q); //判断队列是否满
bool is_empty_seqqueue(seq_pqueue q); //判断队列是否为空
bool in_seqqueue(datatype data,seq_pqueue q); //入队
bool out_seqqueue(seq_pqueue q,datatype *D); //出队
void show_seqqueue(seq_pqueue q); //输出队列中的元素
seq_pqueue init_seqqueue1() //构造一个空队列
{
seq_pqueue q;
q=(seq_pqueue)malloc(sizeof(seq_queue));
if(q==NULL)
{
printf("malloc failed!\n");
return NULL;
}
q->front=q->rear=MAXSIZE-1; //头指针和尾指针相等,队列为空
return q;
}
void init_seqqueue2(seq_pqueue *Q) //构造一个空队列 方法2
{
*Q=(seq_pqueue)malloc(sizeof(seq_queue));
if((*Q)==NULL)
{
printf("malloc failed!\n");
return ;
}
(*Q)->front=(*Q)->rear=MAXSIZE-1; //头指针和尾指针相等,队列为空
}
bool is_full_seqqueue(seq_pqueue q) //判断队列是否满
{
if((q->rear+1)%MAXSIZE==q->front)
return true;
else
return false;
}
bool is_empty_seqqueue(seq_pqueue q) //判断队列是否为空
{
if(q->rear==q->front)
return true;
else
return false;
}
bool in_seqqueue(datatype data,seq_pqueue q) //入队
{
//判断队列是否已满
if(is_full_seqqueue(q))
{
printf("队列已满!\n");
return false;
}
//入队
q->rear=(q->rear+1)%MAXSIZE;//队尾指针加1
q->data[q->rear]=data; //新元素插入队尾
return true;
}
bool out_seqqueue(seq_pqueue q,datatype *D) //出队
{
//判断队列是否为空
if(is_empty_seqqueue(q))
{
printf("队列已空!\n");
return false;
}
//出队
q->front=(q->front+1)%MAXSIZE;
*D=q->data[q->front];
return true;
}
void show_seqqueue(seq_pqueue q) //输出队列中的元素
{
int i;
if(is_empty_seqqueue(q))
return ;
//非空,从队头打印数据到队尾
for(i=(q->front+1)%MAXSIZE;i!=(q->rear+1)%MAXSIZE;i=(i+1)%MAXSIZE)
{
printf("%d\t",q->data[i]);
}
printf("\n");
}
#endif
测试文件 testSeqqueue.c
/*
用循环队列实现如下功能:
1. 用户从键盘输入整数,程序将其入队
2. 用户输入字母,程序将队头元素出队
在每一次出队和入队之后打印队列元素
*/
#include "seqqueue.h"
int main()
{
seq_pqueue q; //定义指向顺序队列的指针
datatype x,data;
int ret;
//初始化
init_seqqueue2(&q); //把Q的地址传进去
//入队
while(1)
{
printf("请输入一个整数(输入为字母时输出队头元素并打印队列元素):\n");
ret=scanf("%d",&data);
//清空输入缓冲区,
//不然输入字母进行出队时会因为缓冲区中的内容陷入死循环
while(getchar()!='\n');
//输入的是整数时,入队
if(ret==1)
{
if(in_seqqueue(data,q)) //入队成功,返回true,打印队列中的元素
show_seqqueue(q);
}
else //否则的话输入为字母出队
{
if(out_seqqueue(q,&x)) //出队成功
{
printf("队头元素为:%d\n",x);
show_seqqueue(q);
}
}
}
return 0;
}