C++ 使用模板和运算符重载 实现双向链表
编程思路
类模板绝大部分的使用场景都是封装数据结构
所有的声明和实现全写在头文件中。
增删改查
- 定义模板链表类List
- 私有内部结构体Node{T data, Node pNext, Node pFront}
- 私有成员指针pHead pTail size
- 公有函数add(T data)向尾部添加元素
- 公有函数getSize()返回链表的长度
- 公有函数重载operator[] 返回 指定位置的数据,并可以通过[]修改对应位置的数据
最终效果
代码实现
Tlist.h
#ifndef TLIST
#define TLIST
template<typename T>
class TList
{
private:
struct Node//链表的结构体类型,要私有,隐藏数据结构的类型
{
T data;
Node* front;
Node* next;
Node():front(0),next(0){}//创建空节点使用的构造
Node(T data):data(data),front(0), next(0)//创建有数据节点使用的构造
{}
};
public:
TList():
pHead(0),pTail(0),size(0)
{
//创建空头
pHead = new Node;
pTail = pHead;
}
~TList()//析构函数清空链表
{
Node* p = pHead;
while(p != 0)
{
Node* t = p;
p = p->next;
delete t;
}
}
TList& add(T data)
{
Node* p = new Node(data);//创建一个新节点
pTail->next = p;//把新节点连接到链表中
p->front = pTail;
pTail = p;//尾指针指向新的为节点
size++;
return *this;
}
T& operator[](int index)//index参数是数据的角标,不是第几个数据的意思
{
Node* p = pHead->next;//定义一个指针指向第一个有效的数据节点
for(int i = 0;i < index;i++)
{
p = p->next;
}
//循环结束时p指向角标为index的节点
return p->data;
}
int getSize()
{
return size;
}
private:
Node* pHead;
Node* pTail;
int size;
};
#endif // TLIST
main.cpp
#include <iostream>
#include <string>
#include "tlist.h"
using namespace std;
int main()
{
TList<int> list1;
list1.add(9).add(10).add(0).add(8).add(7);//add函数返回的list1对象本身
list1[0] = 100;//因为operator[]返回值是T的引用,所以可以直接对返回值赋值
for(int i = 0;i < list1.getSize();i++)
{
cout<<list1[i]<<endl;
}
TList<string> list2;
list2.add("小明").add("小红").add("小兰").add("小紫").add("小绿");
list2[0] = "小黑";
for(int i = 0;i < list2.getSize();i++)
{
cout<<list2[i]<<endl;
}
return 0;
}
4 条评论
阿萨德发
写得好好哟,我要给你生猴子!
学习一下
加油!