双向链表的实现

复制代码
#include<iostream>
using namespace std;

//节点

template <typename T>
struct node
{
    T value;
    node *prev;
    node *next;
    node(){};
    node(T t, node *prev, node *next){
        this->value = t;
        this->prev = prev;
        this->next = next;
    }
};

//链表

template<typename T>
class Link
{
public:
    Link();
    ~Link();

    int size();                                //输出总的长度
    bool is_empty();                            //判断是否为空

    T get(int index);                        //指定位置输出
    T get_first();                            //输出第一个元素
    T get_last();                            //输出最后一个元素

    void insert(int index, T t);                //按指定位置插入
    void insert_first(T t);                    //头插法
    void insert_last(T t);                    //尾插法

    T del(int index);                        //指定位置删除
    T delete_first();                        //删除头元素
    T delete_last();                        //删除最后一个元素

private:
    int count;        //元素的个数
    node<T> *head;
private:
    node<T>* get_node(int count);
};

template <typename T>
Link<T>::Link(){
    count = 0;
    //创建表头,没有数据
    head = new node<T>();
    head->prev = head->next = head;
}

//析构函数
template<typename T>
Link<T>::Link()
{
    //删除所有节点
    node<T> *temp;
    node<T> *p = head->next;
    while (p != head)
    {
        temp = p;
        p = p->next;
        delete temp;
    }
    //删除表头
    delete head;
    head = NULL;
}

//输出总的长度
template <typename T>
int Link<T>::size(){
    return count;
}

//返回链表是否为空
template <typename T>
bool Link<T>::is_empty()
{
    return count == 0;
}

//获取第index位置的节点
template <class T>
node<T>* Link<T>::get_node(int index){
    //判断参数有效性
    if (index < 0 || index >= count){
        throw:"index异常!";
        return NULL;
    }
    //正向查找
    if (inde <= count / 2){
        int i = 0;
        node<T>*p = head->next;
        while (i++ < index){
            p = p->next;
        }
        return p;
    }
    else{
        int i = 0, rindex=count-index-1;
        node<T> *p = head->prev;
        while (i++ < rindex){
            p = p->prev;
        }
        return p;
    }
}

//获取第index位置的节点的值
template<typename T>
T Link<T>::get(int index){
    return get_node(index)->value;
}

//获得最后一个节点的值
template<typename T>
T Link<T>::get_last()
{
    return get_node(count - 1)->value;
}

//将节点插入到第index位置之前
template <typename T>
void Link<T>::insert(int index, T t)
{
    if (index == 0) insert_first(t);
    node<T>*pindex = get_node(index);
    node<T>*p = new node<T>(t, pindex->prev, pindex);        //插入到index的前边,把index的前驱给它,index的地址为next
    pindex->prev->next = p;        pindex->prev = p;
    ++count;
}

//将节点插入第一个节点处
template<typename T>
void Link<T>::insert_first(T t)
{
    node<T>* p = new node<T>(t, head, head->next);
    head->next->prev = p;
    head->next = p;
}

//将节点追加到链表的末尾
template<typename T>
void Link<T>::insert_last(T t)
{
    node<T>*p = new node<T>(t, head->prev, head);
    head->prev->next = p;
    head->prev = p;
    ++count;
}

//删除index位置的节点
template<typename T>
T Link<T>::del(int index)
{
    node<T>*pindex = get_node(index);
    pindex->prev->next = pindex->next;
    pindex->next->prev = pindex->prev;
    T data = pindex->value;
    delete pindex;
    return data;
}

//删除第一个节点
template<typename T>
T Link<T>::delete_first(){
    retrun del(0);
}

//删除最后一个节点
template<typename T>
T Link<T>::delete_last()
{
    return del(count - 1);
}
复制代码

 

作者:ALINGMAOMAO

出处:https://www.cnblogs.com/ALINGMAOMAO/p/9869345.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   青山新雨  阅读(170)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示