C++模拟实现双向列表

#ifndef _LIST_H
#define _LIST_H

template <class T>
class Node
{
public:
    Node<T> *prev; // 上一个节点
    Node<T> *next; // 下一个节点
    T data; // 当前这个节点的数据
};

template <class T>
class List
{
private:
    Node<T> *head; // 头节点
    Node<T> *tail; // 尾节点
    int length; // 列表长度

public:
    List();
    ~List();
    void push_back(T e); // 在尾部添加
    void push_front(T e); // 在头部添加
    void pop_back(); // 删除最后一个节点
    void remove(T data); // 移除制定的节点
    T front(); // 获取第一个节点
    T back(); // 获取最后一个节点
    int size(); // 获取列表长度
    T operator[](int i); // 重写[]取值
};

template <typename T>
List<T>::List()
{
    head = new Node<T>;
    tail = new Node<T>;
    head -> prev = NULL;
    head -> next = tail;

    tail -> prev = head;
    tail -> next = NULL;
    length = 0;
}

template <typename T>
void List<T>::push_back(T e)
{
    // 创建一个新节点
    Node<T> *newNode = new Node<T>();
    newNode -> data = e;
    tail -> prev -> next = newNode;
    newNode -> prev = tail -> prev;
    newNode -> next = tail;
    tail -> prev = newNode;
    ++ length;
}

template <typename T>
void List<T>::push_front(T e)
{
    Node<T> *newNode =  new Node<T>();
    newNode -> data = e;
    head -> next -> prev = newNode;
    newNode -> next = head -> next;
    head -> next = newNode;
    newNode -> prev = head;
    ++ length;
}

template <typename T>
void List<T>::pop_back()
{
    if (length <= 0)
    {
        std::cout << "列表为空...";
        return;
    }

    Node<T> *p = tail; // 尾巴
    if (tail -> prev != NULL)
    {
        p = p -> prev;
        p -> prev -> next = tail;
        tail -> prev = p -> prev;
        delete p;
        -- length;
        return;
    }
}

template <typename T>
void List<T>::remove(T data)
{
    if (length <= 0)
    {
        std::cout << "列表为空...";
        return;
    }

    Node<T> *p = head;
    while(p -> next != tail)
    {
        p = p -> next;
        if (p -> data == data)
        {
            Node<T> *temp = p -> prev;
            temp -> next = p -> next;
            p -> next -> prev = temp;
            delete p;
            -- length;
            return;
        }
    }
}

template <typename T>
T List<T>::front()
{
    if (length <= 0)
    {
        std::cout << "列表为空...";
        return head -> data;
    }

    return head -> next -> data;
}

template <typename T>
T List<T>::back()
{
    if (length <= 0)
    {
        std::cout << "列表为空...";
        return tail -> data;
    }

    return tail -> prev -> data;
}

template <typename T>
T List<T>::operator[](int index)
{
    if (index < 0)
    {
        std :: cout << "索引下标越界...";
        return head -> data;
    }

    int i = 0;
    Node<T> *p = head;
    while (p -> next != tail)
    {
        p = p -> next;
        if (i == index)
        {
            return p -> data;
        }
        ++ i;
    }
    return tail -> data;
}

template <typename T>
int List<T> :: size()
{
    return length;
}

template <typename T>
List<T>::~List()
{
    if (length == 0)
    {
        delete head;
        delete tail;
        head = NULL;
        tail = NULL;
        return;
    }

    Node<T> *p;
    while (head -> next != NULL)
    {
        p = head;
        head = head -> next;
        delete p;
    }
    delete head;
    head = NULL;
}
#endif
 

#include <iostream>
#include "list.h"
#include <string>

using namespace std;

class StuInfo
{
    private:
        string sno; // 学号
        string sname; // 姓名
        int age; // 年龄

    public:
        StuInfo() {}
        StuInfo(string sno, string sname, int age):sno(sno), sname(sname), age(age){}
        void setSno(string sno)
        {
            this -> sno = sno;
        }

        void setSname(string sname)
        {
            this -> sname = sname;
        }

        void setAge(int age)
        {
            this -> age = age;
        }

        string getSno()
        {
            return sno;
        }

        string getSname()
        {
            return sname;
        }

        int getAge()
        {
            return age;
        }

        void show()
        {
            cout << "\n\t" << sno << "\t" << sname << "\t" << age << endl;
        }
};

int main()
{
    List<StuInfo> list;
    list.push_back(StuInfo("101", "张三", 20));
    list.push_back(StuInfo("102", "李四", 18));
    list.push_front(StuInfo("103", "王五", 17));
    for (int i = 0, len = list.size(); i < len; ++ i) {
        list[i].show();
    }

    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值