思想和上篇文章差不多,只是换了层包装。

直接上代码:

// linklist.h

#include <iostream>
#include <cstdio>
using namespace std;

template <typename T>
struct Node
{
	T t;
	Node<T> *next;
};

template <typename T>
class LinkList
{
public:
	LinkList();
	~LinkList();

public:
	int clear();
	int insert(T &t, int pos);
	int get(int pos, T &t);
	int del(int pos, T &t);
	int getLen();

protected:
	Node<T> *header;
	int length;
};

template <typename T>
LinkList<T>::LinkList()
{
	header = new Node < T > ;
	header->next = NULL;
	length = 0;
}

template <typename T>
LinkList<T>::~LinkList()
{
	Node<T> *tmp = NULL;

	while (header) {
		tmp = header->next;
		delete header;
		header = tmp;
	}
}

template <typename T>
int LinkList<T>::clear()
{
	~LinkList();
	LinkList();
	return 0;
}

template <typename T>
int LinkList<T>::insert(T &t, int pos)
{
	Node<T> *cur = NULL;

	// 对pos的容错处理
	if (pos >= length) {
		pos = length;
	}

	cur = header;
	for (int i = 0; i < pos; ++i) {
		cur = cur->next;
	}

	// 把上层应用的t结点缓存到容器中
	Node<T> *node = new Node < T > ;
	node->next = NULL;
	node->t = t; // 把t缓存到容器中

	node->next = cur->next;
	cur->next = node;

	++length;

	return 0;
}

template <typename T>
int LinkList<T>::get(int pos, T &t)
{
	Node<T> *cur = NULL;

	if (pos >= length) {
		return -1;
	}

	cur = header;
	for (int i = 0; i < pos; ++i) {
		cur = cur->next;
	}

	t = cur->next->t; // 把pos位置的结点赋值给t

	return 0;
}

template <typename T>
int LinkList<T>::del(int pos, T &t)
{
	Node<T> *cur = NULL;

	if (pos >= length) {
		return -1;
	}

	cur = header;
	for (int i = 0; i < pos; ++i) {
		cur = cur->next;
	}
	Node<T> *ret = NULL;
	ret = cur->next;
	t = ret->t; // 把缓存的结点给上层应用t

	// 删除操作
	cur->next = ret->next;
	--length;
	delete ret; // 注意释放内存,因为insert的时候new Node<T>

	return 0;
}

template <typename T>
int LinkList<T>::getLen()
{
	return length;
}
#include <iostream>
#include <cstdio>
#include "linklist.h"

using namespace std;

struct Student
{
	char name[32];
	int age;
};

void play()
{
	Student s1, s2, s3;
	s1.age = 21;
	s2.age = 22;
	s3.age = 23;

	LinkList<Student> list; // 创建链表

	// 插入元素
	list.insert(s1, 0);
	list.insert(s2, 0);
	list.insert(s3, 0);

	// 遍历元素
	Student tmp;
	for (int i = 0; i < list.getLen(); ++i) {
		list.get(i, tmp);
		cout << "age: " << tmp.age << endl;
	}

	// 删除元素
	while (list.getLen()) {
		list.del(0, tmp);
		cout << "age: " << tmp.age << endl;
	}

}

int main()
{
	play();

	return 0;
}

C++链表模板类的更多相关文章

  1. C++ 单链表模板类实现

    单链表的C语言描述 基本运算的算法——置空表.求表的长度.取结点.定位运算.插入运算.删除运算.建立不带头结点的单链表(头插入法建表).建立带头结点的单链表(尾插入法建表),输出带头结点的单链表 #i ...

  2. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  3. 数据结构-链表逆置(c++模板类实现)

    链表结点类模板定义: template <class T> class SingleList; template <class T> class Node { private: ...

  4. C++中的链表节点用模板类和用普通类来实现的区别

    C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typen ...

  5. STL标准模板类

    STL,中文名标准模板库,是一套C++的标准模板类(是类!),包含一些模板类和函数,提供常用的算法和数据结构. STL分为:迭代器,容器,适配器,算法以及函数对象. --迭代器是一种检查容器内元素并遍 ...

  6. C++:栈(stack)的模板类实现

    1.基本概念 栈中的元素遵守“先进后出”的原则(LIFO,Last In First Out) 只能在栈顶进行插入和删除操作 压栈(或推入.进栈)即push,将数据放入栈顶并将栈顶指针加一 出栈(或弹 ...

  7. 《深入实践C++模板编程》之二——模板类

    1.类的模板的使用 类,由于没有参数,所以没有模板实参推导机制. #include <stdexcept> template<typename T> class my_stac ...

  8. 模板类 error LNK2019: 无法解析的外部符号

    如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...

  9. 关于g++编译模板类的问题

    今天搞了我接近4个小时,代码没错,就是调试没有通过,无论怎么也没有想到是编译器的问题 g++不支持c++模板类 声明与实现分离,都要写到.h文件里面. 以后记住了.

随机推荐

  1. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

  2. 根据ccid取得账户,更改某段值再创建账户,返回新的ccid

    CREATE OR REPLACE PACKAGE cux_cuxaprebate_utl IS * =============================================== * ...

  3. java的断言(assert)

    概述 在C和C++语言中都有assert关键,表示断言.在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.在Java中,assert关键字是从JAVA SE 1.4 引入的,为了 ...

  4. Linux网络和进程管理

     1) 计算机网络是通过外围的设备和连接,将分布在相同或不同区域的多台计算机 连接在一起所形成的集合.网络中的计算机实现彼此间互相通信,并且可以共 同使用硬件.软件和数据资源,实现资源共享.Lin ...

  5. iOS开发之使用block块进行数据遍历的方法

    看了一篇文章,发现遍历数组.字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法. 首先是最基本的运用形式, ...

  6. 深入理解CoordinatorLayout.Behavior

    要研究的几个问题 一.Behavior是什么?为什么要用Behavior? 二.怎么使用Behavior? 三.从源码角度看为什么要这么使用Behavior? 一.Behavior是什么?为什么要用B ...

  7. 使用 symbolicatecrash 解析崩溃堆栈

    一.先引用一位牛人的博贴: xcode解crashlog工具symbolicatecrash的使用 在xocde编译app的时候会同时生成一个以dsym(该app对应的符号表)作为后缀的文件,每个ap ...

  8. python在windows下使用setuptools安装egg文件

    最近和同学做个东西,需要安装python的第三方函数库,看了网上的介绍,很是麻烦,这是我实践总结出来的,希望对大家有用. 以安装第三方库networkx 为例,其余函数库都是一个套路,看完就会滴. 1 ...

  9. ROS_Kinetic_23 ROS流行版本和相关书籍汇总

    目前,ROS使用的主流版本主要是下面四种:Hydro,Indigo,Jade,Kinetic. Distro Release date Poster Tuturtle, turtle in tutor ...

  10. sql的索引:网上看到不错,整理成自己的东西

    数据库建立索引可以提高查询速度.假如我们创建了一个 mytable表: CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NU ...