链表实现队列----《数据结构与算法设计》

linkQueue.h

个人笔记

#include <errno.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define Error(module) fprintf(stderr,"error:"#module"\n")


//实现指针节点
typedef struct qnode *qlink;
typedef struct qnode {
    QItem element;
    qlink next;
}Qnode;

//实现队列
typedef struct lque *Queue;
typedef struct lque {
    qlink front;
    qlink rear;
}Lqueue;

qlink NewNode() { //新增节点,节点类型为指针型
    qlink q;
    if( (q = malloc(sizeof(Qnode)))==0 ) {
        Error("Exhausted memory.");
    } else {
        return q;
    }
}

Queue QueueInit() {
    Queue Q = malloc(sizeof(*Q));
    Q->front = Q->rear = 0;
    return Q;
}
int QueueIsEmpty(Queue Q) {
    return Q->front == 0;
}
int QueueMemFull() {
    qlink q;
    if( (q = malloc(sizeof(Qnode)))==0 )
       return 1;
    else {
        free(q);
        return 0;
    }
}
int QueueFull(Queue Q) {
    return QueueMemFull();
}
QItem QueueFirst(Queue Q) {
    if( QueueIsEmpty(Q) ) {
        Error("Queue is empty.");
    }
    else {
        return Q->front->element;
    }
}
QItem QueueLast(Queue Q) {
    if( QueueIsEmpty(Q) ) {
        Error("Queue is empty.");
    } else
        return Q->rear->element;
}
void QueueEnter(QItem x, Queue Q) {
    qlink p;
    p = NewNode();
    p->element = x;
    p->next = 0;

    if( Q->front ) { //队列非空
        Q->rear->next = p;
    } else { //空队列
        Q->front = p;
    }
    Q->rear = p;
}
QItem QueueDeleteFirst(Queue Q){
    QItem x;
    qlink q;
    if( QueueIsEmpty(Q) ) {
        Error("Queue is empty.");
    } else {
        x = Q->front->element;
        q = Q->front;
        Q->front = Q->front->next;
        free(q);
        return x;
    }
}
void QueueTraverse(Queue Q, void(*visit)(QItem e)) {
    qlink p=Q->front;
    while(p!=NULL) {
        visit(p->element);
        p = p->next;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37131037/article/details/80426583
今日推荐