[数据结构]程杰队列的链式存储结构及实现代码

《大话数据结构》的笔记(作者: 程杰) 大话数据结构 程杰 第1章 数据结构绪论 2015-08-11 数据结构: 是相互之间存在一种或多种特定关系的数据元素的集合。 1.3 数据结构起源 2015-08-12 程序设计=数据结构+算法 1.4.5 数据结构 2015-08-12 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 1.5.1 逻辑 阅读详情
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20      /* 存储空间初始分配量 */

typedef int Status;

typedef int QElemType;  /* QElemType类型根据实际情况而定,这里假设为int */

typedef struct QNode	/* 结点结构 */
{
   QElemType data;
   struct QNode *next;
}QNode,*QueuePtr;

typedef struct			/* 队列的链表结构 */
{
   QueuePtr front,rear; /* 队头、队尾指针 */
}LinkQueue;

Status visit(QElemType c)
{
	printf("%d ",c);
	return OK;
}

/* 构造一个空队列Q */
Status InitQueue(LinkQueue *Q)
{
	Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
	if(!Q->front)
		exit(OVERFLOW);
	Q->front->next=NULL;
	return OK;
}

/* 销毁队列Q */
Status DestroyQueue(LinkQueue *Q)
{
	while(Q->front)//当Q->front不为空的时候,即队列中还有元素时执行这个while循环
	{
		 Q->rear=Q->front->next;//删除的都是队首元素,里用Q->rear来储存Q->front->next
		 free(Q->front);
		 Q->front=Q->rear;
	}
	return OK;
}

/* 将Q清为空队列 */
Status ClearQueue(LinkQueue *Q)
{
	QueuePtr p,q;
	Q->rear=Q->front;
	p=Q->front->next;
	Q->front->next=NULL;//已经被p储存起来了。
	while(p)//当队列还没空
	{
		 q=p;
		 p=p->next;
		 free(q);
	}
	return OK;
}

/* 若Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(LinkQueue Q)
{
	if(Q.front==Q.rear)
		return TRUE;
	else
		return FALSE;
}

/* 求队列的长度 */
int QueueLength(LinkQueue Q)
{
	int i=0;
	QueuePtr p;
	p=Q.front;
	while(Q.rear!=p)
	{
		 i++;
		 p=p->next;
	}
	return i;
}

/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
Status GetHead(LinkQueue Q,QElemType *e)
{
	QueuePtr p;
	if(Q.front==Q.rear)
		return ERROR;
	p=Q.front->next;
	*e=p->data;
	return OK;
}


/* 插入元素e为Q的新的队尾元素 */
Status EnQueue(LinkQueue *Q,QElemType e)
{
	QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
	if(!s) /* 存储分配失败 */
		exit(OVERFLOW);
	s->data=e;
	s->next=NULL;
	Q->rear->next=s;	/* 把拥有元素e的新结点s赋值给原队尾结点的后继,见图中① */
	Q->rear=s;		/* 把当前的s设置为队尾结点,rear指向s,见图中② */
	return OK;
}

/* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
Status DeQueue(LinkQueue *Q,QElemType *e)
{
	QueuePtr p;
	if(Q->front==Q->rear)
		return ERROR;
	p=Q->front->next;		/* 将欲删除的队头结点暂存给p,见图中① */
	*e=p->data;				/* 将欲删除的队头结点的值赋值给e */
	Q->front->next=p->next;/* 将原队头结点的后继p->next赋值给头结点后继,见图中② */
	if(Q->rear==p)		/* 若队头就是队尾,则删除后将rear指向头结点,见图中③ */
		Q->rear=Q->front;
	free(p);
	return OK;
}

/* 从队头到队尾依次对队列Q中每个元素输出 */
Status QueueTraverse(LinkQueue Q)
{
	QueuePtr p;
	p=Q.front->next;
	while(p)
	{
		 visit(p->data);
		 p=p->next;
	}
	printf("\n");
	return OK;
}

int main()
{
	int i;
	QElemType d;
	LinkQueue q;
	i=InitQueue(&q);
	if(i)
		printf("成功地构造了一个空队列!\n");
	printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
	printf("队列的长度为%d\n",QueueLength(q));
	EnQueue(&q,-5);
	EnQueue(&q,5);
	EnQueue(&q,10);
	printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));
	printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
	printf("队列的元素依次为:");
	QueueTraverse(q);
	i=GetHead(q,&d);
	if(i==OK)
	 printf("队头元素是:%d\n",d);
	DeQueue(&q,&d);
	printf("删除了队头元素%d\n",d);
	i=GetHead(q,&d);
	if(i==OK)
		printf("新的队头元素是:%d\n",d);
	ClearQueue(&q);
	printf("清空队列后,q.front=%u q.rear=%u q.front->next=%u\n",q.front,q.rear,q.front->next);
	DestroyQueue(&q);
	printf("销毁队列后,q.front=%u q.rear=%u\n",q.front, q.rear);

	return 0;
}

栈与队列详解 目录申明1. 栈的定义1.1 栈的定义1.2 进栈出栈变化形式2. 线性表的抽象数据类型3. 线性表的顺序存储结构3. 1 顺序存储定义3. 2 顺序存储方式3. 3 数据长度与线性表长度区别3. 4 地址计算方法4. 顺序存储结构的插入与删除4.1 获得元素操作4.2 插入操作4.3 删除操作4.4 线性表顺序存储结构的优缺点5. 线性表的链式存储结构5.1 顺序存储结构不足的解决方法5.2 线性表链式存储结构定义5.3 头指针与头节点的异同5.4 线性表链式存储结构代码描述6. 单链表的读取7. 单链表 阅读详情

相关推荐

数据结构与算法学习笔记 之 程杰《大话数据结构》数据结构篇

数据结构与算法学习笔记 之 程杰《大话数据结构》 第一章 数据结构绪论 数据项:数据不可分割的最小单位。在数据结构课程中,把数据项定义为最小单位,有助于我们更好地解决问题。但是真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。 数据对象:是性质相同的数据元素的集合,是数据的子集。其中,性质相同是指数据元素具有相同数量和类型的数据项。 结构:各个组成部分相互搭配和排列的方式。 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作

MuscleMonk的博客 1476

【数据结构】队列的基本操作

编写程序,实现链式、循环队列的基本操作。

Jesonary的博客 2857

数据结构学习笔记

数据结构笔记主要是总结和学习大话数据结构中的知识点。 参考:大话数据结构(程杰)

simple笔记 828

C/C++实现队列的链式结构(链队)

定义:用链表表示的队列简称为链队列。为了操作方便,这里采用带头结点的链表结构,并设置一个队头front和一个队尾指针rear,如图①图②所示。对头指针始终指向头结点,队尾指针指向最后一个元素。空的链队列的队头指针和队尾指针均指向头结点。 队列的基操作: ①InitQueue(Q) ②IsEmpty(Q) ③IsFull(Q) ④EnterQueue(Q) ⑤DeleteQueue(Q) ⑥GetHead(Q) ⑦ClearQueue(Q) ...

m0_54202580的博客 2441

《大话数据结构》读书笔记

书名:《大话数据结构》 作者:清华大学出版社 程杰 刚毕业那会看的,那时候看数据结构就是背,为了面试嘛。现在回过头再来看,结合平时用的api,发现能理解平时写的很多代码的底层实现逻辑了,做了一下笔记。 ......

tingyuanyuan的博客 765

LinkQueue.txt

文档中实现了队列了链式表示,并实现了队列了一些主要操作函数.可以作为学习数据结构中队列那一部分时的参考.

C++链式队列实现

链式队列具有内存动态分配,内存利用率高的特点,在一些无法预先估计所需队列大小的场合使用链式队列是一个十分好的选择。下面是我最近学习链式队列的代码。注意这里的头结点不存储数据。 首先,要实现链式队列,首先要构造相应的数据结构,这里考虑使用两个指针分别指向队列的队头和队尾,队列使用单链表实现。代码如下:#include #include #include

Alexon Xu的博客 1008

Ubuntu20.04安装NVIDIA显卡驱动避坑指南:从.run文件到完美运行

本文详细介绍了在Ubuntu20.04系统上通过.run文件安装NVIDIA显卡驱动的完整流程和避坑技巧。从禁用Nouveau驱动、选择合适显示管理器到处理常见安装问题,提供了一套经过验证的解决方案,帮助用户顺利完成驱动安装并优化性能。

weixin_30776273的博客 602

链式队列(Linked Queue)

本文写的是一个基础链式队列的写法代码,仅供参考(学习)。

m0_60265426的博客 657

Photoscan+Smart3D+CC组合建模实战:如何用三款工具打造高精度实景模型

本文详细介绍了如何整合Photoscan、Smart3D和ContextCapture三款软件,构建高效高精度的实景三维建模工作流。通过利用Photoscan稳健的空三解算、Smart3D精准的刺点优化,以及ContextCapture强大的最终建模能力,该方案能有效应对复杂地形与海量数据,显著提升模型质量与生产效率,适用于测绘、文化遗产数字化等专业领域。

weixin_29230649的博客 103

顶刊级科研绘图技巧

顶刊级科研绘图技巧

2401_89571885的博客 1156

数据结构之队列

一、顺序队列 待补充、、、、、、、 二、链队列 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; typedef int ElemType; typedef enum{ OVERFLOW=-1, ERROR=0, OK=1 }...

HPU_LY的博客 204

【CSP-J/S初赛知识点整理】

CSP-J/S初赛知识点整理

qq_43884946的博客 1万+

《大话数据结构》-程杰 读书笔记

认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。可见,数据结构在程序设计当中占据了重要的地位。程序设计=数据结构+算法 要你相信自己一定可以学得会、学得好,既然无数人已经掌握了,你凭什么不行。 于每个链表来说,它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成。 事实上,使用这样的数据

xuzhouhhy的博客 1924

Lumerical-定向耦合器1

概述:本文章使用FDE求解器对定向耦合器进行了数值仿真,讨论了耦合器的间距相关性,耦合长度相关性,波长相关性。讨论了脊形波导和条形波导两种情况。

m0_61776728的博客 4611

VS code 调试显示preLaunchTask“g++“已终止,退出代码为-1。 生成‘... .exe‘文件错误

总结: 以后每个工程都需要按照这样的流程:创建一个.c/.cpp文件 -> F5运行 -> 配置tasks.json文件-> launch.json文件 -> 运行

qq_45151652的博客 2513

《数据结构与算法》(七)- 队列详解

目录前言1. 队列的定义2. 队列的抽象数据类型3. 循环队列3.1 队列顺序存储的不足3.2 循环队列定义4. 队列的链式存储结构及实现4.1 队列的链式存储结构——入队操作4.2 队列的链式存储结构——出队操作5. 总结 前言 部分内容摘自程杰的《大话数据结构》 1. 队列的定义   相信大家在用电脑时都经历过,机器有时会处于疑似死机的状态,鼠标点什么似乎都没用,双击任何快捷方式都不动弹。就当你失去耐心,打算 reset 时。突然它像酒醒了一样, 把你刚才点击的所有操作全部都按顺序执行了一遍。这其实是

程序园@大Null 689

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

4、栈和队列

参考:《大话数据结构》程杰栈:限定仅在表尾进行插入和删除操作的线性表 队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表4.1、栈4.1.1、定义栈(stack):限定仅在表尾进行插入和删除的操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(buttom),不包含任何数据元素的栈称为空栈。栈是后进先出(Last in First out:LIFO)的线性表。 备注:

温暖的博客 581

AI幻觉缓解的成本效益分析:投入产出比优化

在当今AI技术飞速发展的时代,AI幻觉成为了一个不容忽视的问题。AI幻觉就像是AI在“做梦”,会给出一些不符合实际或者错误的答案。我们这篇文章的目的就是要分析缓解AI幻觉所需要投入的成本和能够获得的效益,看看怎么能让投入和产出的比例达到最优。范围涵盖了常见的AI应用场景,比如智能客服、自动驾驶等领域。接下来,我们会先介绍一些和AI幻觉、成本效益分析相关的术语。然后用一个有趣的故事引出核心概念,解释什么是AI幻觉、成本效益分析等,以及它们之间的关系。

AI 原生应用开发的博客 935

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

用开源项目死磕数据结构与算法!

程序员的双手是魔术师的双手,他们把枯燥无味的代码变成了丰富多彩的软件。——《疯狂的程序员》 前言 数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。 今天给大家推荐一个开源的项目,对大家学习或者复习数据结构与算法很有帮助. 项目名称 DataStructureForJava 项目介绍 该项目用Java语言实现了常见的数据结构 包括但不限于 常用.

weixin_44028058的博客 345

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【数据结构】 栈与队列之链栈(Stack)与栈的作用「详解」

本文介绍了栈的链式存储结构(链栈)及其基本操作。链栈通过结点指针实现动态存储,适合元素数量变化大的场景。文章详细说明了链栈的数据结构定义,并给出了初始化、清空、判空、获取长度、获取栈顶、入栈和出栈等核心操作的代码实现。相比顺序栈,链栈能更灵活地处理存储需求。最后指出栈结构在高级语言中已被封装,简化了使用。文章预告下一期将探讨栈的实际应用。

2503_94545876的博客 587

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构(1)前言

介绍了数据结构的术语与概念,逻辑结构和存储结构

在嵌入式嵌入式领域奋斗的程序猿的博客 737

c# treeview查找并选中节点_每天5分钟用C#学习数据结构(15)二叉树 Part 1

【基础知识】|作者/ Edison Zhou这是恰童鞋骚年的第208篇原创文章上一篇介绍完了队列,本篇正式进入树与二叉树的世界。1树是个什么鬼?树的定义树(Tree)是 n(n≥0)个结点的有限集。n=0时,该树被称为“空树”。如上图所示,A点称为根节点,它有两棵子树,分别以B、C为根,而以C为根的子树又可以分成两棵子树。树的基本术语(1)不同的节点:根节点、内部节点、叶子节点以及节...

weixin_39900676的博客 340

数据结构笔记01 一些基本概念

在大二的时候,学校开设了这门课程,那时候觉得这门课程很厉害,但是在当时,并没有好好学习,只是觉得很有趣,那时候的学习,对自己的要求也仅仅只是为了期末考试能够过关,但这个课程名字我是记在心里了,想着总要找个时间来学习他,恰好,这次寒假有了点时间,加之自己准备考研,所以就着手开始了。 说在前面的话 关于内容:只更到树的创建;后面的内容真的是难度有点大,学习时间有限,以后有机会再继续更! 学

谢少军的博客 375

《大话数据结构》学习_第一章

    新买了程杰大神的《大话数据结构》,这个月开始学习,因为工作和状态原因 ,导致学习时间不固定,不过学习贵在持之以恒所以加油吧! 2018-5-29看完了 第一章导论部分简单总结一下。   一、基本概念和术语   数据-->  数据元素-->   数据项   人类    人      足、手   数据对象--------------- 性质相同的数据集合   数据结...

weixin_30619101的博客 77
上一篇: [数据结构]程杰《大话数据结构》循环链表代码
下一篇: [数据结构]程杰字符串的基本操作代码
ilikeprograming
博客等级 码龄14年 46粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值