别只顾着收藏啦,关注我们会有更多干货哦!
C语言高级知识点
正在自学C语言?虽然学了很久,但你还是觉得自己处于新手水平?没事!小编给你提个建议,如果你感觉你的C语言基本语法,已经掌握得差不多了,那么你就可以学习一下数据结构(C语言版),数据结构这个知识点对于大多数学习编程的人来说,几乎算得上是必过的一个科目。有些小伙伴可能已经在自学数据结构,但或多或少会有些地方可能会有点难以理解,小编不是什么大佬,希望这篇文章能帮到你。
这篇文章会让大家认识一下队列,队列在数据结构中是一个非常简单的存在,所以呢,这篇文章通俗易懂,适合刚入门的新手。
话不多说,上菜!
整个程序需要三个函数,分别是入队、出队、初始化队列(并插入首个队列成员),本文章中的源码可能跟一些数据结构教学书籍上的可能不一样,会比它们的代码量少一点,或者是使用的函数比他们少一点。由于时间问题,在这里小编就简单的教大家实现队列的入队、出队、初始化就可以了,虽然少了点,但是呢,你们可以举一反三写出你们需要的函数。
第一步,创建我们的队列初始化
这个初始化函数的功能是创建并初始化第一个队列成员,这里的初始化是直接给第一个队列成员赋值,小编这里给出的示例程序中,队列成员的数据域存放的是整型数,数据域存放的数据类型各位小伙伴可根据需要更改。
我们给函数取定义为que* ini_que(int number),接受一个int类型的参数,这个参数用于队列成员的赋值,函数返回创建的队列成员地址。函数里面使用malloc()函数申请一块内存,为什么呢?因为我们后面需要用free()函数释放掉出队的队列成员内存。不理解的请看下图源码实例↓
第二步,创建入队函数
小编给入队函数起名为insert(),这个函数接受两个参数,一个是要被插入数据的队列的队头指示器,在这里小编就叫它队头指示器吧,它起到标记队头的作用,在后期队列的操作过程中能提供很大的便利,这里跟别的地方可能不同,各有各的风格吧。
在函数里面,我们使用了一个全局变量——traverse(que *型),翻译过来就是遍历的意思,它起到遍历整个队列的作用,在队尾插入数据,所以我们在开头将mark(que *型)的值赋给traverse,使用一个while()循环从队头向队尾的移动。这样保证了队头指示器的完整性,又能遍历整个队列。以上全局变量在源码即可看到。
入队函数大概的工作原理是,使用while()循环逐步将traverse向队尾方向移动,在while()里面使用if判断语句进行判断,查看当前traverse指向的队列成员是否处于队尾,如果成员处于队尾,就使用malloc()申请一块内存,并对将即将入队的元素插入刚申请的内存中,并将内存中的head指针指向前一个成员,tail指针置空,tail置空特比重要(至少在这里是这样的),因为在后续的入队操作中,要以tail是否为空来判断是否可以插入数据。
你说你看不懂?没事,文章末尾有源码!
第三步,出队函数
在出队函数中,要申请一个que*类型的指针用于释放内存,小编给它取名为free_space(小编英语渣), free_space直接指向mark所指向的内存,用于在下面的free()函数中释放内存,为什么要释放掉内存呢?因为一个队列成员进行出队操作过后,我们尽量要将它所占用的内存空间释放掉,以免浪费内存资源。具体的实现步骤在下图的源码中↓
在出队函数中要注意,free()函数释放内块是否属于malloc()函数申请的内存块,如果不是很有可能会释放失败哦!
运行结果
在这个例子中,小编创建了一个可用容纳11个队列成员的队列,并从1开始向队尾写入数据,最后的队尾位置是11,在运行结果中可以看到,1-11按顺序插入队列中,然后在以1-11的顺序取出并打印在屏幕上,这个符合队列的先进先出,后进后出的特点。
学习源码如何获取?
关注《一碳科技》,私信关键字:队列学习源码获取即可获取源码,记住关键字不能错哦!
评论0