#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. ubuntu环境下android开发环境安装

    http://blog.csdn.net/shulianghan/article/details/38023959 Android程序开发的环境配置 Ubuntu下自带openjdk的卸载 你无需管它 ...

  2. INSTALL_FAILED_MISSING_SHARED_LIBRARY

    target选项中要选择Google APIs.如图.

  3. -Prefix.pch has been modified 的错误修复

    方法一: 选择 Product > Clean 然后重新编译--运行: 方法二: 找到-Prefix.pch文件,把中间的 #ifdef __OBJC__ #import <UIKit/U ...

  4. html字符转义

    常用表: No. 文字表記 10進表記 16進表記 文字   Comment 001 " " " """   quotation mark ...

  5. Web 应用性能提升的 10 个建议

    建议一.利用反向代理服务器加速和保护应用 如果 Web 应用运行在一台独立的电脑上,性能问题的解决方案是显而易见的:换一台更快的电脑,里面加上更多的处理器.内存.快速磁盘阵列等等.然后在这台新电脑上运 ...

  6. jquery 清除style样式

    $("#show").removeAttr("style"); //ie,ff均支持 $("#show").attr("style ...

  7. Loadrunner脚本编程(4)-数据类型操作和字符串操作

    http://www.360doc.com/content/10/0806/13/1698198_44078277.shtml 一,数据类型转换 没有使用过C编程的LoadRunner脚本编写者会发现 ...

  8. 用C/C++开发android应用

    在某些情况下,比如原来与很多c/c++的代码, 可能希望采用c/c++编写android应用程序.在这种情况下,一般使用NDK.但是由于android直提供了java接口,因此不能够直接调用andro ...

  9. PHP原生实现,校验微信公众号||小程序服务器地址

    1.原生的.php文件:  test.php <?php header('Content-type:text'); define("TOKEN", "weixin& ...

  10. jquery checkbox选框操作

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...