链表类模板的实现

任务描述

本关任务:实现双向链表类模板。

相关知识

为了完成本关任务,你需要掌握:1.复习C语言链表的实现。2.对链表的数据属性和功能进行封装。3.利用模板实现数据类型的参数化。
主程序main()中定义通用算法如下:

  1. template<class Iterator> //在指定范围内输出元素
    void display(Iterator first, Iterator last)
    {
    for (; first != last; ++first)
    cout << *first << ' ';
    cout << endl;
    }

该算法能够输出链表模板类对象中存放的元素。

编程要求

根据提示,在右侧编辑器补充代码,实现链表类模板的定义。

测试说明

平台会对你编写的代码进行测试:

预期输出:
109 108 107 106 105 104 103 102 101 100
108 107 106 105 104 103 102 101 100
108 107 106 105 104 103 102 101 100
38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 0 108 107 106 105 104 103 102 101 100
36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 0 108 107 106 105 104 103 102 101 100
36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 0 108 107 106 105 104 103 102 101 100

 

#pragma once
template<class T>
class List
{
    protected:
    struct Node
    {
        T data;
        Node*prev;
        Node*next;
        Node(T d=0,Node*p=0,Node*n=0):data(d),prev(p),next(n){}
    };
    int size;
    Node*head;
    Node*tail;
    void Init()
    {
        size=0;head=new Node;tail=new Node;
        head->next=tail;
        tail->prev=head;
    }
    public:
    class iterator
    {
        public:
        Node*cur;
        T& get_value()
        {
           return cur->data;
        }
        iterator(Node* p):cur(p){}
        iterator():cur(0){}
        T& operator *()
        {
            return get_value();
        }
        iterator operator ++()
        {
            cur=cur->next;
            return *this;
        }
        iterator operator ++(int)
        {
            iterator old=*this;
            ++(*this);
            return old;
        }
        iterator operator --()
            {
                cur=cur->prev;
                return *this;
            }
        iterator operator --(int)
        {
            iterator old=*this;
            --(*this);
            return old;
        }
        bool operator ==(iterator& itr)
        {
            return cur==itr.cur;
        }
        bool operator !=(iterator& itr)
        {
            return cur!=itr.cur;
        }
    };
    public:
    List()
    {
        Init();  
    }
    List(List<T>& l)
    {
        Init();
        *this=l;
    }
    List<T>& operator=(List<T>&l);
    int Size()
    {
        return this->size;
    }
    iterator Begin()
    {
        return iterator(head->next);
    }
    iterator End()
    {
        return iterator(tail);
    }
    iterator Insert(iterator itr,T value);
    iterator Erase(iterator itr);
    void pop_front()
    {
        Erase(Begin());
    }
    void pop_back()
    {
        Erase(End());
    }
    void push_front(T& value)
    {
        Insert(Begin(),value);
    }
    void push_back(T& value)
    {
        Insert(End(),value);
    }
    void clear()
    {
        while(Size()!=0)pop_front();
    }
};


template<class T>
typename List<T>::iterator List<T>::Insert(iterator itr,T value)
{
    Node*p=itr.cur;
    p->prev->next=new Node(value,p->prev,p);
    p->prev=p->prev->next;
    size++;
    return iterator(p->prev);
}
template<typename T>
typename List<T>::iterator List<T>::Erase(iterator itr)
{
    Node*p=itr.cur;
    iterator ne(p->next);
    p->prev->next=p->next;
    p->next->prev=p->prev;
    size--;
    delete p;
    return ne;
}

template<typename T>
List<T>& List<T>::operator=(List<T>&l)
{
    this->clear();
    iterator first=l.Begin();
    iterator last=l.End();
    for (;first!=last;first++)
    {
        push_back(*first);
    }
    return *this;
}

 

 

面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值