数据结构之队列的链式表示

(一)队列的链式表示

若用户无法估计所用队列的长度,则宜采用链队列,仍然两个指针:一个front 头指针,一个rear尾指针

// 链队列的数据定义
#define MAXQIZE 100 //最大长度
typedef struct Qnode {
    QElemType data;
    stuct Qnode *next;
}QNode,*QuenePtr;

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

 1.链队列初始化

Status initQueue(LinkQueue &Q) {
    Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode))    // 创建头尾指针
    if(!Q.front) exit(OVERFLOW);
    Q.front -> next = NULL                                 // 将头结点的next置空
    return OK
}

2.销毁链队列

// 从头结点开始,依次释放所有结点
Status Destroy Queue(LinkQueue &Q){
    while(Q.front){
        p = Q.front -> next;
        free(Q.front)
        Q.front = p
    }
}

3.链队列入队

Status EnQueue(LinkQueue &Q,QElemType e) {
    p = (QueuePtr)malloc(sizeof(QNode))    // 创建新结点
    if(!p) exit (OVERFLOW)
    p->data = e                            // 新结点的数据域 赋值 传入数据
    p->next = NULL                         // 新结点的next域 赋值 为空
    Q.rear ->next = p                      // 尾结点的next域 赋值 为新结点
    Q.rear = p                             // 将尾指针后移到新结点
}

4.链队出队

Status DeQueue(LiinkQueue &Q,QElemType &e) {
    if(Q.front == Q.rear) return ERROR        // 判断出栈之前是否为空
    p = Q.front -> next                       // 将头指针的next 域赋值给p
    e = p->data                               //  p的数据域赋值给e
    Q.front -> next = p ->next                // 移动头指针到下一个
    if(Q.rear == p) Q.rear = Q.front
    delete P                                  // 删除结点p
    return OK
}

5.链队列的头元素

e = Q.front -> next ->data        // 取头指针的next域所指向的元素的data域

 

posted @   铜须的编程生活  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示