上数据结构课的时候老师让写了一个循环队列子系统。
代码如下:
#include<stdio.h> #include<malloc.h> #define MAXLEN 100 #define datatype char typedef struct //循环队列结构体 { datatype data[MAXLEN]; int rear,front,n; //rear对尾位置,front队首位置,n队列中元素个数; } csequeue; csequeue *line; //一个csequeue类型的指针; void inqueue() //进队; { char x; if(line==NULL) //如果指针为空 { line=(csequeue*)malloc(sizeof(csequeue)); //创建一个结构体 line->rear=line->front=1; //对rear,front,n初始化,==1可以是一个在MAXLEN范围内的任意值 line->n=0; } printf(" 请输入进队元素:"); scanf(" %c",&x); if(line->front ==(line->rear + 1) % MAXLEN) //判断队满,原理:队尾元素加1等于队首元素的时候判定为队满 { printf(" 队满,进队失败!"); return ; } line->rear=(line->rear+1)% MAXLEN; //队尾标记加一 line->data[line->rear]=x; //给队尾元素赋值 line->n++; //队列长度加一 printf(" 进队成功!!"); } void dequeue () //出队 { if(line==NULL||line->rear==line->front) //判断,如果指针为空,或者队空的情况; { printf(" 队空,出队失败!"); return ; } line->front=(line->front+1)%MAXLEN; //因为front所指位置元素不属于队列,所以先加后输出 printf(" 出队元素为:%c",line->data[line->front]); line->n--; } void showqueue () //显示队列; { int i; if(line==NULL||line->rear==line->front) { printf(" 队空!!!!"); return ; } i=line->front; printf(" 队列元素为:"); while(i!=line->rear) //当标记变量i不等于队尾位置时,line->data中(i+1)%MAXLEN元素,因为一开始front所指元素不属于队列 { printf(" %c",line->data[(i+1)%MAXLEN]); i=(i+1)%MAXLEN; //对MAXLEN取余使得i的值始终在零到MAXLEN范围内; } } void queuelength() //显示队列长度; { if(line==NULL) { printf(" 无队,请先创建队!"); return ; } printf(" 队列长度为:%d",line->n); } void returnn() { free(line); //释放队列==释放空间; return ; } int main () { int m=1; printf(" ----循环队列子系统c实现---- "); while(m!=0) { printf(" ****************************************** "); printf(" * 指令说明 * "); printf(" * 1----进 队 * "); printf(" * 2----出 队 * "); printf(" * 3----显 示 * "); printf(" * 4----队列长度 * "); printf(" * 0----返 回 * "); printf(" ****************************************** "); printf(" 请输入指令:"); scanf(" %d",&m); switch(m) { case 1: inqueue(); break; case 2: dequeue(); break; case 3: showqueue(); break; case 4: queuelength(); break; case 0: returnn(); return 0; default : printf(" 输入有误!请重新输入~ "); break; } } return 0; }