链队列的C++实现
#include<iostream>
using namespace std;
//节点类
template<class T>
struct QNode
{
T data;
QNode *next;
};
//队列类
template<class T>
struct LinkList
{
QNode<T> * front;
QNode<T> * rear;
size_t size;
}; //构造一个空队列
template<class T>
void InitQueue(LinkList<T> & que)
{
que.front = (QNode<T> *)malloc(sizeof(QNode<T>));
if(!que.front) exit(0);
que.size = 0;
que.rear = que.front;
que.rear->next = 0;
}
//销毁队列
template<class T>
void DestroyQueue(LinkList<T>& que)
{
QNode<T> * p = que.front->next;
free(que.front);
while(p != 0)
{
que.front = p->next;
free(p);
p = que.front;
}
}
//清空队列
template<class T>
void ClearQueue(LinkList<T>& que)
{
QNode<T> * p = que.front->next;
while(p != 0)
{
que.rear = p->next;
free(p);
p = que.rear;
}
que.rear = que.front;
que.front->next = 0;
que.size = 0;
}
//返回队列的长度
template<class T>
int QueueLength(LinkList<T>& que)
{
return que.size;
}
//返回队列的队首元素
template<class T>
T GetHead(LinkList<T>& que)
{
return que.front->next->data;
}
//元素入队
template<class T>
void EnQueue(LinkList<T>& que,T t)
{
QNode<T> *p = (QNode<T>*)malloc(sizeof(QNode<T>));
if(!p) exit(0);
p->data = t;
p->next = 0;
que.rear->next = p;
que.rear = p;
que.size++;
}
//元素出队
template<class T>
bool DeQueue(LinkList<T>& que,T & t)
{
if(que.size==0)
return false;
QNode<T> *p = que.front->next;
que.front->next = p->next;
que.size--;
t = p->data;
free(p);
return true;
}
//从对头到队尾元素遍历调用visit函数
template<class T>
void VisitQueue(LinkList<T>& que,void (*visit)(T &t))
{
QNode<T> *p = que.front->next;
while(p != 0)
{
(*visit)(p->data);
p = p->next;
}
}
//測试函数
template<class T>
void Print(T &t)
{
cout<<t<<endl;
}
template<class T>
void AddOne(T &t)
{
t++;
} int main()
{
//创建一个空的队列
LinkList<int> queue;
//初始化队列
InitQueue(queue);
//元素入队
EnQueue(queue,1);
EnQueue(queue,2);
EnQueue(queue,3);
EnQueue(queue,4);
//返回队列的长度
cout<<"队列的长度: "<<QueueLength(queue)<<endl;
//输出全部元素
VisitQueue(queue,Print<int>); //返回队列的队首元素
cout<<"队列的队首元素: "<<GetHead(queue)<<endl;
//元素出队
int a ;
if(DeQueue(queue,a))
{
cout<<"出队元素: "<<a<<endl;
}
//返回队列的长度
cout<<"队列的长度: "<<QueueLength(queue)<<endl;
//输出全部元素
VisitQueue(queue,Print<int>);
//元素出队
if(DeQueue(queue,a))
{
cout<<"出队元素: "<<a<<endl;
}
//返回队列的长度
cout<<"队列的长度: "<<QueueLength(queue)<<endl;
//输出全部元素
VisitQueue(queue,Print<int>); //将全部元素加一
cout<<"将全部元素加一"<<endl;
VisitQueue(queue,AddOne<int>);
//输出全部元素
VisitQueue(queue,Print<int>); //清空队列
ClearQueue(queue);
//销毁队列
DestroyQueue(queue);
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXljMTAyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
链队列的C++实现的更多相关文章
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- java与数据结构(8)---java实现链队列
链队列 实际上就是单链表,只是规定了删除在队头进行,添加在队尾进行. 链队列代码结构 package list.queue; public interface Queuable<T>; p ...
- 链队列之C++实现
链队列时建立在单链表的基础之上的.由于是动态分配节点内存,所以无需判满. 链队列的形式如下: 1.队列空 2.队列存在数据 下面介绍下C++实现的链队列,VC6下调试通过. 1.文件组织 2.lq.h ...
- C语言实现链队列的初始化&进队&出队
/*链表实现队列的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typed ...
- c/c++链队列
链队列 链队列就是简化了的单链表 nodequeue.h #ifndef __NODEQUEUE__ #define __NODEQUEUE__ #include <stdio.h> #i ...
- 【Java】 大话数据结构(7) 循环队列和链队列
本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...
- 队列的理解和实现(二) ----- 链队列(java实现)
什么是链队列 链队是指采用链式存储结构实现的队列,通常链队用单链表俩表示.一个链队显然需要两个分别指示队头和队尾的指针,也称为头指针和尾指针,有了这两个指针才能唯一的确定. package 链队列; ...
- C语言——循环队列和链队列的基本运算
// 循环队列#include <stdio.h> #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20 ...
- C语言链队列
链队列类似于单链表,为了限制只能从两端操作数据,其结构体内有2个指针分别指向头尾,但队列里的节点用另一种结构体来表示,头尾指针则为指向该结构体的类型.只能通过操作头尾指针来操作队列. typedef ...
- java实现链队列
java实现链队列的类代码: package linkqueue; public class LinkQueue { class Element { Object elem; Element next ...
随机推荐
- 嵌套循环连接(nested loops join)原理
嵌套循环连接(nested loops join) 访问次数:驱动表返回几条,被驱动表访问多少次. 驱动表是否有顺序:有. 是否要排序:否. 应用场景: 1.关联中有一个表比较小: 2.被关联 ...
- htmlayout做的虎鲸宝宝
昨天在auto论坛上偶遇一哥们作的虎鲸宝宝例子,尽管作者提供了auto的源码… … 一个C++老农的悲哀.不过大概看了下流程,最后想想:选什么样的语言已经不重要了. 最重要的是里边的资源文件可以拿来耍 ...
- wepy - 入手
wepy官方文档: https://tencent.github.io/wepy/document.html#/ ESLint:一般用来校验JavaScript代码是否符合规范,不符合预期就报错(程序 ...
- Java从零开始学二十四(集合工具类Collections)
一.Collections简介 在集合的应用开发中,集合的若干接口和若干个子类是最最常使用的,但是在JDK中提供了一种集合操作的工具类 —— Collections,可以直接通过此类方便的操作集合 二 ...
- AVL树的实现例程
/* AVL树的节点声明 */ #ifndef _AVLTREE_H #define _AVLTREE_H struct AvlNode; typedef struct AvlNode *Positi ...
- 算法笔记_192:历届试题 买不到的数目(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有 ...
- xcode 打包
iOS的要安装Xcode,否则执行下面命令的时候报错 ionic platform add ios ionic build ios ionic emulate ios 方法二: 1.打开终端 -- b ...
- 好记性不如烂笔头77-多线程-Thread子类的线程对象是不同的
Thread子类的线程对象是不同的. 比方: EasySelfThread thread = new EasySelfThread(); //同一个线程对象 Thread t1 = new Threa ...
- ibatis 批量更新(一)
1.4.2.3 批量修改 支持单个动态更新.批量动态更新 <update id="updateCONSULT_SCHEDULEDynamic" parameterClas ...
- spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置
spring mvc 图片上传,跨域解决 按天生成文件夹 ,删除,限制为图片代码,等相关配置 fs.root=data/ #fs.root=/home/dev/fs/ #fs.root=D:/fs/ ...