c语言的数据结构:队列

这篇具有很好参考价值的文章主要介绍了c语言的数据结构:队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.队列存在的实现方式及其存在意义

1.1为什么队列使用单链表实现更好

  1. 动态内存分配:链表在C语言中通常使用动态内存分配,这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用,因为队列的大小可以在运行时变化。相比之下,数组的大小通常是固定的,需要在编译时确定,这可能会限制队列的灵活性。
  2. 插入和删除效率:在链表中,插入和删除操作的时间复杂度为O(1)(在已知位置的情况下)。这意味着在链表的头部或尾部添加或删除节点非常高效。由于队列是一种先入先出(FIFO)的数据结构,我们通常在队列的尾部添加元素(入队),并在头部删除元素(出队)。因此,使用链表实现队列可以充分利用其高效的插入和删除操作。
  3. 空间效率:链表只存储节点本身的数据和指向下一个节点的指针,不需要像数组那样预留一定的空间。这使得链表在存储大量数据时更为空间高效.

1.2 队列存在的意义

无论是栈,队列,抑或是树,它们基本都是由顺序表,链表这些基本的元素构成的,并且人们将栈,队列等一些数据结构发明出来也是为了根据人类的需求解决人类的一些问题,举一个例子,医院叫号排队,为了防止有些人乱插队从而引起的不必要的纠纷,于是以数据结构队列为基本原理开发出有关排队就医的系统 

2.有关队列的一些基本操作如何使用c语言代码将其具现化

2.1如何写一个队列的结点

typedef int QDataType;
typedef struct QueueNode
{
    int val;
    struct QueueNode* next;
}QNode;

typedef struct Queue
{
    QNode* phead; // 指向队列头部的指针  
    QNode* ptail;  // 指向队列尾部的指针  
    int size;
} Queue;

如果只是写一个队列的结点

c语言的数据结构:队列,c语言数据结构,c语言,数据结构,算法

然后在之后的对队列的操作每次都去再设置一个头指针和尾指针如果我们需要去找队列的尾结点,那么就需要尾指针每次都从头开始去遍历整个链表的结点,但是这样做的话时间复杂度便可以来到O(n),是不合情的

所以我们在最初设置队列的结点相关基础信息的时候就连带着将它的头指针和尾指针一并设置好.

设置两个结点指针phead和ptail,例如我们每次进行一次尾插操作,就让ptail指向新的尾结点,如此一来,ptail便一直指向尾结点,每当我们需要取去寻找尾结点是,可以直接使用ptail,就不需要再去从头开始遍历了.

2.2队列的初始化操作

void QueueInit(Queue* pq)
{
    assert(pq);//pq是指向结构体的指针
    pq->phead = NULL;
    pq->ptail = NULL;
    pq->size = 0;
}

c语言的数据结构:队列,c语言数据结构,c语言,数据结构,算法

2.3队列的销毁操作

//销毁操作
void QueueDestroy(Queue* pq)
{
    assert(pq);
    QNode* cur = pq->phead;//从头开始销毁,和出队一样
    while (cur != NULL)
    {
        QNode* nexttemp = cur->next;
        free(cur);
        cur = nexttemp;
    }

    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}

c语言的数据结构:队列,c语言数据结构,c语言,数据结构,算法

 QNode* nexttemp = cur->next;

这一步的意思是为了保证在将cur目前所指向的结点删除以后还可以定位到原被删除结点的下一个结点,所以事先将下一个结点cur->next用创建的临时变量nexttemp保存起来,待目前结点被删除以后,cur又快速指向下一个结点cur->next结点.

2.4入队操作

//入队
void QueuePush(Queue* pq,QDataType x)
{
    assert(pq);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
        perror("malloc fail");
        return;
    }
    newnode->val = x;
    newnode->next = NULL;
    if (pq->ptail = NULL)//啥都没有
    {
        pq->ptail = pq->phead = newnode;

    }
    else//本来就有结点
    {
        pq->phead->next = newnode;
        pq->ptail = newnode;
    }
    pq->size++;
}

c语言的数据结构:队列,c语言数据结构,c语言,数据结构,算法

2.5出队操作

//出队
void QueuePop(Queue* pq)
{
    assert(pq);
    //暴力检查
    //至少要有一个结点才可以进行销毁操作

    assert(pq->phead!=NULL);
     
    if (pq->phead->next == NULL)
    {
        free(pq->phead);
        pq->phead = pq->ptail = NULL;
    }
    else
    {
        QNode* nexttemp = pq->phead->next;
        free(pq->phead);
        pq->phead = nexttemp;
    }
    pq->size--;
}

c语言的数据结构:队列,c语言数据结构,c语言,数据结构,算法

2.6取头操作

//取头
QDataType  QueueFront(Queue* pq)
{
    assert(pq);
    //要有首结点才可以进行取头操作
    assert(pq->phead != NULL);
    return pq->phead->val;
}

c语言的数据结构:队列,c语言数据结构,c语言,数据结构,算法

2.7取尾操作

//取尾
QDataType QueueBack(Queue* pq)
{
    assert(pq);
    //要有尾结点才可以进行取尾操作
    assert(pq->ptail != NULL);
    return pq->ptail->val;
}

c语言的数据结构:队列,c语言数据结构,c语言,数据结构,算法文章来源地址https://www.toymoban.com/news/detail-839554.html

到了这里,关于c语言的数据结构:队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构和算法】--队列的特殊结构-循环队列

    循环队列是队列的一种特殊结构,它的 长度是固定的 k ,同样是 先进先出 ,理论结构是 首尾相连的环形循环结构 。其理论结构大致如下: 具体结构描述可以参考 LeetCode : 622. 设计循环队列的题目要求,大致如下: 设计你的循环队列实现。 循环队列是一种 线性数据结构 ,

    2024年02月04日
    浏览(42)
  • 数据结构——队列(C语言)

    本篇文章将解决一下几个问题: 队列是什么? 如何实现一个队列? 什么场景下会用队列? 队列:一种只允许一端进行插入数据操作,在另一端进行删除操作的特殊线性表。队列具有先进先出(FIFO)入队列:进行插入操作的一端称为队尾,出队列的一端叫做队头。  队列也

    2024年02月11日
    浏览(36)
  • 数据结构与算法:队列

    在上篇文章讲解了栈之后,本篇也对这一章进行收尾,来到队列! 队列(Queue)就像是排队买票的人群。想象一下你去电影院看电影,人们在售票窗口形成一条线(队列)等待购票。队列遵循一个很重要的原则:先来先服务(First In, First Out,简称FIFO)。这意味着最先到达并

    2024年02月22日
    浏览(42)
  • 队列——“数据结构与算法”

    各位CSDN的uu们你们好呀,又好久不见啦,最近有点摆烂,甚是惭愧!!!!今天,小雅兰的内容是队列,下面,让我们进入队列的世界吧!!! 队列 队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIF

    2024年02月06日
    浏览(40)
  • 算法与数据结构-队列

      队列跟栈一样,也是一种操作受限的线性表数据结构。不过,队列是先进者先出。   栈只支持两个基本操作:入栈 push()和出栈 pop()。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取

    2024年02月12日
    浏览(36)
  • 【数据结构和算法】--队列

    队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出 FIFO(First In First Out) 的原则。 入队列 :进行 插入操作的一端称为队尾 。 出队列 :进行 删除操作的一端称为队头 。 队列结构联想起来也非常简单,如其名,队列就相当于

    2024年02月05日
    浏览(36)
  • 数据结构:队列(Python语言实现)

    队列是一种 先进先出 的数据结构(特殊的线性结构),在队列 尾部 插入新元素,在队列 头部 删除元素。 一般队列的基本操作如下: create:创建空队列。 enqueue:将新元素加入队列的尾部,返回新队列。 dequeue:删除队列头部元素,返回新队列。 front:返回队列头部的元素

    2024年02月13日
    浏览(41)
  • c语言的数据结构:队列

    动态内存分配:链表在C语言中通常使用动态内存分配,这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用,因为队列的大小可以在运行时变化。相比之下,数组的大小通常是固定的,需要在编译时确定,这可能会限制队列的灵活

    2024年03月14日
    浏览(34)
  • 【数据结构】C语言队列(详解)

    前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现队列 目录 一.队列概念及结构 1.1队列的概念 1.2队列的结构 二.队列的实现 2.1头文件 2.2链式队列的结构定义 2.3队列接口的定义 2.4初始化队列 2.5判断队列

    2024年02月10日
    浏览(39)
  • C语言实现队列--数据结构

    😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥所属专栏:🔥魔王的修炼之路–数据结构🔥 如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的 点赞 👍和 关注 💖,支持一

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包