数据结构-队列-链式存储

286 阅读2分钟

先简单聊聊

上次以顺序存储的方式实现了队列,今天我们用链式存储的方式,实现以下。

直接上代码

准备代码

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20

typedef int Status;
typedef int QElemType;

typedef struct QNode{
    QElemType data;
    struct QNode *next;
}QNode, *QueuePtr;

typedef struct {
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

主要代码

//初始化
Status initQueue(LinkQueue *queue) {
    //head
    queue->rear = queue->front = (QueuePtr)malloc(sizeof(QNode));
    if (!queue->front && !queue->rear) {
        return ERROR;
    }
    queue->front->next = NULL;
    return OK;
}

//销毁
Status destoryQueue(LinkQueue *queue) {
    while (queue->front) {
        //销毁队列,队尾指针rear已经没有用了,把他当做临时指针用
        queue->rear = queue->front->next;
        free(queue->front);
        queue->front = queue->rear;
    }
    return OK;
}

//清空
Status clearQueue(LinkQueue *queue) {
    QueuePtr p,q;
    queue->rear = queue->front;
    p = queue->front->next;
    queue->front->next = NULL;
    
    while (p) {
        q = p;
        p = p->next;
        free(q);
    }
    return OK;
}

//是否为空
Status queueEmpty(LinkQueue queue) {
    if (queue.front == queue.rear) {
        return TRUE;
    } else {
        return FALSE;
    }
}

//长度
int queueLength(LinkQueue queue) {
    int i = 0;
    QueuePtr p;
    p = queue.front;
    while (p != queue.rear) {
        i++;
        p = p->next;
    }
    
    return i;
}

//入队
Status enteyQueue(LinkQueue *queue, QElemType elem) {
    QueuePtr temp = (QueuePtr)malloc(sizeof(QNode));
    if (!temp) {
        return ERROR;
    }
    temp->data = elem;
    temp->next = NULL;
    queue->rear->next = temp;
    queue->rear = temp;
    return OK;
}

//出队
Status outQueue(LinkQueue *queue, QElemType *elem) {
    if (queueEmpty(*queue)) {
        return ERROR;
    } else {
        QueuePtr p = queue->front->next;
        *elem = p->data;
        queue->front->next = p->next;
        if (queue->rear == p) {
            queue->rear = queue->front;
        }
        free(p);
        return OK;
    }
}

Status getHead(LinkQueue queue, QElemType *elem) {
    if (queue.front != queue.rear) {
        *elem = queue.front->next->data;
        return TRUE;
    } else {
        return FALSE;
    }
}

//遍历
Status traverseQueue(LinkQueue queue) {
    QueuePtr p;
    p = queue.front->next;
    while (p) {
        printf("%d ",p->data);
        p = p->next;
    }
    return OK;
}

调用

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    
    LinkQueue queue;
    Status iStatus = initQueue(&queue);
    if (iStatus) {
        printf("init OK\n");
    }
    
    printf("is empty? %d\n", queueEmpty(queue));
    printf("queue length:%d\n", queueLength(queue));
    
    enteyQueue(&queue, 1);
    enteyQueue(&queue, 2);
    enteyQueue(&queue, 3);
    
    printf("is empty? %d\n", queueEmpty(queue));
    printf("queue length:%d\n", queueLength(queue));
    
    traverseQueue(queue);
    
    QElemType elem;
    getHead(queue, &elem);
    printf("get head elem:%d\n", elem);
    
    iStatus = outQueue(&queue, &elem);
    if (iStatus == OK) {
        printf("del elem:%d\n", elem);
    }
    
    getHead(queue, &elem);
    printf("get head elem:%d\n", elem);
    
    clearQueue(&queue);
    
    destoryQueue(&queue);
    
    return 0;
}

打印