3.9 队列的链式表示和实现

3.5.3 队列的链式表示和实现


适用于用户无法估计所用队列的长度,则适宜采用该类型的队列

  • 链式队列的结构图如下所示

  • 链队列的类型定义

    // 这里是定义是每个节点类型
    typedef struct Qnode{
    QElemType data;
    struct Qnode next;
    }QNode,
    QueuePtr;

    typedef struct{
    QuenePtr front; // 队头指针
    QuenePtr rear; // 队尾指针
    }LinkQueue;

  • 链队列运算指针变化

    • 空队列情况是:Q.front==Q.rear
    • 元素x入队列:Q.rear=x
    • y入队列:Q.rear=y;

链队列初始化

  • 【算法描述】

    Status InitQueue(LinkQueue &Q){
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q.front)
    exit(OVERFLOW);
    Q.front->next=NULL;
    return OK;
    }

销毁队列

  • 【算法思想】从队头结点开始,依次释放所有结点

  • 【算法描述】

    Status DestroyQueue(LinkeQueue &Q){
    QNode p;
    while(Q.front){
    p=Q.front->next;
    free(Q.front);
    Q.front=p;
    }
    return OK;
    }

将元素e入队

  • 【算法思想】在队尾插入新元素

  • 【算法描述】

    Status EnQueue(LinkQueue &Q,ElemType e){
    //QNode p=new QNode();
    QNode p=(QueuePtr)malloc(sizeof(QNode));
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return OK;
    }

链队列出队

  • 【算法思想】在队头进行删除元素

  • 【算法描述】

    Status DeQueue(LinkQueue &Q,ElemType &e){
    // 首先是判断队列是否为空
    if(Q.front==Q.rear)
    return ERROR;
    QNode p=Q.front->next;
    Q.front=p->next;
    free(p);
    return OK;
    }

求链队列的队头元素

  • 【算法思想】查询队头元素的值

  • 【算法描述】

    Status GetHead(LinkQueue Q,QElemType &e){
    if(Q.front==Q.rear)// 判断队列是否为空
    return ERROR;
    e=Q.front->next->data;
    }

posted @ 2023-03-18 21:13  什么都会有的  阅读(125)  评论(0)    收藏  举报