首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言队列的实现

我个人把链表、队列、栈分为一类,然后图、树分为一类。(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列、栈。...(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完队列之后还会归纳一下这一类数据结构的规律,帮助大家更好理解数据结构 首先需要知道队列是什么,这里给一个定义:队列是只允许一段进行插入操作,一段进行删除操作的线性表...,队列是先进先出的结构,允许插入成为队尾,允许删除成为队头 如上图就是一个队列,这里我相信你已经对队列有了一个概念了吧,于是就可以继续看下面了 队列同样存在插入删除操作,由于我们这里讨论的是链式队列的实现...我们能很容易写出下面插入节点到队列的代码(如果不能你就要发反思是否认真学习了): void en_queue(struct queue *q,char c){ struct node *e=new...n){ return; } e->data=c; e->next=NULL; if(q->rear==NULL){ q->front=q->rear

3.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

c语言 无锁编程,无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)「建议收藏」

1.无锁编程与有锁编程的效率 无锁编程,即通过CAS原子操作去控制线程的同步。如果你还不知道什么使CAS原子操作,建议先去查看相关资料,这一方面的资料网络上有很多。...这时普通锁编程其实是优于无锁编程的。 硬件级原子操作使应用层的操作变慢,而且无法再进行优化。如果对有锁多线程程序有良好的设计,那么可以使程序的性能在不下降的同时,实现高并发。...2.无锁编程的好处 无锁编程不需要程序员再去考虑死锁、优先反转等棘手的问题,因此在对应用程序不太复杂,而对性能要求稍高的程序中,可以采取有锁编程。...如果程序较为复杂,性能要求不高的程序中可以使用无锁编程。 3.无锁队列的实现 对于线程无锁同步方式方式的应用,我实现了一个无锁的队列。...QuePop(&data)) printf(“队列为空\n”); else printf(“队列输出元素:%d\n”,data); } } int main() { //初始化队列 QueInit(

1.2K10

LeetCode 设计循环队列C语言

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。...如果队列为空,返回 -1 。 enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。 deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。...isEmpty(): 检查循环队列是否为空。 isFull(): 检查循环队列是否已满。...最重要的就是判断队列是否为空,是否满队列,空队列就是head和tail指向了同一个位置,但是如果一直入队,等到满队,条件也是head和tail指向了同一个地方 这样我们就没办法判断倒是是满队还是空队...这里我们只要让tail加上一个队列长度,在%队列长度就好了。

64800

C语言实现顺序队列

文章目录 顺序队列常规操作 定义顺序队列结构体 初始化顺序队列 顺序队列判满 顺序队列判空 计算顺序队列的长度 顺序队列入队(EnQueue) 顺序队列出队(DeQueue) 顺序队列各操作测试 源代码...; // 队列头下标 int rear; // 队列尾下标 }*Queue; 顺序队列和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外...为了在C语言中描述方便起见,初始化建空队列时,令 front = rear = 0; 每当插入新的队尾元素时 “尾指针增1”;每当删除队头元素时 “头指针增1”。...因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置。...用 循环队列 就可以解决假溢出情况。 源代码 源代码已上传到 GitHub Data-Structure-of-C,欢迎大家下载 C语言实现数据结构

1.6K30

C语言队列的基本操作

本篇介绍一下编程中比较重要的一个数据结构队列队列有个很显著的标志,对其中的数据是先进先出,如果是顺序存储结构可以说就是一个受限的数组,对链式存储结构就只能说是符合先进先出的规则了,这种数据结构在我们真正的编程中还是相当常用的...实际中根据需要去定制自己的队列。...开始 顺序队列的操作 首先我们来介绍一下顺序存储结构下的队列的定义和基本操作 添加适当的头文件,定义一个顺序存储数据结构, 这里需要添加头文件和定义一个队列的顺序数据结构 #include <stdio.h...,可以从数组的方式去理解,这样将会让你理解起来更简单 链式队列的操作 首先我们来介绍一下顺序存储结构下的队列的定义和基本操作 添加适当的头文件,定义一个队列链式存储数据结构, 这里需要添加头文件和定义一个队列的链式存储数据结构...,只要理解了先进先出的逻辑,和了解一下指针操作就可以很容易的写出队列的节本操作。

73731

链式队列(C语言实现)

链式队列(C语言实现) 链式队列的存储结构: 我们知道,队列是操作受限制的线性表,队列有队头和队尾,插入元素的一端称为队头,删除元素的一端称为队尾。...练市队列的队头指针指向当前队列的队头结点位置,队尾指针指向队列的当前队尾结点位置。对于不带头结点的链式队列,出队列时可直接删除队头指针所指的结点,因此,链式队列不带头结点更方便。...front=NULL; } //判空 int QueueEmpty(LQueue Q) { if(Q.front==NULL) return 0; else return 1; } //入队列...(LQueue *Q,DataType *d) { LQNode *p; if(Q->front==NULL) { printf("队列已空!!...p); return 1; } } //取队头数据元素 int QueueGet(LQueue Q,DataType *d) { if(Q.front==NULL) { printf("队列已空

45630

C语言编程—常量

字符常量可以是一个普通的字符(例如 'x')、一个转义序列(例如 '\t'),或一个通用的字符(例如 '\u02C0')。...在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。...; //系统对字符串常量自动加一个 '\0' 定义常量 在 C 中,有两种简单的定义常量的方式: 使用 #define 预处理器。 使用 const 关键字。...{ int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c"..., NEWLINE); return 0; } 当上面的代码被编译和执行时,它会产生下列结果: value of area : 50 请注意,把常量定义为大写字母形式,是一个很好的编程习惯。

19130

C语言编程规范

2018 /10 图片来源于网络 C语言入门到精通 公众号 闫小林 C是一门朴素的语言,它是大部分程序员的入门语言,那么C语言的常见编程规范都有哪些呢 1 头文件: 1.头文件中适合放置接口的声明...,不适合放置实现 2.头文件应向稳定的方向包含,产品依赖于平台,平台依赖于标准库 3. .c/.h文件禁止包含用不到的头文件 4.每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口....c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量 10.如果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名,降低接口使用者的编写难度 2 编码...C语言入门到精通 4 禁止内存泄漏: 1.异常出口处检查内存、定时器/文件句柄/Socket/队列/信号量/GUI等资源是否全部释放 2.删除结构指针时,必须从底层向上层顺序删除 3.使用指针数组时...,确保在释放数组时,数组中的每个元素指针是否已经提前被释放了 4.避免重复分配内存 5.小心使用有return、break语句的宏,确保前面资源已经释放 6.检查队列中每个成员是否释放 5 禁止引用已经释放的内存空间

32.6K3129

C语言-文件编程

文件编程函数介绍 如果在Linux系统下学习C语言,就会了解到两套文件编程接口函数: C语言标准的文件编程函数: fopen*、fread、fwrite、*fclose Linux下提供的文件编程函数:...C语言标准库提供的文件编程函数 下面介绍C语言标准库提供的文件编程函数,一般对文件常用的操作就是:创建(打开)、读、写、关闭。...Linux下的系统函数: 文件编程函数 Linux下也有一套系统函数,用于文件操作,这些函数在Linux下常用于读写设备文件;当然,读写普通文件也是一样,普通文件也是磁盘上的数据,也是操作块设备驱动。...案例: 实现文件拷贝功能(fopen) 例如: cp 123.c 456.c 将123.c的数据拷贝到456.c文件里。 注意: 下面这个代码需要在命令行上运行,需要给main函数传参。...案例: 实现文件拷贝功能(open) 例如: cp 123.c 456.c 将123.c的数据拷贝到456.c文件里。

12.8K30

栈和队列(C语言实现)

栈和队列 栈 分析 初始化与销毁栈 出栈入栈与判断栈为空 获取栈顶元素 获取栈中有效元素个数 队列 分析 初始化与销毁队列 入列,出列与判断队列是否为空 获取队列头部,尾部元素 获取队列中有效元素个数...int StackSize(ST* ps)//获取栈中有效的元素 { assert(ps); return ps->top; } 队列 分析 队列是从队头出,队尾入,数组就没有链表好用了,所以我们用单向链表...typedef struct Queue { QL* head;//头结点,指向队列的队头 QL* tail;//尾结点,指向队列的队尾 int siz;//计算有多少个结点 }Qu; 初始化与销毁队列...free(cur); cur = del; } q->head = q->tail = NULL; q->siz = 0; } 入列,出列与判断队列是否为空 入列 这里需要考虑队列是否为空的尾插...int QueueSize(Qu* q)//获取队列中有效元素个数 { assert(q); return q->siz; }

86800

C语言实现链表队列LinkQueue

以下队列为自己设计,若有错误,欢迎大家指出,谢谢~~ 本队列原理 ?...- Node:节点 - xLinkQueue:节点控制器 -- head:总是指向队列头 -- end:总是指向队列尾 - 创建队列时,实际是创建了xLinkQueue,之后对队列的操作都是通过它 -...添加节点时,创建的Node,并将内容复制进它的buff中 - 弹出队列时,将Node中的内容先复制出来,在free释放内存 - 不是循环队列,有待改进 - 单个节点的buff最大不超过(1024*3),...如queueCreate(20, 1024*3);(不知道为什么,在我的STM32F4上申请1024*4失败) util.c /** 工具包 */ #include "util.h" static...Node *head; // 队列头节点 uint8_t length; // 记录队列的长度(已使用多少个节点) uint8_t size; // 每个节点的buff的大小 uint16

77240

C 语言编程习惯总结

笔者能力有限,如果文中出现错误的地方,还请各位朋友能够给我指出来,我将不胜感激,谢谢~ 引言 编程习惯的培养需要的是一个长期的过程,需要不断地总结,积累,并且我们需要从意识上认识其重要性,一个良好的编程习惯对于我们能力的提高也是由巨大的帮助的...下面是笔者在阅读《专业嵌入式软件开发》这本书时所看到的一些关于编程好习惯的总结,特此记录和分享一下、 判断失败而非成功 下面是一段简化过后的代码片段: if (physap_alarm_init() =...屏蔽编程语言特性 数组在编程中是经常使用到的一个功能,下述是采用数组保存一个会话 ID 的一段简化代码: #define SESSION_ID_LEN_MIN 1 #define SESSION_ID_LEN_MAX...恰当地使用 goto 语句 我们在接触 C 语言编程的时候,大多都被告知不要使用 goto 语句,以至于有时候一看到 goto 语句就觉得程序写的很垃圾,但真实情况是什么样呢,在编程的时候 goto 语句并没有被禁用...结论 上述便是一部分关于编程细节的内容,可以看出来,合理的使用这些技巧,会让代码变得更改简洁,也能够增加代码的可读性,同时也能够减少 bug 的出现,这能很大程度上提升代码的质量。

11K00
领券