数据结构之队列

/*
功能:利用指针演示队列(插入队尾、删除对头、遍历队列)
作者:swcks
时间:2015.11.7
*/

#include<stdio.h>
#include<malloc.h>
#define Count 6 //define定义一个无法改变的常量

/*
结构体:
base指向创建的动态数组
front存放对头指向的下标值
rear存放队尾指向的下标值

typedef可以让Queue代替struct queue
*/
typedef struct queue
{
int* base;
int front;
int rear;
}Queue;

//函数声明
void init_queue(Queue*);
void in_queue(Queue*,int);
void out_queue(Queue*,int*);
void reverse_queue(Queue*);

int main()
{
int val; //存放出对列的值
Queue Q; //分配一个struct queue变量的内存
init_queue(&Q); //初始化队列
in_queue(&Q,1); //插入队尾元素
in_queue(&Q,2);
in_queue(&Q,3);
in_queue(&Q,4);
in_queue(&Q,5);
// in_queue(&Q,6);
printf("队列输出:\n");
reverse_queue(&Q); //遍历输出队列
putchar('\n');
out_queue(&Q,&val); //删除对头元素
printf("出队的元素:%d\n",val);
putchar('\n');
// in_queue(&Q,6);
printf("队列输出:\n");
reverse_queue(&Q);
putchar('\n');
return 0;
}

/*
功能:初始化队列
参数:传入Queue变量Q的地址

*/
void init_queue(Queue* q)
{
q->base=(int*)malloc(sizeof(int)*Count); //malloc是C语言中用来分配动态内存的函数,base指向malloc分配的内存空间
q->front=0;
q->rear=0;
return;
}

/*
功能:在队尾插入元素
参数:传入Queue变量Q的地址和需要插入元素的值
*/
void in_queue(Queue* q,int val)
{
/*
循环队列,当队尾指针指向数组的尾部时,再插入元素时,数组的空间就不够用了,而且当队头删除元素时,对头指针向上移动,
如果没有循环队列的话,数组空间就得浪费了

判断队列是否满,看看队尾指针下标加一对数组长度的余数是否等于对头指针下标,如果等于则队列已满
*/
if((q->rear+1)%Count==q->front)
{
printf("队列已满,不能插入!\n");
return;
}
q->base[q->rear]=val; //将val赋值给下标为rear的数组元素
q->rear=(q->rear+1)%Count; //将rear加1求余
return;
}

/*
功能:遍历队列并输出队列元素
参数:传入Queue变量Q的地址

*/
void reverse_queue(Queue* q)
{
/*
如果对头的下标与队尾的下标相等时,队列为空,这是队列是否
为空的判断条件
*/
if(q->front==q->rear)
{
printf("队列中没有元素,队列为空!");
return;
}
int a=q->front;
while(a!=q->rear) //循环条件直到a不等于队尾指针下标
{
printf("%d\t",q->base[a]); //输出下标为a的数组的值
a=(a+1)%Count; //下标a+1对数组长度求余
}
printf("\n");
return;
}

/*
功能:删除队头元素
参数:传入Queue变量Q的地址和存放删除元素值的地址
*/
void out_queue(Queue* q,int* val)
{
if(q->front==q->rear)
{
printf("队列中没有元素,队列为空!");
return;
}
*val=q->base[q->front]; //将下标为front的数组值赋值给*val
q->front=(q->front+1)%Count; //将front+1进行求余操作赋值给front
return;
}

posted @ 2015-11-07 22:47  swcks  阅读(272)  评论(0编辑  收藏  举报