C语言描述队列的实现及操作(链表实现)
// 队列的单链表实现
// 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方
// 首节点:头节点后第一个节点,存放数据 #include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Elementype; // 定义数据类型
// 定义节点结构
typedef struct Node {
Elementype Element; // 数据域
struct Node * Next;
}NODE, *PNODE; // 定义队列结构体
typedef struct QNode {
PNODE Front, Rear; // 队列头,尾指针
} Queue, *PQueue; // 声明函数体
void InitQueue(PQueue); // 创建队列函数
bool IsEmptyQueue(PQueue); // 判断队列是否为空函数
void InsertQueue(PQueue, int val); // 入队函数
void DeleteQueue(PQueue,int * val); // 出队函数
void DestroyQueue(PQueue); // 摧毁队列函数
void TraverseQueue(PQueue); // 遍历队列函数
void ClearQueue(PQueue); // 清空队列函数
int LengthQueue(PQueue); // 求队列长度函数 // 主函数
int main() {
int val = ; // 定义临时变量
Queue queue; // 创建队列变量
InitQueue(&queue); // 调用初始化队列函数
IsEmptyQueue(&queue); // 调用判断队列是否为空函数
InsertQueue(&queue, ); //调用入队函数
InsertQueue(&queue, );
InsertQueue(&queue, );
InsertQueue(&queue, );
InsertQueue(&queue, );
InsertQueue(&queue, );
IsEmptyQueue(&queue);
TraverseQueue(&queue); // 调用队列遍历函数
DeleteQueue(&queue, &val); // 调用出队函数
TraverseQueue(&queue);
ClearQueue(&queue); // 调用清空队列函数
IsEmptyQueue(&queue);
DestroyQueue(&queue); // 调用摧毁队列函数 return ;
} // 定义队列初始化函数
void InitQueue(PQueue queue) {
queue->Front = queue->Rear = (PNODE)malloc(sizeof(NODE)); // 动态创建头节点,使队头,队尾指向该节点
//头节点相当于哨兵节点的作用,不存储数据(区别于首节点)
if (queue->Front == NULL) { // 判断内存是否分配成功
printf("创建队列,无法分配所需内存...");
exit(-);
}
queue->Front->Next = NULL; // 初始队列头节点指针指向为空
printf("创建队列成功...\n");
} // 定义判断队列是否为空函数
bool IsEmptyQueue(PQueue queue) {
if (queue->Front == queue->Rear) {
printf("队列为空...\n");
return true;
}
else {
//printf("队列不为空...\n");
return false;
} }
// 定义入队函数
// 从队列尾部插入数据val
void InsertQueue(PQueue queue,int val) {
PNODE P = (PNODE)malloc(sizeof(NODE)); // 创建一个新节点用于存放插入的元素
if (P == NULL) {
printf("内存分配失败,无法插入数据%d...", val);
exit(-);
}
P->Element = val; // 把要插入的数据放到节点数据域
P->Next = NULL; // 新节点指针指向为空
queue->Rear->Next = P; // 使上一个队列尾部的节点指针指向新建的节点
queue->Rear = P; // 更新队尾指针,使其指向队列最后的节点
printf("插入数据 %d 成功...\n", val);
} // 定义出队函数
// 从队列的首节点开始出队
// 若出队成功,用val返回其值
void DeleteQueue(PQueue queue,int* val) {
if (IsEmptyQueue(queue)) {
printf("队列已经空,无法出队...\n");
exit(-);
}
PNODE P= queue->Front->Next; // 临时指针
*val = P->Element; // 保存其值
queue->Front->Next = P->Next; // 更新头节点
if (queue->Rear==P)
queue->Rear = queue->Front;
free(P); // 释放头队列
P = NULL; // 防止产生野指针
printf("出栈成功,出栈值为 %d\n", *val);
}
// 定义队列遍历函数
void TraverseQueue(PQueue queue) { if (IsEmptyQueue(queue)) {
exit(-);
}
PNODE P = queue->Front->Next; //从队列首节点开始遍历(非头节点,注意区分)
printf("遍历队列结果为:");
while (P != NULL) {
printf("%d ", P->Element);
P = P->Next;
}
printf("\n");
}
// 定义队列的摧毁函数
// 删除整个队列,包括头节点
void DestroyQueue(PQueue queue) {
//从头节点开始删除
while (queue->Front != NULL) {
queue->Rear = queue->Front->Next;
free(queue->Front);
queue->Front = queue->Rear;
}
printf("摧毁队列成功...\n");
}
// 定义清空队列函数
void ClearQueue(PQueue queue) {
PNODE P = queue->Front->Next; // 临时指针
PNODE Q = NULL; // 临时指针
queue->Rear = queue->Front; // 使队尾指针指向头节点
queue->Front->Next = NULL;
// 从首节点开始清空
while (P != NULL) {
Q = P;
P = P->Next;
free(Q);
}
printf("清空队列成功...\n"); }
运行结果
C语言描述队列的实现及操作(链表实现)的更多相关文章
- C语言描述队列的实现及操作(数组实现)
一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- C语言描述二叉树的实现及操作(链表实现)
概述 二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...
- C语言描述栈的实现及操作(数组实现)
一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...
- C语言描述栈的实现及操作(链表实现)
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...
- 【数据结构】之队列(C语言描述)
队列(Queue)是编程中最常用的数据结构之一. 队列的特点是“先进先出”,就像食堂排队买饭一样,先来的人排在前面,后来的人排在后面:前面的人先买饭,买完饭后离开这个队列.这就是队列的原理,它可以进行 ...
- 数据结构(java语言描述)
概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
随机推荐
- java Socket实现简单在线聊天(一)
最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...
- mysql数据库字符集编码查看以及设置
show variables like %char% character_set_client | gb2312 character_s ...
- 【mongodb系统学习之二】mongodb的启动
二.mongodb的启动: 1.在mongodb2.6.9的文件夹中建立data目录.logs目录以及 logs目录下的mongodb.log文件,如图: 2.进入到mongodb的bin目录中执 ...
- WebService之CXF注解之三(Service接口实现类)
ITeacherServiceImpl.java: /** * @Title:ITeacherServiceImpl.java * @Package:com.you.service.impl * @D ...
- dojo中表格行隐藏出错
1.错误描述 TypeError:role._by_idx[e.rowIndex].hide is not a function (54 out of range 3) 2.错误原 ...
- No bean named 'cxf' is defined
1.错误描述 严重:Exception starting filter CXFServlet org.springframework.beans.factory.NoSuchBeanD ...
- 存储过程 100w提交
create or replace procedure largedata_insert(ip_table_name in varchar2, --目标表 ip_table_column in v ...
- Codeforces Round #424 Div2 E. Cards Sorting
我只能说真的看不懂题解的做法 我的做法就是线段树维护,毕竟每个数的顺序不变嘛 那么单点维护 区间剩余卡片和最小值 每次知道最小值之后,怎么知道需要修改的位置呢 直接从每种数维护的set找到现在需要修改 ...
- Python中进程
程序 程序:编写完的代码称为程序. 进程 进程:又称重量级进程,正在执行中的程序称为进程.进程的执行会占用内存等资源.多个进程同时执行时,每个进程的执行都需要由操作系统按一定的算法(RR调度.优先数调 ...
- freemarker之list遍历(八)
1.设置数据源 /** * * @Title:student * @Description: * @param:@param name * @return: void * @throws */ pri ...