概述
三段代码分别是队列的顺序存储,带头结点的链式存储队列,不带头结点的链式存储队列。
都包括着初始化、判空、入队 、创建、出队、遍历操作,三段代码都是键入9999即输入结束,方便大家调试。
队列的顺序存储
#include<stdio.h>
#include<stdlib.h>
# define MaxSize 50
typedef struct{
int data[MaxSize];
int front,rear;
}SqQueue;
void InitQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
bool QueueEmpty(SqQueue Q) //牺牲一个单元来判空
{
if(Q.front == Q.rear)
return true;
else
return false;
}
bool EnQueue(SqQueue &Q,int x)
{
if((Q.rear+1)%MaxSize==Q.front) //牺牲一个单元格来区分队空和队满
return false;
Q.data[Q.rear] = x;
Q.rear=(Q.rear + 1)%MaxSize;
return true;
}
void CreateQueue(SqQueue &Q)
{
int x = 0;
scanf("%d",&x);
while(x!=9999)
{
EnQueue(Q,x);
scanf("%d",&x);
}
}
bool DeQueue(SqQueue &Q,int &x)
{
if(Q.front == Q.rear) //判断队空
return false;
x=Q.data[Q.front];
printf("%d已出队\n",x);
Q.front = (Q.front + 1)%MaxSize;
return true;
}
bool GetTop(SqQueue Q,int &x) //读取队首元素
{
if(Q.front == Q.rear) //判断队空
return false;
x=Q.data[Q.front];
printf("队首元素为%d\n");
}
void Print(SqQueue Q)
{
while(Q.front!=Q.rear)
{
printf("%d ",Q.data[Q.front]);
Q.front = (Q.front + 1)%MaxSize;
}
}
int main()
{
SqQueue Q;
int x = 0;
InitQueue(Q); //初始化
CreateQueue(Q); //创建
EnQueue(Q,666); //666入队
DeQueue(Q,x); //出队
Print(Q); //遍历
return 0;
}
带头结点的链式存储队列
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode{ //链式队列结点
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear; //队列的队头和队尾指针
}LinkQueue;
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
bool QueueEmpty(LinkQueue Q) //判空
{
if(Q.front == Q.rear )
return true;
else
return false;
}
void EnQueue(LinkQueue &Q,int x) //进队
{
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data = x;
s->next =NULL;
Q.rear->next = s;
Q.rear = s; //修改尾指针
}
void CreateQueue(LinkQueue &Q) //创建队
{
int x = 0;
scanf("%d",&x);
while(x!=9999)
{
EnQueue(Q,x);
scanf("%d",&x);
}
}
bool DeQueue(LinkQueue &Q,int &x) //出队
{
if(Q.front == Q.rear)
return false;
LinkNode *D=Q.front->next ;
x=D->data;
Q.front->next =D->next ;
if(Q.rear == D)
Q.rear=Q.front; //只剩一个元素,删除后变空
free(D);
return true;
}
bool GetTop(LinkQueue Q,int &x) //读取队首元素,并用x返回
{
if(Q.front->next == NULL)
return false;
x=Q.front->next->data ;
printf("\n队首元素值为:%d\n",x);
return true;
}
void Print(LinkQueue Q) //遍历 Q
{
LinkNode *p=Q.front->next ;
while(p != Q.rear )
{
printf("%d ",p->data);
p=p->next ;
}
printf("%d ",Q.rear->data);
}
int main()
{
int x = 0;
int A = 0;
LinkQueue Q; //声明
InitQueue(Q); //初始化
CreateQueue(Q); //创建
EnQueue(Q,666); //666入队
DeQueue(Q,x); //出队
Print(Q); //遍历
GetTop(Q,A); //读取队首元素
return 0;
}
不带头结点的链式存储队列
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
void InitQueue(LinkQueue &Q) //不带头结点的初始化
{
Q.front = Q.rear = NULL;
}
bool QueueEmpty(LinkQueue Q) //判空
{
if(Q.front == Q.rear && Q.front==NULL)
return true;
else
return false;
}
void EnQueue(LinkQueue &Q,int x) //入队,注意两种情况
{
if(Q.front == Q.rear && Q.front ==NULL)
{
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data = x;
Q.front = Q.rear = s;
}
else
{
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data = x;
Q.rear->next = s;
Q.rear = s;
Q.rear->next=NULL;
}
}
void CreateQueue(LinkQueue &Q)
{
int x = 0;
scanf("%d",&x);
while(x!=9999)
{
EnQueue(Q,x);
scanf("%d",&x);
}
}
bool DeQueue(LinkQueue &Q,int &x)
{
if(Q.front == Q.rear && Q.front == NULL)
return false;
x=Q.front->data ;
printf("\n%d已出队\n",x);
if(Q.front==Q.rear)
{
Q.front = Q.rear = NULL;
return true;
}
else
{
Q.front=Q.front->next ;
return true;
}
}
bool GetTop(LinkQueue Q,int &x)
{
if(Q.front == Q.rear && Q.front == NULL)
return false;
x=Q.front->data ;
printf("队首元素为%d\n",x);
return true;
}
void Print(LinkQueue Q)
{
LinkNode *h=Q.front ;
while(h!= Q.rear )
{
printf("%d ",h->data);
h = h->next ;
}
printf("%d ",Q.rear->data);
}
int main()
{
int x = 0;
int A = 0;
LinkQueue Q; //声明
InitQueue(Q); //初始化
CreateQueue(Q); //创建
EnQueue(Q,666); //666入队
DeQueue(Q,x); //出队
GetTop(Q,A); //获取队首元素
Print(Q); //遍历
return 0;
}