C++ 使用模板和运算符重载 实现双向链表


编程思路

类模板绝大部分的使用场景都是封装数据结构

所有的声明和实现全写在头文件中。

增删改查

  1. 定义模板链表类List
  2. 私有内部结构体Node{T data, Node pNext, Node pFront}
  3. 私有成员指针pHead pTail size
  4. 公有函数add(T data)向尾部添加元素
  5. 公有函数getSize()返回链表的长度
  6. 公有函数重载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;
}
End

本文标题:C++ 使用模板和运算符重载 实现双向链表

本文链接:https://www.chisato.cn/index.php/archives/11/

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2021 年 09 月 24 日 11 : 02 AM
如果觉得我的文章对你有用,请随意赞赏