C语言数据结构之判断循环链表空与满
时间:2019-04-07
本文章向大家介绍C语言数据结构之判断循环链表空与满,主要包括C语言数据结构之判断循环链表空与满使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
C语言数据结构之判断循环链表空与满
前言:
何时队列为空?何时为满?
由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,我们无法通过front=rear来判断队列“空”还是“满”。
注:先进入的为‘头',后进入的为‘尾'。
解决此问题的方法至少有三种:
其一是另设一个布尔变量以匹别队列的空和满;
其二是少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空);
其三是使用一个计数器记录队列中元素的总数(实际上是队列长度)。
第一种方法没有实现,下面实现第二种和第三种:
一、少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志。即:
队空时: front=rear
队满时: (rear+1)%maxsize=front
front指向队首元素,rear指向队尾元素的下一个元素。
///////////////////////////////////////// // // author: kangquan2008@csdn // ///////////////////////////////////////// #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define QUEUE_SIZE 10 #define EN_QUEUE 1 #define DE_QUEUE 2 #define EXIT 3 typedef int Item; typedef struct QUEUE{ Item * item; int front; int tear; }Queue; int init_queue(Queue * queue) { queue->item = malloc(QUEUE_SIZE * sizeof(Item)); if(!queue->item) { printf("%s\n","Alloc failed,not memory enough"); exit(EXIT_FAILURE); } queue->front = queue->tear = 0; return 1; } int en_queue(Queue * queue, Item item) { if((queue->tear+1) % QUEUE_SIZE == queue->front) { printf("%s\n","The queue is full"); return -1; } queue->item[queue->tear] = item; queue->tear = (queue->tear + 1) % QUEUE_SIZE; return 1; } int de_queue(Queue * queue, Item * item) { if(queue->front == queue->tear) { printf("%s\n","The queue is empty"); return -1; } (*item) = queue->item[queue->front]; queue->front = (queue->front + 1) % QUEUE_SIZE; return 1; } int destroy_queue(Queue * queue) { free(queue->item); } int main() { Queue que; init_queue(&que); int elem; bool flag = true; while(flag) { int choice; printf("1 for en_queue,2 for de_queue,3 for exit\r\nplease input:"); scanf("%d",&choice); switch((choice)) { case EN_QUEUE: printf("input a num:"); scanf("%d",&elem); en_queue(&que,elem); break; case DE_QUEUE: if(de_queue(&que,&elem) == 1) printf("front item is:%d\n",elem); break; case EXIT: flag = false; break; default: printf("error input\n"); break; } } destroy_queue(&que); return 0; }
二、 实例代码:
#include <stdio.h> #include <assert.h> #define QueueSize 100 typedef char datatype; //队列的数据元素 typedef struct { int front; int rear; int count; //计数器,用来记录元素个数 datatype data[QueueSize]; //数据内容 }cirqueue; //置空队 void InitQueue(cirqueue *q) { q->front = q->rear = 0; q->count = 0; } //判断队满 int QueueFull(cirqueue *q) { return (q->count == QueueSize); } //判断队空 int QueueEmpty(cirqueue *q) { return (q->count == 0); } //入队 void EnQueue(cirqueue *q, datatype x) { assert(QueueFull(q) == 0); //q满,终止程序 q->count++; q->data[q->rear] = x; q->rear = (q->rear + 1)%QueueSize; //循环队列设计,防止内存浪费 } //出队 datatype DeQueue(cirqueue *q) { datatype temp; assert(QueueEmpty(q) == 0);//q空,则终止程序,打印错误信息 temp = q->data[q->front]; q->count--; q->front = (q->front + 1)%QueueSize; return temp; }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- js设计模式之惰性单例模式
- 阻止a标签的默认事件及延伸
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
- 《JavaScript高级程序设计》学习笔记(4)——引用类型
- iOS项目——基本框架搭建
- iOS学习——键盘弹出遮挡输入框问题解决方案
- iOS项目——项目开发环境搭建
- im协议设计选型(上)
- iOS学习——UIAlertController详解
- iOS学习——获取iOS设备的各种信息
- iOS学习——属性引用self.xx与_xx的区别
- iOS学习——iOS 整体框架及类继承框架图
- iOS学习—— UINavigationController的返回按钮与侧滑返回手势的研究
- iOS学习——iOS常用的存储方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 建造者模式_动力节点Java学院整理
- Android ScrollView嵌套横向滑动控件时冲突问题
- Android用户输入自动提示控件AutoCompleteTextView使用方法
- Android自定义View实现水波纹效果
- Android如何获取系统通知的开启状态详解
- Handler实现线程之间的通信下载文件动态更新进度条
- Android下Button实现图文混排效果
- android handler.post和handler.sendMessage的区别和联系
- 3小时带你开发一款商城类小程序(零基础入门小程序系列)
- Android 隐式Intent的实例详解
- Android编程使用加速度传感器实现摇一摇功能及优化的方法详解
- 微信小程序分页加载数据~上拉加载更多~小程序云数据库的分页加载
- TextView实现跑马灯效果 就这么简单!
- Android自带emoji表情的使用方法详解
- Android EditText实现输入表情