#include<stdio.h>
#include<stdlib.h>
typedef char QElemType;
//链队列的节点数据类型Qnode和指向节点的指针QueueLink数据类型描述
typedef struct qnode
{
QElemType data;
struct qnode *next;
}Qnode,*QueueLink;
//链队列的数据类型描述
typedef struct
{
QueueLink front;
QueueLink rear;
}QLink;
//1.初始化操作
int initLinkQueue(QLink *LQ)
{
LQ->front=LQ->rear=(QueueLink)malloc(sizeof(Qnode));
if(LQ->front==NULL) return 0;
LQ->front->next=NULL;
return 1;
}
//2.判断队空
int LinkQueueEmpty(QLink Q)
{
if(Q.front=Q.rear) return 1;
else return 0;
}
//3.求队列长度
int LinkQueueLength(QLink Q)
{
QueueLink p;int n=0;
if(Q.front==Q.rear)return 0;
p=Q.front->next;
while(p)
{
n++;
p=p->next;
}
return n;
}
//4.得到队头
int GetHead(QLink Q,QElemType *e)
{
if(Q.front==Q.rear)return 0;
*e=Q.front->next->data;
return 1;
}
//5.进队列
int LinkEnQueue(QLink *LQ,QElemType e)
{
QueueLink p=(QueueLink)malloc(sizeof(Qnode));
if(p==NULL) return 0;
p->data=e;
p->next=NULL; //最后一个结点不指向谁
LQ->rear->next=p; //LQ->rear指向的是之前的最后一个结点,链左边的线连接
LQ->rear=p; //rear指向最后一个结点
}
//6.出队列
int LinkDeQueue(QLink *LQ,QElemType *e)
{
QueueLink p;
if(LQ->front==LQ->rear) return 0;
*e=LQ->front->next->data;
p=LQ->front->next;
LQ->front->next=p->next;
if(LQ->rear==p)
LQ->rear=LQ->front;
free(p);
return 1;
}
//7.遍历队列
void LinkQueueTraverse(QLink Q)
{
QueueLink p=Q.front->next;
while(p)
{
printf("%c\n",p->data);
p=p->next;
}
}
void main()
{
QLink Q;
char e;
initLinkQueue(&Q);
LinkEnQueue(&Q,'A');
LinkEnQueue(&Q,'B');
LinkEnQueue(&Q,'C');
LinkQueueTraverse(Q);
printf("\n");
LinkDeQueue(&Q,&e);
LinkQueueTraverse(Q);
}
运行结果