C++链表模板类
思想和上篇文章差不多,只是换了层包装。
直接上代码:
// 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++链表模板类的更多相关文章
- C++ 单链表模板类实现
单链表的C语言描述 基本运算的算法——置空表.求表的长度.取结点.定位运算.插入运算.删除运算.建立不带头结点的单链表(头插入法建表).建立带头结点的单链表(尾插入法建表),输出带头结点的单链表 #i ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- 数据结构-链表逆置(c++模板类实现)
链表结点类模板定义: template <class T> class SingleList; template <class T> class Node { private: ...
- C++中的链表节点用模板类和用普通类来实现的区别
C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typen ...
- STL标准模板类
STL,中文名标准模板库,是一套C++的标准模板类(是类!),包含一些模板类和函数,提供常用的算法和数据结构. STL分为:迭代器,容器,适配器,算法以及函数对象. --迭代器是一种检查容器内元素并遍 ...
- C++:栈(stack)的模板类实现
1.基本概念 栈中的元素遵守“先进后出”的原则(LIFO,Last In First Out) 只能在栈顶进行插入和删除操作 压栈(或推入.进栈)即push,将数据放入栈顶并将栈顶指针加一 出栈(或弹 ...
- 《深入实践C++模板编程》之二——模板类
1.类的模板的使用 类,由于没有参数,所以没有模板实参推导机制. #include <stdexcept> template<typename T> class my_stac ...
- 模板类 error LNK2019: 无法解析的外部符号
如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...
- 关于g++编译模板类的问题
今天搞了我接近4个小时,代码没错,就是调试没有通过,无论怎么也没有想到是编译器的问题 g++不支持c++模板类 声明与实现分离,都要写到.h文件里面. 以后记住了.
随机推荐
- Nginx - 代理、缓存
Nginx 标签 : nginx 代理 代理服务可简单的分为正向代理和反向代理: 正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送 ...
- Spark发展现状与战线
前言 现今Spark正是风头正劲时,Spark本是UCBerkeley的AMPLab诞生的项目,后来捐赠给了Apache来管理源码和后续发展.今年从Apache孵化器终于孵化出了1.0版本.其对大数据 ...
- 如何在苹果手机上安装自制的AD证书
写这篇博文的契机是有人已经实现了CRM在用自制证书部署IFD后,在手机安装上自制证书后即可登录官方移动端APP,因为之前很多人都尝试过只要是自制证书部署的IFD就无法使用官网手机APP,而本人实验下来 ...
- iOS9中如何在日历App中创建一个任意时间之前开始的提醒(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 四.创建任意时间之前开始的提醒 现在我们找到了指定源中的指定日 ...
- antlr v4 使用指南连载2——准备环境
antlr v4 开发环境 从上一篇文章的例子中可以知道,antlr有一套自己的语法来声明目标语言的语法,因此它本身就需要编译或者使用antlr提供的api来读取这些语法规则,并使之可 ...
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...
- 如何找到java对应的c/c++源码
很多时候java经常被c鄙视,因为c说我是你的基础,但java竟然有如此强的生命力就必然有其存在的价值.本文不探讨各种开发语言的优劣,仅仅介绍如何找到java对应c/c++实现的源码.当我们追究一个j ...
- 【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法
. 一. 类定义 类定义需要实现两部分 : -- 接口部分 : 定义类的成员变量和方法, 方法是抽象的, 在头文件中定义; -- 实现部分 : 引入接口部分的头文件, 实现抽象方法; 1. 接口部分定 ...
- 给你的流添加缓冲装置——字节块ByteChunk
这是一个很重要的一个字节数组处理缓冲工具,它封装了字节缓冲器及对字节缓冲区的操作,包括对缓冲区的写入.读取.扩展缓冲区大小等等,另外还提供相应字符编码的转码操作.此工具让缓冲操作变得更加方便,除了缓冲 ...
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子
本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...