• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >数据结构 > 数据结构C语言实现之队列

数据结构C语言实现之队列

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2017-06-28

匿名通过本文主要向大家介绍了c语言数据结构队列,数据结构c 队列,数据结构队列,数据结构栈和队列,数据结构队列代码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
</div>

#include<stdio.h>
#include<stdlib.h>
typedefintelemType;
/************************************************************************/
/*          以下是关于队列链接存储操作的6种算法       */
/************************************************************************/
structsNode{
   elemTypedata;      /*值域*/
   structsNode*next;    /*链接指针*/
};
structqueueLK{
   structsNode*front;  /*队首指针*/
   structsNode*rear;    /*队尾指针*/
};
/*1.初始化链队*/
voidinitQueue(structqueueLK*hq)
{
   hq->front=hq->rear=NULL;    /*把队首和队尾指针置空*/
   return;
}
/*2.向链队中插入一个元素x*/
voidenQueue(structqueueLK*hq,elemTypex)
{
   /*得到一个由newP指针所指向的新结点*/
   structsNode*newP;
   newP=malloc(sizeof(structsNode));
   if(newP==NULL){
     printf("内存空间分配失败! ");
     exit(1);
   }
   /*把x的值赋给新结点的值域,把新结点的指针域置空*/
   newP->data=x;
   newP->next=NULL;
   /*若链队为空,则新结点即是队首结点又是队尾结点*/
   if(hq->rear==NULL){
     hq->front=hq->rear=newP;
   }else{  /*若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点*/
     hq->rear=hq->rear->next=newP;    /*注意赋值顺序哦*/
   }
   return;
}
/*3.从队列中删除一个元素*/
elemTypeoutQueue(structqueueLK*hq)
{
   structsNode*p;
   elemTypetemp;
   /*若链队为空则停止运行*/
   if(hq->front==NULL){
     printf("队列为空,无法删除! ");
     exit(1);
   }
   temp=hq->front->data;    /*暂存队尾元素以便返回*/
   p=hq->front;        /*暂存队尾指针以便回收队尾结点*/
   hq->front=p->next;    /*使队首指针指向下一个结点*/
   /*若删除后链队为空,则需同时使队尾指针为空*/
   if(hq->front==NULL){
     hq->rear=NULL;
   }
   free(p);    /*回收原队首结点*/
   returntemp;  /*返回被删除的队首元素值*/
}
/*4.读取队首元素*/
elemTypepeekQueue(structqueueLK*hq)
{
   /*若链队为空则停止运行*/
   if(hq->front==NULL){
     printf("队列为空,无法删除! ");
     exit(1);
   }
   returnhq->front->data;    /*返回队首元素*/
}
/*5.检查链队是否为空,若为空则返回1,否则返回0*/
intemptyQueue(structqueueLK*hq)
{
   /*判断队首或队尾任一个指针是否为空即可*/
   if(hq->front==NULL){
     return1;
   }else{
     return0;
   }
}
/*6.清除链队中的所有元素*/
voidclearQueue(structqueueLK*hq)
{
   structsNode*p=hq->front;    /*队首指针赋给p*/
   /*依次删除队列中的每一个结点,最后使队首指针为空*/
   while(p!=NULL){
     hq->front=hq->front->next;
     free(p);
     p=hq->front;
   }  /*循环结束后队首指针已经为空*/
   hq->rear=NULL;    /*置队尾指针为空*/
   return;
}
/************************************************************************/
intmain(intargc,char*argv[])
{
   structqueueLKq;
   inta[8]={3,8,5,17,9,30,15,22};
   inti;
   initQueue(&q);
   for(i=0;i<8;i++){
     enQueue(&q,a[i]);
   }
   printf("%d",outQueue(&q));  printf("%d ",outQueue(&q));
   enQueue(&q,68);
   printf("%d",peekQueue(&q));  printf("%d ",outQueue(&q));
   while(!emptyQueue(&q)){
     printf("%d",outQueue(&q));
   }
   printf(" ");
   clearQueue(&q);
   system("pause");
}
#include<stdio.h>
#include<stdlib.h>
typedefintelemType;
/************************************************************************/
/*           以下是关于队列顺序存储操作的6种算法       */
/************************************************************************/
structqueue{
   elemType*queue;    /*指向存储队列的数组空间*/
   intfront,rear,len;  /*队首指针(下标),队尾指针(下标),队列长度变量*/
   intmaxSize;      /*queue数组长度*/
};
voidagainMalloc(structqueue*q)
{
   /*空间扩展为原来的2倍,原内容被自动拷贝到p所指向的存储空间中*/
   elemType*p;
   p=realloc(q->queue,2*q->maxSize*sizeof(elemType));
   /*动态存储空间分配,若失败则退出运行*/
   if(!p){
     printf("空间分配失败! ");
     exit(1);
   }
   q->queue=p;    /*使queue指向新的队列空间*/
   /*把原队列的尾部内容后移maxSize个位置*/
   if(q->rear!=q->maxSize-1){
     inti;
     for(i=0;i<=q->rear;i++){
       q->queue[i+q->maxSize]=q->queue[i];
     }
     q->rear+=q->maxSize;    /*队尾指针后移maxSize个位置*/
   }
   q->maxSize=2*q->maxSize;  /*把队列空间大小修改为新的长度*/
   return;
}
/*1.初始化队列*/
voidinitQueue(structqueue*q,intms)
{
   /*检查ms是否有效,若无效则退出运行*/
   if(ms<=0){
     printf("ms值非法! ");
     exit(1);
   }
   q->maxSize=ms;    /*置队列空间大小为ms*/
   /*动态存储空间分配,若失败则退出运行*/
   q->queue=malloc(ms*sizeof(elemType));
   if(!q->queue){
     printf("内存空间分配失败! ");
     exit(1);
   }
   q->front=q->rear=0;    /*初始置队列为空*/
   return;
}
/*2.向队列中插入元素x*/
voidenQueue(structqueue*q,elemTypex)
{
   /*当队列满时进行动态生分配*/
   if((q->rear+1)%q->maxSize==q->front){
     againMalloc(q);
   }
   q->rear=(q->rear+1)%q->maxSize;    /*求出队尾的下一个位置*/
   q->queue[q->rear]=x;            /*把x的值赋给新的队尾*/
   return;
}
/*3.从队列中删除元素并返回*/
elemTypeoutQueue(structqueue*q)
{
   /*若队列为空则终止运行*/
   if(q->front==q->rear){
     printf("队列为空,无法删除! ");
     exit(1);
   }
   q->front=(q->front+1)%q->maxSize;    /*使队首指针指向下一个位置*/
   returnq->queue[q->front];          /*返回队首元素*/
}
/*4.读取队首元素,不改变队列状态*/
elemTypepeekQueue(structqueue*q)
{
   /*若队列为空则终止运行*/
   if(q->front==q->rear){
     printf("队列为空,无法删除! ");
     exit(1);
   }
   returnq->queue[(q->front+1)%q->maxSize];/*队首元素是队首指针的下一个位置中的元素*/
}
/*5.检查一个队列是否为空,若是则返回1,否则返回0*/
intemptyQueue(structqueue*q)
{
   if(q->front==q->rear){
     return1;
   }else{
     return0;
   }
}
/*6.清除一个队列,并释放动态存储空间*/
voidclearQueue(structqueue*q)
{
   if(q->queue!=NULL){
     free(q->queue);
     q->queue=NULL;      /*设置队列空间指针为空*/
     q->front=q->rear=0;    /*设置队列为空*/
     q->maxSize=0;        /*设置队列大小为0*/
   }
   return;
}
/************************************************************************/
intmain(intargc,char*argv[])
{
   structqueueq;
   inta[8]=

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 数据结构C语言实现之队列

相关文章

  • 2017-06-28数据结构教程 第四十课 总复习
  • 2017-06-28数据结构教程 第十课 栈的表示与实现
  • 2017-06-28数据结构教程 第二十四课 遍历二叉树
  • 2017-06-28迭代算法与递归算法的概念及区别
  • 2017-06-28PB动态创建菜单的核心算法描述
  • 2017-06-28C#算法设计与分析-寻找素数
  • 2017-06-28数据结构教程 第二十五课 单元测验
  • 2017-06-28数据结构教程 第三十二课 哈希表(一)
  • 2017-06-28数据结构教程 第六课 线性表的顺序表示和实现
  • 2017-06-28数据结构教程 第三十七课 实验八 排序实验

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • UVa1584 环状序列 (Circular Sequence)
    • 数据结构教程 第三十四课 插入排序、快速排序
    • 数据结构教程 第二十六课 图的定义与术语
    • 做幻方
    • 数据结构教程 第四十课 总复习
    • 路由基础知识:路由算法
    • java排序算法
    • 数据结构教程 第二十五课 单元测验
    • 数据结构教程 第十四课 串的定义
    • 数据结构C语言实现之线性表

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有