C语言实现链式存储结构的队列

225 阅读1分钟

引言

今天刷leetcode时,遇到了关于BFS算法的一道题,而BFS一般用队列实现,C语言没有直接可以生成队列的库函数,所以需要自己编写,在此记录一下队列的c语言实现。

数据结构定义

首先定义队列所用到的数据结构,如下:

//创建结点
struct Node{
    int val;  //这里根据存放的数据改变数据类型,如果存放其他的数据类型,下面函数中的数据类型跟这变。
    struct Node* next;
};
//创建队列数据结构
struct Queue{
    struct Node* head;
    struct Node* tail;
};
typedef struct Queue* Qpinter;
typedef struct  Node* nodePr;

队列初始化函数

Qpinter creatQueue()
{
    Qpinter tempQ = (Qpinter)malloc(sizeof(struct Queue));
    if(tempQ == NULL)
        exit(0);     
    tempQ->head = NULL;
    tempQ->tail = NULL;
    return tempQ;
}

插入元素

//插入元素
Qpinter insetQueue(Qpinter q, int a)
{
    nodePr tempN = (nodePr)malloc(sizeof(struct Node));
    tempN->val = a;
    tempN->next = NULL;
    if(q->head == NULL)     //队列为空
    {
        q->tail = tempN;
        q->head = tempN;
    }
    else{
        q->tail->next = tempN;
    }
    q->tail = tempN;
    return q;
}

删除元素

int deleQueue(Qpinter q)
{
    nodePr temp;
    int res;
    if(q->head == NULL)    //队列为空
        return NULL;   
    if(q->head == q->tail)  // 队列只有一个元素
    {
        res = q->head->val;
        temp = q->head;
        q->head = NULL;
        q->tail = NULL;
    }
    else{
        res = q->head->val;
        temp = q->head;
        q->head = q->head->next;
    }
    free(temp);
    return res;
}

销毁队列

//销毁队列
void destoryQ(Qpinter q)
{
    nodePr temp;
    while(q->head != NULL)
    {
        temp = q->head;
        q->head = q->head->next;
        free(temp);
    }
}

总结

用链式结构实现的队列不用判断队列是否为满,可以一直存,若要判断长度需要在定义size记录。