#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++实现的更多相关文章

  1. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  2. java与数据结构(8)---java实现链队列

    链队列 实际上就是单链表,只是规定了删除在队头进行,添加在队尾进行. 链队列代码结构 package list.queue; public interface Queuable<T>; p ...

  3. 链队列之C++实现

    链队列时建立在单链表的基础之上的.由于是动态分配节点内存,所以无需判满. 链队列的形式如下: 1.队列空 2.队列存在数据 下面介绍下C++实现的链队列,VC6下调试通过. 1.文件组织 2.lq.h ...

  4. C语言实现链队列的初始化&进队&出队

    /*链表实现队列的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typed ...

  5. c/c++链队列

    链队列 链队列就是简化了的单链表 nodequeue.h #ifndef __NODEQUEUE__ #define __NODEQUEUE__ #include <stdio.h> #i ...

  6. 【Java】 大话数据结构(7) 循环队列和链队列

    本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...

  7. 队列的理解和实现(二) ----- 链队列(java实现)

    什么是链队列 链队是指采用链式存储结构实现的队列,通常链队用单链表俩表示.一个链队显然需要两个分别指示队头和队尾的指针,也称为头指针和尾指针,有了这两个指针才能唯一的确定. package 链队列; ...

  8. C语言——循环队列和链队列的基本运算

    // 循环队列#include <stdio.h> #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20 ...

  9. C语言链队列

    链队列类似于单链表,为了限制只能从两端操作数据,其结构体内有2个指针分别指向头尾,但队列里的节点用另一种结构体来表示,头尾指针则为指向该结构体的类型.只能通过操作头尾指针来操作队列. typedef ...

  10. java实现链队列

    java实现链队列的类代码: package linkqueue; public class LinkQueue { class Element { Object elem; Element next ...

随机推荐

  1. Eclipse中SVN修改的*星号没了,解决方法

    Eclipse中SVN修改的*星号没了,解决方法 打开Preference 第一步:去掉外加的 ">" 第二步:勾选Outgoing changes 这样做之后," ...

  2. 笔记本样式的EditText控件(每行均带下划虚线)

    package com.zongyi.trip.ui; import com.zongyi.trip.R; import android.annotation.SuppressLint; import ...

  3. wepy - 与原生有什么不同($pages,$interceptors)

    wepy内部封装的一些基类,我们要注意以 “$”开头命名,最好不用 关于wepy基类文档,请查看 关于$apply,其实就是主动刷新DOM,来更新数据. 何时使用它? 答. 你为data里面的数据进行 ...

  4. jquery.dataTables动态列

    jquery.dataTables  版本1.10.7 直接上代码: 0.table <table id="popReportTable"> <thead> ...

  5. line-height测量及使用

    1.line-height定义 line-height表示行高,即两行文字基线间的距离. 以下是图示说明: 行高是2条红线之间的距离,即:1+2+3+4 在实际测量中,基线不好找,可测量顶线到顶线的距 ...

  6. 监测CentOS下TCP断线

    TCP正常的断开,通信双方(服务端和客户端)都是能知道的.但是非正常的断开,比如直接拔掉了网线,就只能靠如下两种方法,实现短时间内的检测. 一.心跳包机制 心跳包机制,是网游设计中的常用机制.从用户层 ...

  7. ZOJ2750_Idiomatic Phrases Game(最短路)

    Idiomatic Phrases Game Time Limit: 2 Seconds      Memory Limit: 65536 KB Tom is playing a game calle ...

  8. JDBC 实例--JDBC通过工具类DBUtil连接到数据库,让我们不再恐惧操作数据库

    利用JDBC连接到数据库一般需要几个步骤: 1.装载驱动程序. 2.建立连接. 3.发送和执行SQL语句. 4.释放资源 首先建立一个数据库: 脚本如下: create database csdn; ...

  9. permission denied make_sock could not bind to address 81问题解决

    在apache中绑定非http标准端口时,一直出现如下的错误提示: [root@localhost ~]# /etc/init.d/httpd start Starting httpd: (13)Pe ...

  10. oracle10-11数据库下载

    Oracle数据库官方下载,需要注册oracle账号,方可下载! 11G 7个压缩包含义: p102025301120——Linux-x86-64_1of7.zip             datab ...