队列的特征就是先进先出,我们采用链式队列进行书写。
对于队列的操作有以下几点
1:初始化队列 2:入队 3:出对 4:展示队列中元素 5:取对头元素 6:销毁队列(当然还有其他的。。。自己补充哈)
话不多说,上代码你们看吧!!!
/*************************************************************************
> File Name: queue.h
> Created Time: Sun 22 Jul 2018 08:22:05 PM CST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define TRUE 1
#define FALSE 0
typedef int boolean; //c语言中没有bool类型,只能重定义
typedef int Elemtype; //元素类型重定义
typedef struct Node //每一个元素节点结构
{
struct Node *next;
Elemtype data;
}node;
typedef struct queue //队列结构
{
node* qhead; //头指针
node* qtail; //尾指针
}Queue;
void InitQueue(Queue *que); //初始化队列
void PushQueue(Queue *que,Elemtype val); //入队
void show(Queue *que); //展示队列元素信息
void PopQueue(Queue *que); //出队
Elemtype Getqhead(Queue *que); //获取队首元素
void Destroy(Queue *que); //销毁队列
/*************************************************************************
> File Name: queue.c
> Created Time: Sun 22 Jul 2018 09:17:11 PM CST
************************************************************************/
#include"queue.h"
void InitQueue(Queue *que)
{
que->qhead=NULL;
que->qtail=NULL;
}
static node* BuyNode(Elemtype val) //申请一个节点元素,入队元素
{
node *q=NULL;
node *p=(node *)malloc(sizeof(node)); //不能在栈上申请空间,因为不能返回一个栈上的地址或者引用,这个函数结束后栈上空间系统会释放掉的。
if(p!=NULL)
{
p->data=val;
p->next=NULL;
q=p;
}
return q;
}
void PushQueue(Queue *que,Elemtype val)
{
assert(que!=NULL);
node *p=BuyNode(val);
if(p!=NULL) //是否申请节点成功
{
if(que->qhead==NULL) //是第一个入队的元素
{
que->qhead=p;
que->qtail=p;
}
else //不是第一个入队的元素,队列中已存在元素
{
que->qtail->next=p;
que->qtail=p;
}
}
}
static boolean Is_Empty(Queue *que) //一个本文件可见的判断队列是否为空
{
if(que->qhead==que->qtail&&que->qtail==NULL)
{
return TRUE;
}
else
return FALSE;
}
void PopQueue(Queue *que)
{
assert(que!=NULL);
if(Is_Empty(que))
{
return;
}
node *p=que->qhead; //用p先标记一会所要释放的元素
que->qhead=que->qhead->next; //将头指针指向队列中的第二个元素
if(que->qhead==NULL) //队列中只有一个元素
{
que->qtail=NULL; //将尾指针赋空,否则释放P,尾指针成为野指针
}
free(p);
}
void show(Queue *que)
{
assert(que!=NULL);
node *p=que->qhead;
printf("从队头到尾的元素依次是:");
while(p!=que->qtail)
{
printf("%d ",p->data);
p=p->next;
}
if(p!=NULL) //队头元素输出
printf("%d\n",p->data);
}
Elemtype Getqhead(Queue *que)
{
assert(que!=NULL);
if(Is_Empty(que))
{
return -1111111; //输出一个错误数值
}
else
{
return que->qhead->data;
}
}
void Destroy(Queue *que)
{
assert(que!=NULL);
while(que->qhead!=que->qtail)
{
PopQueue(que);
show(que);
}
if(que->qhead==que->qtail&&que->qhead!=NULL)
{
free(que->qhead);
que->qhead=NULL;
que->qtail=NULL;
}
}
/*************************************************************************
> File Name: main.c
> Created Time: Sun 22 Jul 2018 09:18:17 PM CST
************************************************************************/
#include"queue.h"
int main() //测试代码
{
Queue que;
InitQueue(&que);
int i=1;
for(;i<10;i++)
{
PushQueue(&que,i*2);
}
show(&que);
PopQueue(&que);
show(&que);
printf("队头元素是:%d\n",Getqhead(&que));
Destroy(&que);
show(&que);
printf("\n");
exit(0);
}