//    队列的单链表实现
// 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方
// 首节点:头节点后第一个节点,存放数据 #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. BIOS中的UEFI和Legacy启动模式

    BIOS即Basic Input/Output System,翻成中文是"基本输入/输出系统",是一种所谓的"固件",负责在开机时做硬件启动和检测等工作,并且担 ...

  2. Redis相关指令文档

    连接控制 QUIT 关闭连接 AUTH (仅限启用时)简单的密码验证 适合全体类型的命令 EXISTS key 判断一个键是否存在;存在返回 1;否则返回0; DEL key 删除某个key,或是一系 ...

  3. R语言︱分布函数与概率密度+随机数产生

    1.常见概率分布 ##正态分布 pnorm(1.96) #P(x<=1.96)时的分布概率 pnorm(1.96,0,1) #上同 pnorm(1.96,lower.tail = F) #P(x ...

  4. vxWorks/BootROM Imageq启动顺序详解

    vxWorks/BootROM Imageq启动顺序详解 VxWorks image     分为在ROM中运行和在RAM中运行两种,两者启动顺序的区别在于sysInit()函数的调用,该函数在RAM ...

  5. DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)

    虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...

  6. FFMPEG:压缩之H264编码(YUV420P->H264)

    720*576@25hz,550帧的yuv420p数据,编码时间13.3秒. void CTest0Dlg::OnButton5() { // TODO: Add your control notif ...

  7. java类型转换详解(自动转换和强制转换)

    自动转换 class Hello { public static void main(String[] args) { //自动转换 int a = 5; byte b = 6; int c = a ...

  8. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  9. yum执行时Another app is currently holding the yum lock; waiting for it to exit... The other application is: yum

    可能是系统自动升级正在运行,yum在锁定状态中. 已经有一个yum进程在运行了,使用kill干掉它: # # ps aux|grep yum root pts/ S+ : : grep yum roo ...

  10. Rlwrap工具的安装和配置

    1.创建安装目录装备安装包 root权限 [root@dbsrc oracle]# mkdir /stage [root@dbsrc oracle]# chmod –R 777 /stage 从U盘将 ...