队列的结构与实现

队列的定义

队列是指一种数据结构,结构特点是FIFO(First In First Out),即先入先出。

队列的数据只能尾插头删,因此可以将队列看作排队,一群人排队结账,谁先排队谁先结账。

队列的实现

队列的数据的插入和删除只有尾插和头删,考虑到顺序表头删效率低,选择链表实现队列。虽然链表尾插效率低,但是可以用一个尾指针来提高尾插效率。

队列实现:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>

typedef int QueueDataType;

typedef struct QueueNode {
    QueueDataType data;
    struct QueueNode* next;
}QueueNode;

//头指针和尾指针可以写成变量,但是函数传参时会很麻烦,可以写成一个结构体:
typedef struct Queue {
    QueueNode* first;
    QueueNode* tail;
}Queue;

void QueueInit(Queue* p){
    assert(p);
    p->first = p->tail = NULL;
}

bool QueueEmpty(Queue* p){
    assert(p);
    return p->first == NULL;
}

void QueueDestory(Queue* p){
    assert(p);
    QueueNode* cur = p->first;
    QueueNode* next = NULL;
    while(cur){
        next = cur->next
        free(cur);
        cur = next;
    }
}

void QueuePush(Queue* p, QueueDataType x){
    assert(p);
    QueueNode* new = (QueueNode*)malloc(sizeof(QueueNode));
    if(tem == NULL){
        perror("malloc fail");
        return;
    }
    nem->data = x;
    nem->next = NULL;
    //尾插分两种情况:队列为空或不为空
    if(QueueEmpty){
        p->first = p->tail = new;
    }
    else{
        p->tail->next = new;
        p->tail = new;
    }
}

void QueuePop(Queue* p){
    assert(p);
    //数据删除,队列不能为空
    assert(!QueueEmpty(p));
    //头删分两种情况:
    if(p->first == p->tail){
    //队列中只有一个元素
        free(p->first);
        p->first = p->tail = NULL;
    }
    else{
    //队列中有多个元素
        QueueNode* next = p->first->next;
        free(p->first);
        p->first = next;
    }
}

void QueueFront(Queue* p){
    assert(p);
    assert(!QueueEmpty(p));
    return p->first->data;
}

void QueueTail(Queue* p){
    assert(p);
    assert(!QueueEmpty(p));
    return p->tail->data;
}

猜你喜欢

转载自blog.csdn.net/weixin_74269833/article/details/129690753