您的位置:首页 > 其它

HanList<T> 实现 类似stl:list<T>

2016-06-13 22:07 302 查看
HanList.h

#ifndef HANLIST_H_
#define HANLIST_H_
#include<iostream>
using namespace std;
namespace HanTL{
//|模板结构体 实例化时需要 HanNode<类型>的方式进行实例化
template<typename T>
struct HanNode{
T data;
HanNode * Nextptr;
};
template <typename T>
class HanList{
private:
HanNode<T> * m_pFirstNode;
public:
//|构造函数
HanList();
//|添加数据
void addData(T data);
//|遍历所有数据并且输出
void echoAllData();
//|重载[]操作符,并且返回引用 这样方便 外部调用者 用 aArr[int]=xxx进行更改
T & operator[](int i);
//|计数
int count();
//|插入一条数据data到一个位置i,起始位置为0
bool insert(int i, T data);
//|升序排序
void OrderByAsc();
};
/**************************************************************************************
*上面是定义下面是实现(因为需要在编译阶段把模板实例化成类,再编译,链接器是不能实例化模板的)
*2016年6月7日13:30:34
****************************************************************************************/

//|构造
template<typename T>
HanList<T>::HanList(){
this->m_pFirstNode = new HanNode<T>;
this->m_pFirstNode->data = 12;
this->m_pFirstNode->Nextptr = 0;
}
//|添加一条数据
template<typename T>
void HanList<T>::addData(T data)
{
HanNode<T> *tmpNode = new HanNode<T>;
tmpNode->data = data;
tmpNode->Nextptr = 0;
//|查询到最后一个结点
HanNode<T> *tmp = this->m_pFirstNode;
while (tmp->Nextptr != 0)
{
tmp = tmp->Nextptr;
}
//|查询到了最后一个结点后 就赋值上去
tmp->Nextptr = tmpNode;
}
//|遍历输出所有数据
template<typename T>
void HanList<T>::echoAllData(){
HanNode<T> * tmp = this->m_pFirstNode;
//cout << this->m_pFirstNode->Nextptr << endl;
cout << "头结点数据没有输出。" << endl;
while (tmp->Nextptr != 0)
{
tmp = tmp->Nextptr;
cout << "结点地址:" << tmp << "结点数据域:" << tmp->data << endl;
}

}
//|重载[]
template<typename T>
T & HanList<T>::operator[](int i)
{
HanNode<T> * tmp = this->m_pFirstNode;
int count = -1;
while (tmp->Nextptr != 0 && count < i)
{
count = count + 1;
tmp = tmp->Nextptr;
}
//|返回的是引用 外部可以修改!
return tmp->data;
}
//|计数
template <typename T>
int HanList<T>::count()
{
HanNode<T> * tmp = this->m_pFirstNode;
int amount = 0;
while (tmp->Nextptr != 0)
{
amount = amount + 1;
tmp = tmp->Nextptr;
}
return amount;
}
//|插入一个数据到 一个指定位置 起始位置为0
template <typename T>
bool HanList<T>::insert(int i, T data)
{
if (i < 0)
return false;
if (i>this->count())
return false;
//|如果插入的位置在尾部
if (i == this->count())
this->addData(data);
//------一般情况----
HanNode<T> * tmp = this->m_pFirstNode;
int index = -1;//|计数
/**************
*用循环的方式进行查找
*这里需要注意的是 由于是insert 需要查找需要insert的位置的上一个结点的地址
*因为需要连续修改两个地方
*****************/
while (tmp->Nextptr != 0 && index < i - 1)
{
index = index + 1;
tmp = tmp->Nextptr;
}
//|核心替换部分
HanNode<T> * tmp2 = tmp->Nextptr;
HanNode<T> * newNode = new HanNode<T>();
newNode->data = data;
newNode->Nextptr = tmp2;
tmp->Nextptr = newNode;
return true;
}
//|升序排序
template <typename T>
void HanList<T>::OrderByAsc(){

//|直接选择排序算法

for (int i = 0; i < this->count(); i++)
{

for (int j = i; j < this->count(); j++)
{
if ((*this)[j] < (*this)[i])
{
//|查询到了有比这个数字小的数 替换
T tmp = (*this)[i];//|保存到零时变量然后进行替换
(*this)[i] = (*this)[j];
(*this)[j] = tmp;

}
}
}
}
//|名称空间
}
#endifmain.cpp
#include<iostream>
#include"HanList.h"
using namespace std;
using namespace HanTL;
int main(int argc, char * argv[])
{
HanList<int> * p = new HanList<int>();
cout << "HanVector<int>模板类实例化成功!" << endl;

cout << "开始在链表添加数据" << endl;
p->addData(12);
p->addData(13);
p->addData(1300);
p->addData(11545);

cout << "链表遍历输出:" << endl;
p->echoAllData();

cout << "重载[]操作符号 [0] , [1] :" << endl;
cout <<"(*p)[0] :"<< (*p)[0] << endl;
cout << "(*p)[1] :"<<(*p)[1] << endl;

cout << "[]操作符 返回值的修改(引用):" << endl;
cout << "(*p)[0]=520:" <<endl;
(*p)[0] = 520;
cout << (*p)[0] << endl;

cout << "count() 计数函数!(头结点HanNode<T> * m_pFirstNode;没有计算):" << endl;
cout << p->count() << endl;

cout << "p->insert(1,100):" << endl;
p->insert(1, 100);
cout << (*p)[1] << endl;
p->echoAllData();

cout << "p->insert(4,200):" << endl;
p->insert(4, 500);
cout << (*p)[4] << endl;
p->echoAllData();

cout << "OrderByAsc 升序排序:" << endl;
p->OrderByAsc();
p->echoAllData();

cin.get();
return 1;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: