图示:链表队列结构模型
对此可做 如下声明
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int QElemType;
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QuenePtr;
typedef struct
{
QuenePtr front; /* 队头指针 */
QuenePtr rear; /* 队尾指针 */
int len;
}LinkQuene;
/*构造一个空队列 Q */
Status InitQuene(LinkQuene *Q)
{
Q->front = Q->rear = (QuenePtr)malloc(sizeof(QNode)); /* 创建头结点 */
if(!Q->front)
return ERROR;
Q->front->next = NULL; /* 设置头结点指向next指向空 */
Q->len = 0; /* 队列个数清零 */
return OK;
}
图示:空队列情况以及往空队列插入元素
图示:队列非空时的插入情况
/* 插入元素e到队尾 */
Status EnQuene(LinkQuene *Q, QElemType e)
{
QuenePtr p = (QuenePtr)malloc(sizeof(QNode));
if(!p)
return ERROR;
p->data = e;
p->next = NULL;
Q->rear->next = p; /* 插入到尾部 */
Q->rear = p; /* 插入好后再将尾指针指向p */
Q->len++;
return OK;
}
图示:将队列元素从队头弹出
图示:只有一个元素的弹出情况
/* 从队头弹出队列元素 */
Status DeQuene(LinkQuene *Q, QElemType *e)
{
if(Q->front == Q->rear)
return ERROR; /* 队列为空 */
QuenePtr p = Q->front->next; /* 指向第一个结点 */
*e = p->data;
Q->front->next = p->next; /* 头结点的next指针指向第一个结点的下面 */
if(Q->rear == p)
Q->rear = Q->front; /* 如果只包含一个结点,删除后需尾指针指向空,需要从指向头结点 */
free(p);
return OK;
}
/* 销毁队列 */
Status DestroyQuene(LinkQuene *Q)
{
while(Q->front) {
Q->rear = Q->front->next; /* 让队尾指针指向第一个结点 */
free(Q->front); /* 从头结点开始释放 */
Q->front = Q->rear; /* 指向下一个结点 */
}
return OK;
}
/* 从队头到队尾打印队列 */
void printQuene(LinkQuene * Q)
{
QuenePtr p = Q->front->next; /* 从第一个结点开始 */
while(p) { /* 当前节点不为空 */
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkQuene Quene;
LinkQuene * Q = &Quene;
InitQuene(Q);
EnQuene(Q,1);
EnQuene(Q,2);
EnQuene(Q,3);
EnQuene(Q,4);
printQuene(Q);
QElemType e;
DeQuene(Q,&e);
printf("e %d\n",e);
printQuene(Q);
DestroyQuene(Q);
return 0;
}
原文:https://www.cnblogs.com/wjundong/p/11626495.html