数据结构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;}