伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

C语言中队列的构造和函数接口的使用示例

目录

    一、队列的构造二、队列的函数接口
      1. 初始化和销毁2. 入队和出队3. 访问队头和队尾元素4. 判空和元素个数



一、队列的构造

队列:一种操作受限的线性表,只允许在线性表的一端停止插入,另一端停止删除,插入的一端称为队尾,删除的一端称为队头
C语言中队列的构造和函数接口的使用示例-1.png

通过 动态顺序表 的实现,可以发如今数组的头部停止插入删除操作时,需要挪动数据,效率较低,因而不采用数组来实现队列
但通过 单链表 的实现,可以发如今对单链表停止头插时效率很高,而停止尾插时,需要找尾数据,较为费事,但是可以通过增加一个尾指针的方式来提升效率,因而用单链表的头尾指针来实现队列,构造如下:
C语言中队列的构造和函数接口的使用示例-2.png

//队列的元素类型
typedef int QueueDataType;
//队列的结点构造
typedef struct QueueNode
{
        QueueDataType data;
        struct QueueNode* next;
}QNode;
//队列构造,需要包含指向链表的头指针和尾指针
//为了求队列数据个数时,时间复杂度为 O(1),这里增加一个 size 变量
typedef struct Queue
{
        QNode* head;
        QNode* tail;
        int size;
}Queue;

二、队列的函数接口


1. 初始化和销毁

初始化函数如下:
void QueueInit(Queue* pq)
{
        assert(pq);
        pq->head = pq->tail = NULL;
        pq->size = 0;
}
链表的结点都是动态开拓的,不用队列时,应当销毁
销毁函数如下:
void QueueDestroy(Queue* pq)
{
        assert(pq);
        //从头结点开端销毁
        QNode* cur = pq->head;
        while (cur)
        {
                //保管下一个结点
                QNode* next = cur->next;
                free(cur);
                cur = next;
        }
        pq->head = pq->tail = NULL;
        pq->size = 0;
}

2. 入队和出队

入队:在队尾插入元素
入队函数如下:
void QueuePush(Queue* pq, QueueDataType x)
{
        assert(pq);
        //创建新结点
        QNode* newnode = (QNode*)malloc(sizeof(QNode));
        if (newnode == NULL)
        {
                perror("malloc");
                exit(-1);
        }
        newnode->data = x;
        newnode->next = NULL;
        //没有结点时,插入元素,需要改变队列的头尾指针
        //有结点时,直接链接在尾结点之后,tail 变成新的尾
        if (pq->tail == NULL)
        {
                pq->head = pq->tail = newnode;
        }
        else
        {
                pq->tail->next = newnode;
                pq->tail = newnode;
        }
        //插入元素后,数据个数需要自增
        pq->size++;
}
出队:删除队头元素
出队函数如下:
void QueuePop(Queue* pq)
{
        assert(pq);
        //没有元素时,不能删除,这里直接调用判空函数
        assert(!QueueEmpty(pq));
        //假设只要一个结点时,需要改变队列的头尾指针
        if (pq->head->next == NULL)
        {
                free(pq->head);
                pq->head = pq->tail = NULL;
        }
        else
        {
                QNode* next = pq->head->next;
                free(pq->head);
                pq->head = next;
        }
        //删除元素后,数据个数需要自减
        pq->size--;
}

3. 访问队头和队尾元素

访问队头元素函数如下:
QueueDataType QueueFront(Queue* pq)
{
        assert(pq);
        //没有元素时,不能取队头元素,这里直接调用判空函数
        assert(!QueueEmpty(pq));
        return pq->head->data;
}
访问队尾元素函数如下:
QueueDataType QueueBack(Queue* pq)
{
        assert(pq);
        //没有元素时,不能取队尾元素,这里直接调用判空函数
        assert(!QueueEmpty(pq));
        return pq->tail->data;
}

4. 判空和元素个数

判空函数如下:
bool QueueEmpty(Queue* pq)
{
        assert(pq);
        return pq->size == 0;
}
元素个数函数如下:
size_t QueueSize(Queue* pq)
{
        assert(pq);
        return pq->size;
}
到此这篇关于C语言中队列的构造和函数接口的使用示例的文章就介绍到这了,更多相关C语言队列构造内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

亮亮
注册会员
主题 19
回复 13
粉丝 0
|网站地图
快速回复 返回顶部 返回列表