C语言队列函数实现

不带头单链表实现

Queue.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//任意类型
typedef int QDataType;
//队列底层是单向带头或者不带头链表
typedef struct QListNode{
    QDataType val;
    struct QListNode* next;
}QNode;//队列的节点
//单链表尾插耗时间,记录链表尾部,头部信息,操作需要直接调用修改
typedef struct {
    QNode* phead;
    QNode* ptail;
    int size;//记录size可以知道队列中有多少元素
}queue;
//初始化,销毁,插入,删除,查找头部尾部数据,查找大小,判断是否为空
//初始化,队列信息初始化就行,没头节点就不用初始化节点了//单链表,带头循环双向链表,栈,队列

//规范命名,数据结构名加操作,驼峰命名法,插入:push,删除:pop
void QueueInit(queue* q);
void QueueDestroy(queue* q);//有记录信息的,穿含头节点的信息就行了
void QueuePush(queue* q, QDataType x);//尾部插入元素
void QueuePop(queue* q);//头部删除元素
QDataType QueueFront(queue* q);//获取头部数据
QDataType QueueBack(queue* q);//获取尾部数据
int QueueSize(queue* q);
int QueueEmpty(queue* q);


Queue.c

#include"queue.h"
void QueueInit(queue* q)//传的是含头节点地址的结构体地址,可直接修改内部元素如phead,ptail,size
{
    q->phead = NULL;
    q->ptail = NULL;
    q->size = 0;
}
void QueuePush(queue* q, QDataType x)//尾部插入元素
{
    assert(q);//结构体防止未初始化
    QNode*newnode = (QNode*)malloc(sizeof(QNode));
    newnode->val = x;
    newnode->next = NULL;
    if (q->phead == NULL)//数据结构为空
    {
        q->phead = q->ptail = newnode;
    }
    else
    {
        q->ptail->next = newnode;
        q->ptail = q->ptail->next;链接起来尾指针要往后走
    }
    q->size++;
}
void QueuePop(queue* q)//头部删除元素
{
    assert(q);
    assert(q->phead);
    QNode* midpcur = q->phead;
    q->phead = q->phead->next;
    if (q->phead == NULL)//只有一个元素防止尾指针成为野指针
        q->ptail = NULL;
    q->size--;
    free(midpcur);
}
QDataType QueueFront(queue* q)//获取头部数据
{
    assert(q);
    assert(q->phead);
    return q->phead->val;
}
QDataType QueueBack(queue* q)//获取尾部数据
{
    assert(q);
    assert(q->phead);
    return q->ptail->val;
}
int QueueSize(queue* q)
{
    assert(q);
    return q->size;
}
int QueueEmpty(queue* q)
{
    assert(q);
    return q->phead == NULL;
}
void QueueDestroy(queue* q)//有记录信息的,穿含头节点的信息就行了
{
    assert(q);
    QNode* pcur = q->phead;
    while (pcur)//循环删除链表
    {
        QNode* next = pcur->next;
        free(pcur);
        pcur = next;
    }
    q->phead = 0;
    q->ptail = 0;
    q->size = 0;
}

test.c

#include"queue.h"
void test()
{
    queue q;
    QueueInit(&q);
    QueuePush(&q, 4);
    QueuePush(&q, 5);
    QueuePush(&q, 6);
    QueuePush(&q, 7);
    printf("尾部数据为 %d \n",QueueBack(&q));
    while (!QueueEmpty(&q))
    {
        printf("%d <- ", QueueFront(&q));
        QueuePop(&q);
    }
    printf("%s\n",QueueSize(&q) == 0 ? "NULL" : "error");
    QueueDestroy(&q);
}
int main()
{
    test();
    return 0;
}

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值