数据结构C语言版循环队列.docx
- 文档编号:8725295
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:7
- 大小:15.53KB
数据结构C语言版循环队列.docx
《数据结构C语言版循环队列.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版循环队列.docx(7页珍藏版)》请在冰豆网上搜索。
数据结构C语言版循环队列
数据结构C语言版_循环队列
/*
数据结构C语言版循环队列
P64
编译环境:
Dev-C++4.9.9.2
日期:
2011年2月12日
*/
#include<stdio.h>
#include<malloc.h>
typedefintQElemType;
//队列的顺序存储结构(可用于循环队列和非循环队列)
#defineMAXQSIZE5//最大队列长度(对于循环队列,最大队列长度要减1)
typedefstruct
{
QElemType*base;//初始化的动态分配存储空间,相当于一个数组头
//头指针,若队列不空,指向队列头元素,相当于一个下标
intfront;
//尾指针,若队列不空,指向队列尾元素的下一个位置,相当于一个下标
intrear;
}SqQueue;//空队列的标志是队头队尾指针都相同
//构造一个空队列Q
intInitQueue(SqQueue*Q)
{
//给队头队尾指针分配空间,并置空
(*Q).base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
//这里的Q.base相当于一个数组头
if(!
(*Q).base)//存储分配失败
exit(0);
(*Q).front=(*Q).rear=0;//下标初始化为0
return1;
}
//销毁队列Q,Q不再存在
intDestroyQueue(SqQueue*Q)
{
if((*Q).base)
free((*Q).base);
(*Q).base=NULL;
(*Q).front=(*Q).rear=0;//空队列的标志是队头队尾指针都相同,且为0
return1;
}
//将Q清为空队列
intClearQueue(SqQueue*Q)
{
(*Q).front=(*Q).rear=0;//空队列的标志是队头队尾指针都相同,且为0
return1;
}
//若队列Q为空队列,则返回1,否则返回0
intQueueEmpty(SqQueueQ)
{
if(Q.front==Q.rear)//队列空的标志
return1;
else
return0;
}
//返回Q的元素个数,即队列的长度
intQueueLength(SqQueueQ)
{
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
//若队列不空,则用e返回Q的队头元素,并返回1,否则返回0
intGetHead(SqQueueQ,QElemType*e)
{
if(Q.front==Q.rear)//队列空
return0;
//*(Q.base+Q.front)相当于Q.base[Q.front],即Q.base是数
//组头,表示第Q.front个元素
*e=*(Q.base+Q.front);
return1;
}
//插入元素e为Q的新的队尾元素
intEnQueue(SqQueue*Q,QElemTypee)
{
if(((*Q).rear+1)%MAXQSIZE==(*Q).front)//队列满
return0;
(*Q).base[(*Q).rear]=e;
(*Q).rear=((*Q).rear+1)%MAXQSIZE;
return1;
}
//若队列不空,则删除Q的队头元素,用e返回其值,并返回1;否则返回0
intDeQueue(SqQueue*Q,QElemType*e)
{
if((*Q).front==(*Q).rear)//队列空
return0;
*e=(*Q).base[(*Q).front];
(*Q).front=((*Q).front+1)%MAXQSIZE;
return1;
}
//从队头到队尾依次对队列Q中每个元素调用函数vi()
intQueueTraverse(SqQueueQ,void(*vi)(QElemType))
{
inti;
i=Q.front;
while(i!
=Q.rear)
{
vi(*(Q.base+i));
i=(i+1)%MAXQSIZE;
}
printf("\n");
return1;
}
voidvisit(QElemTypei)
{
printf("%d",i);
}
intmain()
{
intj;
inti=0,l;
QElemTyped;
SqQueueQ;
InitQueue(&Q);
printf("初始化队列后,队列空否?
%u(1:
空0:
否)\n",QueueEmpty(Q)
);
printf("请输入整型队列元素(不超过%d个),-1为提前结束符:
",MAXQSIZE-1);
do
{
scanf("%d",&d);
if(d==-1)
break;
i++;
EnQueue(&Q,d);
}while(i<MAXQSIZE-1);
printf("队列长度为:
%d\n",QueueLength(Q));
printf("现在队列空否?
%u(1:
空0:
否)\n",QueueEmpty(Q));
printf("连续%d次由队头删除元素,队尾插入元素:
\n",MAXQSIZE);
for(l=1;l<=MAXQSIZE;l++)
{
DeQueue(&Q,&d);
printf("删除的元素是%d,请输入待插入的元素:
",d);
scanf("%d",&d);
EnQueue(&Q,d);
}
l=QueueLength(Q);
printf("现在队列中的元素为:
\n");
QueueTraverse(Q,visit);
printf("共向队尾插入了%d个元素\n",i+MAXQSIZE);
if(l-2>0)
printf("现在由队头删除%d个元素:
\n",l-2);
while(QueueLength(Q)>2)
{
DeQueue(&Q,&d);
printf("删除的元素值为%d\n",d);
}
j=GetHead(Q,&d);
if(j)
printf("现在队头元素为:
%d\n",d);
ClearQueue(&Q);
printf("清空队列后,队列空否?
%u(1:
空0:
否)\n",QueueEmpty(Q));
DestroyQueue(&Q);
system("pause");
return0;
}
/*
输出效果:
初始化队列后,队列空否?
1(1:
空0:
否)
请输入整型队列元素(不超过4个),-1为提前结束符:
123-1
队列长度为:
3
现在队列空否?
0(1:
空0:
否)
连续5次由队头删除元素,队尾插入元素:
删除的元素是1,请输入待插入的元素:
4
删除的元素是2,请输入待插入的元素:
5
删除的元素是3,请输入待插入的元素:
6
删除的元素是4,请输入待插入的元素:
7
删除的元素是5,请输入待插入的元素:
8
现在队列中的元素为:
678
共向队尾插入了8个元素
现在由队头删除1个元素:
删除的元素值为6
现在队头元素为:
7
清空队列后,队列空否?
1(1:
空0:
否)
请按任意键继续...
*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 循环 队列