#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语言实现相关推荐

  1. c语言程序考试试题,C语言程序设计期末考试试题(含答案)

    <C语言程序设计期末考试试题(含答案)>由会员分享,可在线阅读,更多相关<C语言程序设计期末考试试题(含答案)(6页珍藏版)>请在人人文库网上搜索. 1.C 语言程序设计期末考 ...

  2. 8255a初始化c语言程序,8255A的c语言程序.doc

    8255A的c语言程序 8255A的c语言程序 [实例24]用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit C ...

  3. 程序设计基础(c语言),程序设计基础(C语言)

    <程序设计基础(C语言)>由会员分享,可在线阅读,更多相关<程序设计基础(C语言)(26页珍藏版)>请在人人文库网上搜索. 1.程序设计基础(C语言),东北大学高级语言程序设计 ...

  4. c语言程序优化设计,C程序设计语言的教学策略优化设计

    摘要:本文围绕提高C语言课堂教学的教学质量,依据教学内容的属性与特点,融合任课教师的教学经验与智慧,通过选择恰当的教学方法,采用合理的教学手段设计了一种教学优化策略,强化了教学方案设计的科学性,保证了 ...

  5. 怎样检查c语言程序的问题,C语言陷阱与技巧第24节,做代码选择,不一定都要使用 if 判断的...

    在C语言程序开发中,实现需求的解决方案往往不止一个.解决一个问题,程序员一般都能够设计出多个解决方案,并写出相应的C语言代码. 可能有读者会觉得,解决问题的话,写出一种方法就可以了,给出多个方法没有意 ...

  6. 最小二乘法 c 语言程序,最小二乘法采用C语言.docx

    最小二乘法 C 语言 1.实验目的: 进一步熟悉曲线拟合的最小二乘法. 掌握编程语言字符处理程序的设计和调试技术. 2.实验要求: 输入:已知点的数目以及各点坐标 . 输出:根据最小二乘法原理以及各点 ...

  7. c语言程序的引言,C语言程序设计-第1章-引言

    <C语言程序设计-第1章-引言>由会员分享,可在线阅读,更多相关<C语言程序设计-第1章-引言(80页珍藏版)>请在人人文库网上搜索. 1.c语言编程,2,1 .你为什么学这门 ...

  8. c语言程序编写字体,c语言程序设计练习题

    c语言程序设计练习题 篇一:c语言程序设计基础单元总结与练习题及答案 <C语言程序设计>单元总结与练习题 答 案 单元一 程序设计宏观认识 单元总结提升 本单元中,核心内容有C语言程序框架 ...

  9. c语言程序编程线性方程,C语言编程求解线性方程.doc

    C语言编程求解线性方程 本 科 专 业 学 年 论 文 题目:线性方程组求解方法比较 姓 名 郭 凤 专 业 计算机科学与技术专业 班 级 08级本科(2)班 指导教师 刘 晓 娜 完成日期:2010 ...

最新文章

  1. 任何网站优化都离不开的四个方向是什么?
  2. 定义一个类mymath_C++:模板类
  3. 矩阵快速幂 学习笔记
  4. java中split以“.“ 、“\“、“|”分隔
  5. 编写基于事件的CQRS读取模型
  6. Trie(字典)树详解
  7. Linux 下自动化脚本安装Jdk、Nginx等软件
  8. Python实现空间直角坐标转高斯克吕格平面坐标
  9. 二十一个心理学效应 笔记
  10. linux 串口 arduino,linux通过串口对arduino读写
  11. 第二期项目订房网错误分析
  12. Android 闹钟app 课程设计
  13. 移动APP测试用例设计实践经验分享
  14. 删除之后在计算机操作中快捷键,电脑删除快捷键有哪些|电脑删除快捷键大全...
  15. 使用openssl生成crt证书
  16. 单元测试总结反思_语文单元考试反思
  17. System Verilog约束块(constrain block)控制和随机变量的随机属性控制
  18. 事件驱动模型与IO多路复用
  19. 本地存储localStorage的用法总结
  20. 华科尔 D7E deviation 固件 三段开关 设置

热门文章

  1. Google“谷歌”引发的王怀南血案
  2. 手游无间狱完整源码(开发+运维+环境搭建+GM命令等)
  3. 对象映射框架MapStruct与orika的简单使用
  4. 软件工程-数据流图+ER图绘制听课笔记
  5. 1896-2021历届奥运会奖牌榜(Python数据处理)
  6. 图像去雾(二)Retinex图像增强算法
  7. Jquery方法实现图片放大缩小
  8. java dem数据格式解析_NSDTF-DEM格式数据
  9. java runtime异常如何解决_成都汇智动力-Java中常见的RunTime异常及异常详解
  10. Oracle cursor 游标详解