#include <stdio.h>
#include <stdlib.h>
//定义函数结果状态码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//定义数据类型
typedef int ElemType ;
//定义程序返回状态类型
typedef int State;
//链队列结点存储结构
typedef struct _QueueNode
{
ElemType data;
struct _QueueNode *next;
}QueueNode;
//链队列结构定义
typedef struct _LinkQueue
{
QueueNode *front;//指向队头结点指针
QueueNode *rear; //指向队尾结点指针
}LinkQueue;
/*************************************************
Function: InitQueue
Description: 初始化,构造空队列,队列不包含头结点
Input: 链队结构指针 LinkQueue *queue
Output:
Return: 成功返回OK
Others:
*************************************************/
State InitQueue(LinkQueue *queue)
{
queue->front = queue->rear = NULL;
return OK;
}
/*************************************************
Function: IsQueueEmpty
Description: 链队列是否为空
Input: 链队结构指针 LinkQueue *queue
Output:
Return: 为空返回TRUE,否则返回FALSE
Others: 要判断队头和队尾都为空
*************************************************/
State IsQueueEmpty(LinkQueue *queue)
{
if((queue->front == NULL) && (queue->rear == NULL))
return TRUE;
else
return FALSE;
}
//链队列由于没有头结点
//入队时要判断链队列是否为空
//出队时要判断是否只有一个元素
/*************************************************
Function: EnQueue
Description: 入队
Input: 链队结构指针 LinkQueue *queue
数据元素 ElemType e
Output:
Return: 成功返回OK,失败返回ERROR
Others: 新结点next为NULL,
重要 入队时要判断是否为空链队
非空链队更新时与链栈不同,还要更新前一个队尾的next
*************************************************/
State EnQueue(LinkQueue *queue, ElemType e)
{
//申请结点
QueueNode *q = malloc(sizeof(QueueNode));
if(q == NULL)
{
printf("Apply QueueNode failed!");
return ERROR;
}
//给结点赋值
q->data = e;
q->next = NULL;
//更新连队结构指针
//判断是否为空链队
if(IsQueueEmpty(queue) == TRUE)
{
queue->front = queue->rear = q;
}
else
{
queue->rear->next = q;
queue->rear = q;
}
return OK;
}
/*************************************************
Function: DeQueue
Description: 出队
Input: 链队结构指针 LinkQueue *queue
Output:
Return: 成功返回数据元素,失败程序退出
Others: 更新链队结构指针时要判断是否只有一个结点
*************************************************/
ElemType DeQueue(LinkQueue *queue)
{
//判断链队是否为空
if(IsQueueEmpty(queue))
{
printf("The linkqueue is empty!");
exit(EXIT_FAILURE);
}
//保存队头结点
QueueNode *q = queue->front;
//保存返回值
ElemType e = q->data;
//更新链队结构指针
//判断是否只有一个结点
if(q == queue->rear)
queue->rear = queue->front = NULL;
else
queue->front = q->next;
//释放队头结点空间
free(q);
return e;
}
/*************************************************
Function: GetHead
Description: 取队头元素
Input: 链队结构指针 LinkQueue *queue
Output:
Return: 成功返回数据元素,否则程序退出
Others:
*************************************************/
ElemType GetHead(LinkQueue *queue)
{
//判断链队是否为空
if(IsQueueEmpty(queue))
{
printf("The linkqueue is empty!");
exit(EXIT_FAILURE);
}
return queue->front->data;
}
/*************************************************
Function: ClearQueue
Description: 清空队列
Input: 链队结构指针 LinkQueue *queue
Output:
Return: 成功返回OK
Others:
*************************************************/
State ClearQueue(LinkQueue *queue)
{
QueueNode *p,*q;
p = queue->front;
while(p)
{
q = p;
p = p->next;
free(q);
}
queue->front = queue->rear = NULL;
return OK;
}
/*************************************************
Function: GetLength
Description: 取得队列的长度
Input: 链队结构指针 LinkQueue *queue
Output:
Return: 返回队列的长度
Others:
*************************************************/
int GetLength(LinkQueue *queue)
{
int count = 0;
QueueNode *p = queue->front;
//第n轮循环后,i为n,p指向第n+1个结点
while(p)
{
count++;
p = p->next;
}
return count;
}
数据结构C语言实现之链队列
最新推荐文章于 2023-08-31 16:25:18 发布