Data Structures (Weiss) Chapter 3: List C++

本文详细介绍了使用C++模板类实现链表数据结构的方法,包括节点定义、迭代器实现、基本操作和复杂操作,展示了链表在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//

//  main.cpp

//  Data Structure TRY1

//

//  Created by zr9558 on 6/7/13.

//  Copyright (c) 2013 zr9558. All rights reserved.

//



// Data Structure C++, Weiss, List P.86, P.87


#include <iostream>

using namespace std;


template <typename Object>

class List

{

private:

   struct Node

    {

        Object data;

        Node *prev;

        Node *next;

        

        Node(const Object &d=Object(), Node *p=NULL, Node *n=NULL)

        : data(d), prev(p), next(n){}

    };

      

public:

    class const_iterator // The class const_iterator has a public child "iterator".

    {

    public:

        const_iterator(): current(NULL)

        {}

        

       const Object & operator *()const

        {return retrieve();}

        

        const_iterator &operator++()

        {

            current=current->next;

           return *this;

        }

        

        const_iteratoroperator ++(int)

        {

            const_iterator old=*this;

            ++(*this);

           return old;

        }

        

        const_iterator &operator--()

        {

            current=current->prev;

           return *this;

        }

        

        const_iteratoroperator --(int)

        {

            const_iterator old=*this;

            --(*this);

           return old;

        }

        

       bool operator == (const const_iterator &rhs) const

        {return current ==rhs.current;}

        

       bool operator != (const const_iterator &rhs) const

        {return !(*this==rhs);}

        

        

    protected:

        Node *current;

        

        Object &retrieve()const

        {return current->data;}

        

        const_iterator(Node *p): current(p)

        {}

        

       friend class List<Object>;

    };

    

   class iterator : public const_iterator

    {

    public:

        iterator()

        {}

        

        Object &operator* ()

        {return const_iterator::retrieve();}

       const Object &operator *()const

        {return const_iterator::operator *();}

        

        iterator &operator++()

        {

            const_iterator::current=const_iterator::current->next;

           return *this;

        }

        

        iteratoroperator++ (int)

        {

            iterator old=*this;

            ++(*this);

           return old;

        }

        

        iterator &operator--()

        {

            const_iterator::current=const_iterator::current->prev;

           return *this;

        }

        

        iteratoroperator-- (int)

        {

            iterator old=*this;

            --(*this);

           return old;

        }

        

        

        

    protected:

        iterator( Node *p): const_iterator(p)

        {}

        

       friend class List<Object>;

        

    };


    

    

    

public:

    List()

    { init();}

    

    ~List()

    {

        clear();

       delete head;

       delete tail;

    }

    

    List(const List &rhs)

    {

        init();

        *this=rhs;

    }

    

   const List & operator = (const List &rhs)

    {

       if( this==&rhs)

           return *this;

        clear();

       for( const_iterator itr=rhs.begin(); itr!=rhs.end(); ++itr)

            push_back(*itr);

       return *this;

    }

    

    

    iterator begin()

    {return iterator(head->next);}

    const_iterator begin()const

    {return iterator(head->next);}

    iterator end()

    {return iterator(tail);}

    const_iterator end()const

    {return const_iterator(tail);}

    

    

   int size() const

    {return theSize;}

   bool empty() const

    {return size()==0;}

    

   void clear()

    {

       while( !empty())

            pop_front();

    }

    

    

    Object &front()

    {return *begin();}

   const Object &front() const

    {return *begin();}

    Object &back()

    {return *--end();}

   const Object &back() const

    {return *--end();}

   void push_front( const Object &x)

    { insert( begin(),x);}

   void push_back( const Object &x)

    { insert( end(),x);}

   void pop_front()

    { erase( begin());}

   void pop_back()

    { erase(--end());}

    

    

    iterator insert( iterator itr,const Object &x)

    {

        Node *p=itr.current;

        theSize++;

       return iterator(p->prev=p->prev->next =new Node( x, p->prev, p));

    }

    

    iterator erase( iterator itr)

    {

        Node *p=itr.current;

        iterator retVal( p->next);

        p->prev->next=p->next;

        p->next->prev=p->prev;

       delete p;

        

        theSize--;

       return retVal;

    }

    

    iterator erase( iterator start, iterator end)

    {

       for( iterator itr=start; itr!=end;)

            itr=erase(itr);

        

       return end;

    }

    

    

private:

   int theSize;

    Node *head;

    Node *tail;

    

   void init()

    {

        theSize=0;

        head=new Node;

        tail=new Node;

        head->next=tail;

        tail->prev=head;

    }

};





int main()

{

    List<int> ilist;

    

   for( int i=0; i<20; ++i)

        ilist.push_back(i);

    

   for( int i=0; i<20; ++i)

        ilist.push_front(i);

    

   for( List<int>::iterator iter=ilist.begin(); iter!=ilist.end(); ++iter)

        cout<<*iter<<" ";

    cout<<endl;

    

    ilist.pop_back();

    ilist.pop_front();

    

   for( List<int>::iterator iter=ilist.begin(); iter!=ilist.end(); ++iter)

        cout<<*iter<<" ";

    cout<<endl;

    

    

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值