//    队列的单链表实现
// 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方
// 首节点:头节点后第一个节点,存放数据 #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语言描述队列的实现及操作(链表实现)的更多相关文章

  1. C语言描述队列的实现及操作(数组实现)

    一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...

  2. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  3. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  4. C语言描述二叉树的实现及操作(链表实现)

    概述     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...

  5. C语言描述栈的实现及操作(数组实现)

    一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...

  6. C语言描述栈的实现及操作(链表实现)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...

  7. 【数据结构】之队列(C语言描述)

    队列(Queue)是编程中最常用的数据结构之一. 队列的特点是“先进先出”,就像食堂排队买饭一样,先来的人排在前面,后来的人排在后面:前面的人先买饭,买完饭后离开这个队列.这就是队列的原理,它可以进行 ...

  8. 数据结构(java语言描述)

    概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...

  9. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

随机推荐

  1. 视频显示格式720p

    720p是一种视频显示格式.字母p意为逐行扫描(progressive scan),数字720则表示水平方向有720条扫描线. 通常720p的画面分辨率为1280×720,一般亦可称为高画质(HD). ...

  2. 错误代码: 1449 The user specified as a definer ('root'@'%') does not exist

    1. 错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:call analyse_use('20150501','20150601 ...

  3. class-k近邻算法kNN

    1 k近邻算法2 模型2.1 距离测量2.2 k值选择2.3 分类决策规则3 kNN的实现--kd树3.1 构造kd树3.2 kd树搜索 1 k近邻算法 k nearest neighbor,k-NN ...

  4. 【原】Spring源码浅析系列-导入源码到Eclipse

    用了Spring几年,平时也断断续续在项目里看过一些源码,大多都是比较模糊的,因为一旦从一个地方进去就找不到方向了,只能知道它大概是做了什么事能达到这个功能或者效果,至于细节一般没有太深入去研究.后来 ...

  5. 【NFS】nfs安装调优

    nfs [root@flymaster ~]# rpm -qa nfs-utils rpcbindnfs-utils-1.2.3-75.el6.x86_64rpcbind-0.2.0-13.el6_9 ...

  6. PyTorch官方中文文档:torch.Tensor

    torch.Tensor torch.Tensor是一种包含单一数据类型元素的多维矩阵. Torch定义了七种CPU tensor类型和八种GPU tensor类型: Data tyoe CPU te ...

  7. 【BZOJ4827】【HNOI2017】礼物(FFT)

    [BZOJ4827][HNOI2017]礼物(FFT) 题面 Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每 ...

  8. 【Luogu3806】点分治(点分治)

    [Luogu3806]点分治(点分治) 题面 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行 ...

  9. [BZOJ1003] [ZJOI2006] 物流运输trans (最短路 & dp)

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  10. 在 WinForm 中 如何实现 加载等待功能

    1,需要一个动态的londing文件:在项目中我们新建一个文件夹来存放它: 2,在需要出现londing状态的窗体上加上一个Panel: 黄色区域是Panel,灰色的是需要被加载的区域.当需要触发lo ...