数据结构之链式队列(C实现)

1.1 linkqueue.h
#ifndef LINKQUEUE_H
#define LINKQUEUE_H #include <stdio.h>
#include <malloc.h> typedef enum
{
OK=, //正确
ERROR=, //出错
TRUE=, //为真
FALSE= //为假
}status; typedef int ElemType; //宏定义队列的数据类型 /* 链式队列:是指采用链式存储结构的队列,队列中每一个元素对应链表中的结点。
* 和链式栈类似,一般采用单链表来实现链式队列。
*************************************************************/
// 链式队列结点结构
typedef struct Node
{
ElemType data; //结点数据
//【负责建立队列各结点之间的联系,前一个结点的next指向后一个结点,形成链式队列】
struct Node *next; //后继结点
}LQNode;
// 链式队列结构
typedef struct
{
LQNode *front; //链式队列的队头指针,总是指向队列的头结点(出队一次,第二个结点变为头结点)
LQNode *rear; //链式队列的队尾指针,入队时指向新插入结点(总是指向队列的最后一个结点)
}LinkQueue; //创建空队列
status initQueue(LinkQueue *pQHead);
//销毁队列
void destroyQueue(LinkQueue *pQHead);
//清空队列
void clearQueue(LinkQueue *pQHead);
//判断队列是否为空
status isEmpityQueue(LinkQueue *pQHead);
//获得队列长度
int getQueueLen(LinkQueue *pQHead);
//新元素入队 [先进先出原则:在队尾的位置插入] element-要插入元素
status enQueue(LinkQueue *pQHead,ElemType element);
//新元素出队,同时保存出队的元素 [先进先出原则:在队头的位置删除]
status deQueue(LinkQueue *pQHead,ElemType *pElement);
//遍历队列
void queueTraverse(LinkQueue *pQHead); #endif // LINKQUEUE_H
1.2 linkqueue.c
#include "linkqueue.h" /*********************************************************************
* 刚开始创建空队列时,队列的队头和队尾指针相等都指向头结点,头结点的数据域不存放数据
* 第一次入队,创建新结点,其数据域保存新插入元素,头结点的next指向新结点,
* 并且队列的队尾指针指向新结点,队列的队头指针仍然指向头结点,依次类推
* 第一次出队,则队列的队头指针指向头结点的next,依次类推
*********************************************************************/ //创建空队列: pQHead即为队列头结点
status initQueue(LinkQueue *pQHead)
{
//队列头结点的队头和队尾指针申请内存
pQHead->front = pQHead->rear = (LQNode*)malloc(sizeof(LQNode));
if(!pQHead->front) //检测是否申请失败
{
printf("pQHead->front malloc error!\n");
return ERROR;
} //设置头结点指针域为空
pQHead->front->next = NULL; return OK;
} //销毁队列
void destroyQueue(LinkQueue *pQHead)
{
free(pQHead->front);
free(pQHead->rear);
pQHead->front = pQHead->rear = NULL;
} //清空队列
void clearQueue(LinkQueue *pQHead)
{
pQHead->front = pQHead->rear;
} //判断队列是否为空
status isEmpityQueue(LinkQueue *pQHead)
{
//队头指针与队尾指针相等,说明队列为空
if(pQHead->front == pQHead->rear)
return TRUE; return FALSE;
} //获得队列长度
int getQueueLen(LinkQueue *pQHead)
{
LQNode *temp = pQHead->front;
int length = ;
while(temp != pQHead->rear)
{
++length;
temp = temp->next;
} return length;
} //新元素入队:即链式队列的尾结点指针,指向存放新元素的新结点
status enQueue(LinkQueue *pQHead, ElemType element)
{
//创建新结点,并申请内存
LQNode *temp = (LQNode*)malloc(sizeof(LQNode));
if(!temp)
{
printf("temp malloc error!\n");
return ERROR;
} temp->data = element; //将要插入元素存入新结点的数据域内
temp->next = NULL; //队列只能从队尾插入所以下一个结点初始化为NULL //链式队列元素为结点(LQNode)
//pQHead->rear为队列的最后一个结点,当插入新结点temp时,pQHead->rear->next = temp
//使前一个结点的next指向新结点,建立队列各结点之间的联系
pQHead->rear->next = temp; //将队尾结点的后继指针指向新结点,如果第一次入队,
//则pQueue->rear->next相当于pQueue->front->next
// pQHead->rear总是指向队列的最后一个结点
pQHead->rear = temp; //将队尾结点的指针指向新结点temp,temp变为最后一个结点 return OK;
} status deQueue(LinkQueue *pQHead,ElemType *pElement)
{
//如果队列为空,则返回ERRIR
if(isEmpityQueue(pQHead)==TRUE)
{
printf("queue is NULL!\n");
return ERROR;
} //值入队一次后就出队,则pQueue->front->next==pQHead->rear->next,为第一个插入的结点
LQNode *temp = pQHead->front->next; //初始化temp为要出队的结点的指针 //如果要出队的结点为最后一个结点,使q->rear指向头结点防止出现悬空的指针
if(pQHead->front->next == pQHead->rear)
pQHead->rear = pQHead->front; *pElement = temp->data; //将出队的数据元素存入*e
pQHead->front->next = temp->next; //使下一个结点成为队头,如果没有下一个结点则为NULL
free(temp); //删除要出队的结点
temp = NULL; return OK;
} //遍历队列
void queueTraverse(LinkQueue *pQHead)
{
//如果队列为空
if(isEmpityQueue(pQHead)==TRUE)
{
printf("\nqueue is NULL!\n");
} LQNode *temp = pQHead->front; printf("将队列中的所有元素出队:\n");
while(temp != pQHead->rear)
{ temp = temp->next;
printf("%d ", temp->data);
}
printf("\n");
}
1.3 main.c
/*********************************************
* C实现链式队列 2017/10/26 by nieXianFeng
*********************************************/
#include <stdio.h>
#include "linkqueue.h" int main()
{
int value; //用于保存出队的元素 //给头结点申请内存
LinkQueue *pQHead= (LinkQueue*)malloc(sizeof(LinkQueue));
if(!pQHead) //检测是否申请失败
{
printf("pQHead malloc error!\n");
return ERROR;
} //调用初始化队列的函数
initQueue(pQHead);
//调用出队函数
enQueue(pQHead, );
enQueue(pQHead, );
enQueue(pQHead, );
enQueue(pQHead, );
enQueue(pQHead, );
enQueue(pQHead, );
enQueue(pQHead, );
enQueue(pQHead, );
//调用遍历队列的函数
queueTraverse(pQHead); //调用出队函数
if(deQueue(pQHead, &value)==OK)
{
printf("出队一次,元素为:%d\n", value);
}
queueTraverse(pQHead);
if(deQueue(pQHead, &value)==OK)
{
printf("出队一次,元素为:%d\n", value);
}
queueTraverse(pQHead); printf("队列长度是%d\n",getQueueLen(pQHead)); clearQueue(pQHead); //清空队列
queueTraverse(pQHead); free(pQHead);
pQHead = NULL; return ;
}
数据结构之链式队列(C实现)的更多相关文章
- C++数据结构之链式队列(Linked Queue)
C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...
- C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...
- 数据结构-链式队列-C++
用链表搭建的栈与队列相对简单,队列的特点是先进先出,不啰嗦了,由于代码比较简单,相信光顾的人不会太多,下面直接贴代码. 头文件 #ifndef QUEUELI_H #define QUEUELI_H ...
- 利用链式队列(带头节点)解决银行业务队列简单模拟问题(c++)-- 数据结构
题目: 7-1 银行业务队列简单模拟 (30 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客 ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)
一,数据结构——链表全操作: 链表形式: 其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点: 特别说明:对于单链表,每个节点(Nod ...
- [数据结构]C语言队列的实现
我个人把链表.队列.栈分为一类,然后图.树分为一类.(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列.栈.(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完 ...
- C语言实现链式队列
链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...
随机推荐
- 【ZJOI2017 Round1练习&BZOJ5354】D7T3 room(DP)
题意: 思路: 写了两种版本 考场版本 ..,..]of longint; t:..,..]of longint; n,m,i,j,k,oo,ans,d1:longint; function min( ...
- 【Tomcat】tomcat启动后查看运行时JVM参数
Tomcat优化配置参考http://www.cnblogs.com/qlqwjy/p/8007490.html 1.启动服务后访问localhost,点击Server Status
- POJ3295 Tautology 解题报告
直接上分析: 首先 弄清各种大写字母的操作的实质 K 明显 是 and & A 是 or | N 是 not ! C 由表格注意到 当 w<=x 时 值为1 E 当 ...
- springboot 子模块访问不到对应的页面
出现如下错误 解决方案 working directory:没有$MODULE_DIR$该选项,自己输入即可. 完成以上操作就可以正常访问页面了.
- Java正则表达式过滤出字母、数字和中文
原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...
- ViewPager学习之仿微信主界面
由于素材的原因,这里都是从网上找的图片,所以所谓的仿微信实际上最后成了下图这货.. .,点击变色也是自己用的windows自带绘图的颜料桶填充的空白. .. watermark/2/text/aHR0 ...
- DEV Express控件VScorllBar控件使用
今天使用VScorllBall控件做了个控制界面上下滑动的功能,网上也找了这方面的资料,大概综合借鉴了一下之后,搞了一个适合我自己的自定义功能控件. 下面话不多说,直接上代码. private voi ...
- scu oj 4442 Party(2015年四川省acm程序设计竞赛)
Party n frogs are invited to a tea party. Frogs are conveniently numbered by 1,2,-,n. The tea party ...
- easyUI datagrid 时间格式化
从后台传过来的数据,其中含有日期字段,那么在前端的easyUI这里显示的话,会显得比较怪异,一大串,中间是个T,后面一大堆零,不知道是什么意思. 看来要进行格式化. 问题是,在哪里格式化? 如果在后端 ...
- JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法
首先要注册百度地图API. 1.登录百度地图开放平台http://lbsyun.baidu.com 注册账号,完善信息,点击网站右上角的“API控制台”,点击,创建应用. 应用类型选择:“浏览器端”, ...