单队列的链式表示和实现

队列是操作受限的线性表,只允许在队尾插入元素,在队头删除元素,为了便于插入元素,设立队尾指针。这样,插入元素的操作与队列长度无关
队列的链式存储结构

typedef struct QNode
{
    QElemType data;
    QNode *next;
}*QueuePtr;
struct LinkQueue
{
    QueuePtr front, rear;//队头,队尾指针
};

链队列的9个基本操作

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

void DestroyQueue(LinkQueue &Q){
    while (Q.front)//Q.front不为空
    {
        Q.rear = Q.front->next;//Q.rear指向Q.front的下一个结点
        free(Q.front);//释放Q.front所指结点
        Q.front = Q.rear;//Q.front指向Q.front的下一个结点
    }
}

void ClearQueue(LinkQueue &Q){
    DestroyQueue(Q);//销毁队列Q
    InitQueue(Q);//重新构造空队列
}

Status QueueEmpty(LinkQueue Q){
    if (Q.front->next == NULL) return TRUE;
    else return FALSE;
}

int QueueLength(LinkQueue Q){
    int i = 0;
    QueuePtr p = Q.front;//p指向头结点
    while (Q.rear != p)//p所指不是尾结点
    {
        i++;
        p = p->next;//p指向下一个结点
    }
    return i;
}

Status GetHead(LinkQueue Q, QElemType &e){
    if (Q.front == Q.rear) return ERROR;//队列空
    QueuePtr p = Q.front->next;//p指向队头结点
    e = p->data;//将队头元素的值赋给e
    return OK;
}

void EnQueue(LinkQueue &Q, QElemType e){//插入元素e为队列Q的新的队尾元素
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));//动态生成新结点
    if (!p) exit(OVERFLOW);
    p->data = e;
    p->next = NULL;//新结点的指针域为空
    Q.rear->next = p;//原队尾结点的指针指向新结点
    Q.rear = p;//尾指针指向新结点
}

Status DeQueue(LinkQueue &Q, QElemType &e){//若队列Q不空,删除Q的队头元素
    QueuePtr p;
    if (Q.front == Q.rear) return ERROR;//队列空
    p = Q.front->next;//p指向队头结点
    e = p->data;//将队头元素的值赋给e
    Q.front->next = p->next;//头结点指向下一个结点
    if (Q.rear == p)//删除的是队尾结点
        Q.rear = Q.front;//修改队尾指针指向头结点(空队列)
    free(p);//释放队头结点
    return OK;
}

void ListTraverse(LinkQueue Q, void(*visit)(ElemType&)){
    QueuePtr p = Q.front->next;//p指向队头结点
    while (p)//p指向结点
    {
        visit(p->data);
        p = p->next;
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值