#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define maxSize 100
/*
链队,用单链表实现,一定范围内不会出现队列上溢的情况
(1)两个状态
队空: lqu->rear==NULL; 或者 lqu->front==NULL;
队满: 几乎不会,内存满了队才满
(2)两个操作
进队(假设p指向进队元素):
lqu->rear->next=p; lqu->rear=p;
出队(假设x存储出队元素):
p=lqu->front; lqu->front=p->next; x=p->data; free(p);
*/
//链队结点定义(单链表结点定义)
typedef struct QNode
{
int data;
QNode *next;
}QNode;
//链队定义
typedef struct
{
QNode *front;
QNode *rear;
}LiQueue;
//初始化链队
void initLiQueue(LiQueue *&lique)
{
lique=(LiQueue*)malloc(sizeof(LiQueue));
lique->front=lique->rear=NULL;
}
//判断链队是否为空
int isEmpty(LiQueue lique)
{
if(lique.front==NULL||lique.rear==NULL)
return 1;
else
return 0;
}
//链队-元素入队
void enLiQueue(LiQueue *lique,int x)
{
QNode *p;
p=(QNode*)malloc(sizeof(QNode));
p->data=x;
p->next=NULL;
if(lique->rear==NULL) //若链队此时为空,则新结点为链队的首结点
lique->front=lique->rear=p;
else
lique->rear->next=p;
lique->rear=p;
}
//打印链队中的元素
void outputLiQueue(LiQueue *lique)
{
if(lique->front==NULL)
{
printf("链队为空!");
}
printf("链队元素为:\t");
QNode *p;
p=lique->front;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
//链队-出队-返回队头元素值
int deLiQueue(LiQueue *lique)
{
int x;
QNode *p;
//1、判断链队是否为空
if(lique->front==NULL)
{
printf("链队为空!");
return 0;
}
else
p=lique->front;
//2、判断非空链队的元素是否只有一个
if(lique->front==lique->rear) //链队非空,且只有一个元素时,出队时要特殊处理
lique->front=lique->rear=NULL; //(容易忘记!!!易错点!!!!!!!!!)
else
lique->front=lique->front->next;
x=p->data;
free(p);
return x;
}
int main()
{
//初始化队列
LiQueue *lique;
initLiQueue(lique);
//元素进队
srand(time(0));
for(int i=0;i<5;i++)
{
enLiQueue(lique,rand()%50); //生成5个随机数,入链队
}
//打印链队中的元素
outputLiQueue(lique);
//删除链队队头元素
printf("\n");
printf("删除一个链队头元素:%d\t",deLiQueue(lique));
//打印链队中的元素
outputLiQueue(lique);
printf("删除一个链队头元素:%d\t",deLiQueue(lique));
//打印链队中的元素
outputLiQueue(lique);
return 0;
}