队列是一种先进先出线性表,队列是线性表的特化 也具有线性表的性质分为:顺序队列与链式队列 链式队列与线性表的单链表相似只不过链式队列只 允许从头部进行删除、尾部进行插入.需要为链式队列 创建一个头结点包括两个指针,指向队头的指针(front) 与指向队尾的指针(rear).当两个指针相等时队列为空
lqueue.h
//链式队列
typedef int ElemType; //队列的数据类型
typedef struct node{
ElemType data; //队列的数据类型
struct node *next; //指向下一个结点
}QueNode,*QuePtr;
typedef struct{
QuePtr front; //指向队头的指针
QuePtr rear; //指向队尾的指针
}LinkQueue;
//函数声明
void InitQueue(LinkQueue *q); //链式队列初始化
bool IsEmpty(LinkQueue *q); //判队空
void printQueue(LinkQueue *q); //打印队列
void EnQueue(LinkQueue *q,ElemType e); //入队操作
ElemType DeQueue(LinkQueue *q); //出队操作
lqueue.cpp
链式队列(带头结点)
#include "lqueue.h"
#include <stdlib.h> //含有 malloc 函数的头文件
#include <stdio.h>
int main()
{
int n=1;
LinkQueue q;
InitQueue(&q);
printQueue(&q);
while(n!=0)
{
printf("\t\t/\n");
printf("\t\tinput your choice \n");
printf("\t\t1.En Queue \n");
printf("\t\t2.De Queue \n");
printf("\t\t/\n");
scanf("%d",&n);
switch(n)
{
int m,p;
case 1: printf("1.input the elem you want to push\n");
scanf("%d",&m);
EnQueue(&q,m);
printQueue(&q);
break;
case 2: p=DeQueue(&q);
printf(" 元素 %d 出队列! \n",p);
printQueue(&q);
break;
default:
break;
}
}
return 0;
}
void InitQueue(LinkQueue *q) //链式队列初始化
{
q->front=q->rear=(QueNode *)malloc(sizeof(QueNode));
if(q->front==NULL) printf("分配空间失败!\n");
else{
q->front->next=NULL; //初始为空
}
}
bool IsEmpty(LinkQueue *q) //判队空
{
if(q->front==q->rear) return 1;
else return 0;
}
void EnQueue(LinkQueue *q,ElemType e)//入队操作(尾插法)
{
QueNode *p=(QueNode *)malloc(sizeof(QueNode));
if(p==NULL) printf("分配空间失败!\n");
else{
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
}
void printQueue(LinkQueue *q) //打印队列
{
QueNode *p,*h;
printf("打印队列如下!\n");
if(IsEmpty(q)==1) printf("队列为空!\n");
else {
h=q->front;
for(p=h->next;p!=NULL;p=p->next)
{
printf("%d ",p->data);
}
}
printf("\n");
}
ElemType DeQueue(LinkQueue *q) //出队操作
{
QueNode *p;
int f;
//判断队空
if(IsEmpty(q)==1){
printf("队列为空!\n");
return 0;
}
else{
//若出队为最后一个结点 ,将尾指针指向头结点防止其悬空
if(q->front->next==q->rear) q->rear=q->front;
p=q->front->next;
f=p->data;
q->front->next=q->front->next->next;
free(p);
return f;
}
}