数据结构C语言实现之链队列
来源:互联网 发布:js把字符串转化成日期 编辑:程序博客网 时间:2024/04/26 18:27
#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: InitQueueDescription: 初始化,构造空队列,队列不包含头结点Input: 链队结构指针 LinkQueue *queueOutput:Return: 成功返回OKOthers:*************************************************/State InitQueue(LinkQueue *queue){ queue->front = queue->rear = NULL; return OK;}/*************************************************Function: IsQueueEmptyDescription: 链队列是否为空Input: 链队结构指针 LinkQueue *queueOutput:Return: 为空返回TRUE,否则返回FALSEOthers: 要判断队头和队尾都为空*************************************************/State IsQueueEmpty(LinkQueue *queue){ if((queue->front == NULL) && (queue->rear == NULL)) return TRUE; else return FALSE;}//链队列由于没有头结点//入队时要判断链队列是否为空//出队时要判断是否只有一个元素/*************************************************Function: EnQueueDescription: 入队Input: 链队结构指针 LinkQueue *queue 数据元素 ElemType eOutput:Return: 成功返回OK,失败返回ERROROthers: 新结点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: DeQueueDescription: 出队Input: 链队结构指针 LinkQueue *queueOutput: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: GetHeadDescription: 取队头元素Input: 链队结构指针 LinkQueue *queueOutput:Return: 成功返回数据元素,否则程序退出Others:*************************************************/ElemType GetHead(LinkQueue *queue){ //判断链队是否为空 if(IsQueueEmpty(queue)) { printf("The linkqueue is empty!"); exit(EXIT_FAILURE); } return queue->front->data;}/*************************************************Function: ClearQueueDescription: 清空队列Input: 链队结构指针 LinkQueue *queueOutput:Return: 成功返回OKOthers:*************************************************/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: GetLengthDescription: 取得队列的长度Input: 链队结构指针 LinkQueue *queueOutput: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;}