出队列c语言程序,队列的c语言实现
#include
#include
//实现队列的数据结构
//队列是只允许队尾插入,队头删除的存储结构
//先来看顺序存储结构(数组实现)
#define OK 1
#define ERROR -1
#define MAX 10 //定义队列的长度
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType data[MAX];
int head;//队头
int tail;//队尾
}Queue;
//初始化操作
Status InitQueue(Queue *Q){
// memset(Q->data,'\0',sizeof(ElemType)*MAX);
Q->head=0;
Q->tail=0;//指向队尾元素的下一个位置
return OK;
}
//产生测试队列
Status CreateQueue(Queue *Q,int n){
//初始化队列
//产生一个长度为n的测试队列
srand(time(0));
int i;
for(i=0;i
Q->data[(Q->tail)++]=rand()%100+1;
}
return OK;
}
//入队操作
Status EnQueue(Queue *Q,ElemType e){
//判断是否队满
if(Q->tail==MAX){
printf("队列已满,不能入队");
return ERROR;
}
Q->data[Q->tail]=e;
++(Q->tail);
return OK;
}
//出队操作
Status DeQueue(Queue *Q,ElemType *e){
//将出队的元素传给e
//判读是否为空队
if(Q->tail==0 || Q->tail<=Q->head){
printf("空队列,无法出队!");
return ERROR;
}
*e=Q->data[Q->head];
//队头后移
++(Q->head);
return OK;
}
int main()
{
Queue Q;
int i,n,e;
if(OK!=InitQueue(&Q)){
printf("初始化失败!");
return ERROR;
}
printf("输入要产生的队列长度!");
scanf("%d",&n);
if(n>MAX){
printf("已超出队列的最大长度");
return ERROR;
}
if(OK==CreateQueue(&Q,n)){
//输出队列的值
for(i=Q.head;i
printf("%d\t",Q.data[i]);
}
printf("\n头为%d\n",Q.head);
printf("尾为%d\n",Q.tail);
}
printf("输入要插入的元素!\n");
while(1==scanf("%d",&e)){
if(OK==EnQueue(&Q,e)){
for(i=Q.head;i
printf("%d\t",Q.data[i]);
}
printf("\n头为%d\n",Q.head);
printf("尾为%d\n",Q.tail);
}else{
break;
}
}
printf("元素依次出队\n");
while(OK==DeQueue(&Q,&e)){
printf("出队元素为%d\t,队头为%d\n",e,Q.head);
}
return 0;
}
以上代码是队列的简单实现;由于出队时仅仅是将队头后移,入队时队尾只能往后移动;会出现队头挨近队尾时,队头前面大量空间未被使用的情况,从而浪费了大量的存储空间。
考虑入队时,队尾如果到达存储队列的数组的末尾时,而实际上队列并没有满,前面还有空余的存储空间;队尾则移到数组的首部;执行后续操作。
循环队列是首尾相接的循序存储结构。
循环队列的数据结构和简单队列的结构一样;只是入队、出队、求长等需要变化一下。
Status EnQueue2(Queue *Q,ElemType e){
//循环队列同样要判断队列是否为空;
//注意循环队列的head可能大于tail
//循环队列满的条件判断
if((Q->tail+1)%MAX==Q->head){
//队列满了
printf("队列已满!\n");
return ERROR;
}
Q->data[Q->tail]=e;
//Q->tail的范围在0~MAX-1;
Q->tail=(Q->tail+1)%MAX;
return OK;
}
Status DeQueue2(Queue *Q,ElemType *e){
// 循环队列的出队操作
//判断队列是否为空
//此处会有一个bug;当输入的队长度为MAX时,初始化后的Q->tail=MAX;而Q->head的范围是0~MAX-1;永远无法满足条件Q->head==Q->tail
if(Q->head==Q->tail){
printf("循环队列为空!");
return ERROR;
}
*e=Q->data[Q->head];
Q->head=(Q->head+1)%MAX;
return OK;
}
int QLen(Queue Q){
return (Q.tail-Q.head+MAX)%MAX;
}
同线性表一样,队列既然有循序存储结构,就有链式存储结构;队列的链式存储结构主要是为了解决队列存储空间的问题。
#include
#include
//队列的链式存储,链式存储的共性是不必考虑存储空间的溢出
//队列的链式存储的基本数据结构其实就是链表;我们还是用单链表来实现
#define OK 1
#define ERROR -1
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType data;
struct Node *next;
}Node,*QNode;
//利用单链表的基本数据结构来定义队列的数据结构
typedef struct{
//队列有结点;头指针和尾指针
QNode head,tail;//QNode是指向结点的指针,该类型已经包含结点,不需要再定义结点了
//head这里设置为指向队头的结点,不是队头,是指向队头的结点
}QList;
//队列初始化
Status InitQ(QList *Q){
//创建一个临时结点
QNode N;
N=(QNode)malloc(sizeof(Node));
N->data=1;
N->next=NULL;
//让队列的首尾指针都指向他
Q->head=N;
Q->tail=N;
return OK;
}
//入队操作
Status EnQue(QList *Q,ElemType e){
//将元素e入队;
QNode N;
N=(QNode)malloc(sizeof(Node));
//需要考虑存储是否溢出
if(!N){
printf("存储分配失败!\n");
return ERROR;
}
N->data=e;
N->next=NULL;
Q->tail->next=N;
Q->tail=N;
return OK;
}
//出队操作
Status DeQue(QList *Q,ElemType *e){
//判断是否为空
if(Q->head==Q->tail){
printf("队列为空");
return ERROR;
}
//注意这里设置的队头是Q->head->next指向的结点;Q->head作为链表的头结点
QNode T;
T=Q->head->next;//将头结点传给临时结点
*e=T->data;
Q->head->next=T->next;
//如果队头到达队尾时(临时结点是尾结点),出队后,队尾指针要指向头结点
if(T==Q->tail){
Q->tail=Q->head;
}
//释放队头结点占的内存;一般的删除操作都要新建一个临时结点,接收要删除的结点,然后调整指针,释放内存
free(T);
return OK;
}
int main()
{
QList Q;
if(OK==InitQ(&Q)){
printf("初始化成功!\n");
}
int e;
e=1;
EnQue(&Q,5);
QNode t;
t=Q.head->next;
printf("%d\n",t->data);
EnQue(&Q,6);
t=t->next;
printf("%d\n",t->data);
DeQue(&Q,&e);
printf("%d\n",e);
DeQue(&Q,&e);
printf("%d\n",e);
DeQue(&Q,&e);
printf("%d\n",e);
return 0;
}
出队列c语言程序,队列的c语言实现相关推荐
- c语言程序考试试题,C语言程序设计期末考试试题(含答案)
<C语言程序设计期末考试试题(含答案)>由会员分享,可在线阅读,更多相关<C语言程序设计期末考试试题(含答案)(6页珍藏版)>请在人人文库网上搜索. 1.C 语言程序设计期末考 ...
- 8255a初始化c语言程序,8255A的c语言程序.doc
8255A的c语言程序 8255A的c语言程序 [实例24]用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit C ...
- 程序设计基础(c语言),程序设计基础(C语言)
<程序设计基础(C语言)>由会员分享,可在线阅读,更多相关<程序设计基础(C语言)(26页珍藏版)>请在人人文库网上搜索. 1.程序设计基础(C语言),东北大学高级语言程序设计 ...
- c语言程序优化设计,C程序设计语言的教学策略优化设计
摘要:本文围绕提高C语言课堂教学的教学质量,依据教学内容的属性与特点,融合任课教师的教学经验与智慧,通过选择恰当的教学方法,采用合理的教学手段设计了一种教学优化策略,强化了教学方案设计的科学性,保证了 ...
- 怎样检查c语言程序的问题,C语言陷阱与技巧第24节,做代码选择,不一定都要使用 if 判断的...
在C语言程序开发中,实现需求的解决方案往往不止一个.解决一个问题,程序员一般都能够设计出多个解决方案,并写出相应的C语言代码. 可能有读者会觉得,解决问题的话,写出一种方法就可以了,给出多个方法没有意 ...
- 最小二乘法 c 语言程序,最小二乘法采用C语言.docx
最小二乘法 C 语言 1.实验目的: 进一步熟悉曲线拟合的最小二乘法. 掌握编程语言字符处理程序的设计和调试技术. 2.实验要求: 输入:已知点的数目以及各点坐标 . 输出:根据最小二乘法原理以及各点 ...
- c语言程序的引言,C语言程序设计-第1章-引言
<C语言程序设计-第1章-引言>由会员分享,可在线阅读,更多相关<C语言程序设计-第1章-引言(80页珍藏版)>请在人人文库网上搜索. 1.c语言编程,2,1 .你为什么学这门 ...
- c语言程序编写字体,c语言程序设计练习题
c语言程序设计练习题 篇一:c语言程序设计基础单元总结与练习题及答案 <C语言程序设计>单元总结与练习题 答 案 单元一 程序设计宏观认识 单元总结提升 本单元中,核心内容有C语言程序框架 ...
- c语言程序编程线性方程,C语言编程求解线性方程.doc
C语言编程求解线性方程 本 科 专 业 学 年 论 文 题目:线性方程组求解方法比较 姓 名 郭 凤 专 业 计算机科学与技术专业 班 级 08级本科(2)班 指导教师 刘 晓 娜 完成日期:2010 ...
最新文章
- 任何网站优化都离不开的四个方向是什么?
- 定义一个类mymath_C++:模板类
- 矩阵快速幂 学习笔记
- java中split以“.“ 、“\“、“|”分隔
- 编写基于事件的CQRS读取模型
- Trie(字典)树详解
- Linux 下自动化脚本安装Jdk、Nginx等软件
- Python实现空间直角坐标转高斯克吕格平面坐标
- 二十一个心理学效应 笔记
- linux 串口 arduino,linux通过串口对arduino读写
- 第二期项目订房网错误分析
- Android 闹钟app 课程设计
- 移动APP测试用例设计实践经验分享
- 删除之后在计算机操作中快捷键,电脑删除快捷键有哪些|电脑删除快捷键大全...
- 使用openssl生成crt证书
- 单元测试总结反思_语文单元考试反思
- System Verilog约束块(constrain block)控制和随机变量的随机属性控制
- 事件驱动模型与IO多路复用
- 本地存储localStorage的用法总结
- 华科尔 D7E deviation 固件 三段开关 设置
热门文章
- Google“谷歌”引发的王怀南血案
- 手游无间狱完整源码(开发+运维+环境搭建+GM命令等)
- 对象映射框架MapStruct与orika的简单使用
- 软件工程-数据流图+ER图绘制听课笔记
- 1896-2021历届奥运会奖牌榜(Python数据处理)
- 图像去雾(二)Retinex图像增强算法
- Jquery方法实现图片放大缩小
- java dem数据格式解析_NSDTF-DEM格式数据
- java runtime异常如何解决_成都汇智动力-Java中常见的RunTime异常及异常详解
- Oracle cursor 游标详解