C++代码——模版类链表(实现链表的插入和删除)

#include <iostream>
using namespace std;
// 定义一个单向链表类
// typedef int ElemType;//类型重命名
// using ElemType = int; // 类型重命名
template <typename T>
class LinkedList;
template <typename ElemType> // 这里就是元素类型相当于一个参数
class Node                   // 节点类
{
    template <typename T>
    friend class LinkedList; // 声明友元类的时候也用加上模版的声明

private:
    ElemType data;
    Node *next;

public:
    Node(ElemType data) : data{data}, next{nullptr} {}
    template <typename T1>
    friend ostream &operator<<(ostream &out, LinkedList<T1> &d);
};

template <typename T>
class LinkedList // 带头结点的单向链表类
{
private:
    int num;
    Node<T> *first;
    Node<T> *last;

public:
    // 构造函数
    LinkedList() : num{0}, first{nullptr}, last{nullptr} {}
    // 尾插法
    void InsertTail(T d);
    // 尾删除
    T DeleteTail();
    // 头插法
    void InsertFront(T d);
    // 头删法
    T DeleteFront();
    // 获取元素个数
    int GetNum() const;
    // 链表是否为空
    bool IsEmpty();
    // 析构函数
    ~LinkedList();

    void Clear();
    template <typename T1>
    friend ostream &operator<<(ostream &out, LinkedList<T1> &d);
};

// 尾插法
template <typename T>
void LinkedList<T>::InsertTail(T d)
{
    // 创建节点并初始化
    Node<T> *pnew = new Node<T>{d};

    // 增加节点
    if (IsEmpty())
    {
        first = last = pnew;
    }
    else
    {
        last->next = pnew;
        last = pnew;
    }

    num++;
}
// 尾删除
template <typename T>
T LinkedList<T>::DeleteTail()
{
    // 空链表
    if (IsEmpty())
    {
        throw runtime_error{"DeleteTail:LinkedList IsEmpty"};
    }
    T d; // 删除的节点的数据域
    if (first == last)
    {
        d = first->data;
        free(first);
        first = last = nullptr;
    }
    else
    {
        d = last->data;
        Node <T>*p = first; // 遍历指针
        while (p->next != last)
        {
            p = p->next;
        } // 此时 p指向倒数第二个
        p->next = nullptr;
        free(last);
        last = p; // 更新尾节点
    }

    num--;

    return d;
}
// 头插法
template <typename T>
void LinkedList<T>::InsertFront(T d)
{
    // 创建节点并初始化
    Node<T> *pnew = new Node<T>{d};

    // 增加节点
    if (IsEmpty())
    {
        first = last = pnew;
    }
    else
    {
        pnew->next = first;
        first = pnew;
    }

    num++;
}
// 头删法
template <typename T>
T LinkedList<T>::DeleteFront()
{
    // 空链表
    if (IsEmpty())
    {
        throw runtime_error{"DeleteTail:LinkedList IsEmpty"};
    }
    T d = first->data;
    Node<T> *p = first; // p在要删除的节点
    first = p->next;
    if (first)
        p->next = nullptr;
    else
        last = nullptr;
    free(p);
    p = nullptr;

    num--;

    return d;
}
// 获取元素个数
template <typename T>
int LinkedList<T>::GetNum() const
{
    return num;
}
// 链表是否为空
template <typename T>
bool LinkedList<T>::IsEmpty()
{
    if (num == 0 && first == nullptr && last == nullptr)
        return true;
    else
        return false;
}
// 析构函数
template <typename T>
LinkedList<T>::~LinkedList()
{
    while (!IsEmpty())
    {
        DeleteTail();
    }
    first = last = nullptr;
    num = 0;
}

// 清空链表
template <typename T>
void LinkedList<T>::Clear()
{
    while (!IsEmpty())
    {
        DeleteTail();
    }
    first = last = nullptr;
    num = 0;
}
template <typename T1>
ostream &operator<<(ostream &out, LinkedList<T1> &d)
{
    cout << "=================" << endl;
    if (!d.IsEmpty())
        cout << "num = " << d.num << "first = " << d.first->data << "last = " << d.last->data << endl;
    else
        cout << "num = " << d.num << endl;

    Node<T1> *p = d.first;
    while (p)
    {
        cout << p->data << ",";
        p = p->next;
    }

    // out << endl;

    return out;
}

int main()
{
    // 实例化对象
    LinkedList<int> l;
    cout << l.IsEmpty() << endl;
    cout << l << endl;

    for (int i = 0; i < 3; i++)
    {
        l.InsertTail(i);
    } // 0 1 2
    cout << l << endl;

    for (int i = 4; i < 8; i++)
    {
        l.InsertFront(i);
    } // 7 6 5 4 0 1 2
    cout << l << endl;

    while (!l.IsEmpty())
    {
        cout << l.DeleteTail() << endl;
    }

    cout << l << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值