这篇文章将为大家详细讲解有关C语言中队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。???? 概念:① 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。② 入队列,进行插入操作的一端称为 队尾。出队列,进行删除操作的一端称为 队头。③ 队列中的元素遵循先进先出的原则,即 FIFO原则(First In First Out)???? 结构:❓ 为什么不使用单链表????免费云主机域名? 单链表我们只定义了一个指针指向头,没有定义尾指针。因为定义尾指针解决不了问题,比如尾插尾删。所以我们没有必要定义一个结构体把他们封到一起。这里我们再定义一个头指针 head 一个尾指针 tail,这两个指针才有意义。因为根据队列的性质,我们只会在队尾插,不会再队尾删。所以这个尾指针的价值就得到了完美的体现,实际中定义几个指针是看你的需求确定的。???? 这是需要实现几个接口函数:???? Queue.h???? Queue.c???? 解析:首先使用断言防止传入的pQ为空。初始化只需要把头指针和尾指针都置成空即可。???? 解读:① 首先断言防止传入的pQ为空。② 销毁要把所有节点都释放掉,我们创建遍历指针 cur 遍历整个队列。既然要释放 cur 指向的节点,为了防止释放 cur 之后找不到其下一个节点导致无法移动,我们这里创建一个类似于信标性质的指针 curNext 来记录一下 cur 的下一个节点,之后再 free 掉 cur,这样就可以移动 cur 了。③ 最后为了防止野指针,还需要把头指针和尾指针都置为空。???? Queue.h???? 解读:布尔值,返回 true 或 false???? Queue.c???? 解读:① 首先断言防止传入的pQ为空。② 判断队列是否为空,可以直接返回,巧妙地利用布尔类型的特性。如果 pQ->pHead == NULL 成立则为真,会返回 true;不成立则为假,会返回 false。???? Queue.h???? Queue.c???? 解读:① 首先断言防止传入的pQ为空。② 我们首先要创建新节点。通过 malloc 动态内存开辟一块 QueueNode 大小的空间,都学到这里了大家想必都养成了检查 malloc 的好习惯了吧?。最后放置数据吗,将待插入的数据 x 交给 data,next 默认置空,和之前学链表一样,这里就不过多赘述了。③ 新节点创建好后,我们可以开始写入队的操作了。首先要理解队列的性质:队尾入数据,队头出数据。这里既然是入队,就要在对尾后面进行插入。这里我们还要考虑到如果队列为空的情况,这时我们要把头指针和尾指针都交付给 new_node 。为了理清思路,我们可以画一个思路草图来帮助我们更好地理解:有了这个图,我们就可以清楚地实现了:当队列为空时,令头指针和尾指针都指向 new_node ,当队列不为空时,再尾部地下一个节点放置 new_node,随后再更新尾指针让其指向新的尾(new_node 的位置)。???? Queue.h???? Queue.c???? 解读:① 首先断言防止传入的 pQ 为空,这里还要放置队列为空,如果队列为空还要求出队的话会出问题的,所以这里要断言一下 QueueIsEmpty 为假。② 思路草图如下:出数据需要释放,和销毁一样,这里使用一个类似于信标性质的指针来记录 pHead 的下一个节点,之后我们就可以大胆地释放 pHead 而不用担心找不到了。free 掉之后更新头即可,令头指针指向 headNext 即可。???? 注意:这里还要考虑一个问题,如果队内都被删完了,pHead 往后走指向空,但是 pTail 仍然指向那块已经被 free 掉的空间。pTail 就是一个典型的野指针。我们可以不用担心 pHead,因为后面没有数据他会自然指向 NULL,但是我们这里得关注 pTail !我们需要手动处理一下它:如果 pHead 为空,我们就把 pTail 也置为空即可。???? Queue.h???? Queue.c???? 解读:① 首先断言防止传入的 pQ 为空,这里我们还是要断言一下 QueueIsEmpty 为假,因为如果队内没有数据,还返回个锤子数据呢。② 这里直接返回头的数据即可,特别简单没有什么好讲的。???? Queue.h???? Queue.c???? 解读:① 首先断言防止传入的 pQ 为空,断言一下 QueueIsEmpty 为假。② 这里直接返回队尾的数据即可。???? Queue.h???? Queue.c???? 解读:这里我们采用计数器法来求大小即可,调用一次就是 O(N),也没什么不好的。① 首先断言防止传入的 pQ 为空。② 创建计数器变量和遍历指针 cur,遍历整个队列并计数,最后返回计数的结果即可。???? Queue.h???? Queue.c???? Test.c关于“C语言中队列的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
这篇文章主要介绍了Ubuntu如何临时关闭一个服务,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Ubuntu简介Ubuntu是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。