您的位置:首页 > 编程语言 > C语言/C++

C语言队列入门程序举例

2017-07-10 11:23 369 查看
**

C语言队列入门程序举例

**

程序功能

创建一个7个数据的循环队列,创建完成后立即返回排头和队尾元素指针,并返回队中元素,然后将倒数三个元素退队,退队后返回退队元素是什么,然后再返回队中元素和现在的排头和队尾指针。

源代码

main.h


#include <stdio.h>
#include <math.h>
#include "Queue.h"

//函数声明
void InitQueue(Queue *Q);
void EnQueue(Queue *Q, int key);
int DeQueue(Queue *Q);
int IsQueueEmpty(Queue *Q);
int IsQueueFull(Queue *Q);


Queue.h


#include <stdio.h>
#include <stdlib.h>
typedef struct queue
{
int queuesize;   //数组的大小
int head, tail;  //队列的头和尾下标
int *q;          //数组头指针
}Queue;


main.c


#include "main.h"

void main()
{
Queue example1,example2,*Q,*X;
int i,key,size,*h,*t;
Q=&example1;
X=&example2;
InitQueue(Q);
InitQueue(X);
printf("请输入七个整数\n");
for(i=0;i<7;i++)
{
scanf("%d",&key);
EnQueue(Q,key);
}
//遍历队列
h=&Q->q[Q->head];
t=&Q->q[Q->tail-1];
size=(int)(fabs((double)((Q->tail)-(Q->head)))); //队列中现有的元素个数
printf("输入完成\n您创建的队列的排头指针为\n%d\n队尾指针为\n%d\n队中各元素分别为\n",h,t);
if(size==0)
printf("队列为空\n");
else
for(i=0;i<size;i++)
printf("%d\t",Q->q[(Q->head+i)%(Q->queuesize)]);

//寄存其余元素
InitQueue(X);
for(i=0;i<size-3;i++)
EnQueue(X,DeQueue(Q));
for(i=3;i>0;i--)
printf("\n退队的倒数第%d个元素为\n%d\n",i,DeQueue(Q));

//恢复原队列剩余元素
for(i=0;i<size-3;i++)
EnQueue(Q,DeQueue(X));

//遍历剩余元素并输出头尾指针
h=&Q->q[Q->head];
t=&Q->q[Q->tail-1];
size=(int)(fabs((double)((Q->tail)-(Q->head)))); //队列中现有的元素个数
printf("此时队列的排头指针为\n%d\n队尾指针为\n%d\n队中剩余各元素分别为\n",h,t);
if(size==0)
printf("队列为空\n");
else
for(i=0;i<size;i++)
printf("%d\t",Q->q[(Q->head+i)%(Q->queuesize)]);

}


Queue.c


void InitQueue(Queue *Q)//初始化队列
{
Q->queuesize = 8;
Q->q = (int *)malloc(sizeof(int) * Q->queuesize); //分配内存
Q->tail = 0;
Q->head = 0;
}

void EnQueue(Queue *Q, int key)//入队
{
int tail = (Q->tail+1) % Q->queuesize; //取余保证,当quil=queuesize-1时,再转回0
if (tail == Q->head)                   //此时队列没有空间
{
printf("队列已满\n");
}
else
{
Q->q[Q->tail] = key;
Q->tail = tail;
}
}

int DeQueue(Queue *Q)//退队
{
int tmp;
if(Q->tail == Q->head)     //判断队列不为空
{
tmp=0;
printf("队列为空\n");
}
else
{
tmp = Q->q[Q->head];
Q->head = (Q->head+1) % Q->queuesize;
}
return tmp;
}

int IsQueueEmpty(Queue *Q)//判断队列是否为空
{
if(Q->head == Q->tail)
{
printf("队列为空\n");
return 0;
}
else
{
printf("队列不为空\n");
return 0;
}
}

int IsQueueFull(Queue *Q)//判断队列是否为满
{
if((Q->tail+1)% Q->queuesize == Q->head)
{
printf("队列已满\n");
return 0;
}
else
{
printf("队列未满\n");
return 0;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: