1.带头结点的链队列:
#include<stdio.h>
#include<stdlib.h>
//链队列的数据类型定义
#define ElemType int
typedef struct LinkNode{
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
int size; //这个结构体成员用来保存当前的链队列元素个数
}LinkQueue;
//链队列初始化:
void InitQueue(LinkQueue &Q)
{
Q.front=(LinkNode*)malloc(sizeof(LinkNode));
Q.rear=Q.front;
Q.front->next=NULL;
Q.size=0;
return;
}
//链队列判空操作:
bool IsEmpty(LinkQueue Q)
{
if(Q.front==Q.rear)return true;
else return false;
}
//链队列的入队操作:
void EnQueue(LinkQueue &Q,ElemType x)
{
LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
Q.size++;
return;
}
//链队列元素出队:
bool DeQueue(LinkQueue &Q,ElemType &x)
{
if(Q.front==Q.rear)return false;
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
Q.size--;
return true;
}
//彻底销毁链队列
void DestroyQueue(LinkQueue &Q)
{
LinkNode *p=Q.front;
while(Q.front)
{
p=Q.front;
Q.front=Q.front->next;
free(p);
}
return;
}
int main()
{
int x;
//先声明一个链队列
LinkQueue Q;
//初始化队列:
InitQueue(Q);
//先判一次空:
if(IsEmpty(Q))printf("\n此队列为空\n");
else printf("\n此队列不空\n");
//输入新元素并将其入队
printf("\n开始输入新元素\n");
while(1)
{
scanf("%d",&x);
if(x==9999)
{
printf("\n输入结束\n");
break;
}
EnQueue(Q,x);
printf("\n当前队列中共有: %d个元素\n",Q.size);
}
//让这些元素出队
printf("\n所有元素依次出队:\n");
while(DeQueue(Q,x))printf("%d ",x);
printf("\n");
//彻底销毁链队列
DestroyQueue(Q);
return true;
}
2.不带头结点的链队列:
#include<stdio.h>
#include<stdlib.h>
//链队列的数据类型定义
#define ElemType int
typedef struct LinkNode{
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct{
LinkNode *rear,*front;
int size;
}LinkQueue;
//链队列初始化:
void InitQueue(LinkQueue &Q)
{
Q.front=NULL;
Q.rear=NULL;
Q.size=0;
return;
}
//链队列判空操作:
bool IsEmpty(LinkQueue Q)
{
if(Q.front==NULL)return true;
else return false;
}
//链队列的入队操作:
void EnQueue(LinkQueue &Q,ElemType x)
{
LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
if(Q.front==NULL)
{
Q.front=s;
Q.front->next=NULL;
Q.rear=Q.front;
}
else{
Q.rear->next=s;
Q.rear=s;
}
Q.size++;
return;
}
//链队列元素出队:
bool DeQueue(LinkQueue &Q,ElemType &x)
{
if(Q.front==NULL)return false;
LinkNode *p=Q.front;
x=p->data;
Q.front=p->next;
if(Q.rear==p){
Q.rear=NULL;
Q.front=NULL;
}
free(p);
Q.size--;
return true;
}
//彻底销毁链队列
void DestroyQueue(LinkQueue &Q)
{
LinkNode *p=Q.front;
while(Q.front)
{
p=Q.front;
Q.front=Q.front->next;
free(p);
}
return;
}
int main()
{
int x;
//先声明一个链队列
LinkQueue Q;
//初始化队列:
InitQueue(Q);
//先判一次空:
if(IsEmpty(Q))printf("\n此队列为空\n");
else printf("\n此队列不空\n");
//输入新元素并将其入队
printf("\n开始输入新元素\n");
while(1)
{
scanf("%d",&x);
if(x==9999)
{
printf("\n输入结束\n");
break;
}
EnQueue(Q,x);
printf("\n当前队列中共有: %d个元素\n",Q.size);
}
//让这些元素出队
printf("\n所有元素依次出队:\n");
while(DeQueue(Q,x))printf("%d ",x);
printf("\n");
//彻底销毁链队列
DestroyQueue(Q);
return true;
}