• 链表——插入和删除


    以下程序示范了链表插入和删除的操作

    // lst2.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <string>
    #include <iostream>
    #include <cassert>
    
    using namespace std;
    
    class List;
    class Iterator;
    
    class Node 
    {
    public:
        /*
            Constructs a node with a given data value.
            @param s the data to store in this node
        */
        Node(string s);
    private:
        string data;
        Node* previous;
        Node* next;
        friend class List;
        friend class Iterator;
    };
    
    class List
    {
    public:
        /**
            Constructs an empty list.
        */
        List();
        /**
            Appends an element to the list
            @param s the balue to append
        */
        void push_back(string s);
        /**
            Inserts an element into the list.
            @param iter the position before which to insert
            @param s the value to append
        */
        void insert(Iterator iter, string s);
        /**
            Removes an element from the list.
            @param i the position to remove
            @return an iterator pointing to the element after the erased element
        */
        Iterator erase(Iterator i);
        /**
            Gets the begining position of the list.
            @return an iterator pointing to the begining of the list
        */
        Iterator begin();
        /**
            Gets the past-the-end position of the list
            @return an iterator pointing past the end of the list.
        */
        Iterator end();
    private:
        Node* first;
        Node* last;
    };
    
    class Iterator
    {
    public:
        /**
            Constructs an iterator that does not point into any list;
        */
        Iterator();
        /**
            Looks up the value at a position.
            @return the value of the node to which the iterator points
        */
        string get() const;
        /**
            Adavances the iterator to the next node.
        */
        void next();
        /**
            Moves the iterator to the previous node.
        */
        void previous();
        /**
            Compares two iterator.
            @param b the iterator to compare with this iterator
            @return true if this iterator and b are equal
        */
        bool equals(Iterator b) const;
    private:
        Node* position;
        Node* last;
        friend class List;
    };
    
    Node::Node(string s)
    {
        data = s;
        previous = NULL;
        next = NULL;
    }
    List::List()
    {
        first = NULL;
        last = NULL;
    }
    
    void List::push_back(string s)
    {
        Node* newnode = new Node(s);
        if (last == NULL) /* list is empty */
        {
            first = newnode;
            last = newnode;
        }
        else 
        {
            newnode->previous = last;
            last->next = newnode;
            last = newnode;
        }
    }
    
    void List::insert(Iterator iter, string s)
    {
        if (iter.position == NULL)
        {
            push_back(s);
            return;
        }
        Node* after = iter.position;
        Node* before = after->previous;
        Node* newnode = new Node(s);
        newnode->previous = before;
        newnode->next = after;
        after->previous = newnode;
        if (before == NULL) /* insert at beginning */
            first = newnode;
        else
            before->next = newnode;
    }
    
    Iterator List::erase(Iterator i)
    {
        Iterator iter = i;
        assert(iter.position != NULL);
        Node* remove = iter.position;
        Node* before = remove->previous;
        Node* after = remove->next;
        if ( remove == first )
            first = after;
        else
            before->next = after;
        if (remove == last)
            last = before;
        else 
            after->previous = before;
        iter.position = after;
        delete remove;
        return iter;
    }
    
    Iterator List::begin()
    {
        Iterator iter;
        iter.position = first;
        iter.last = last;
        return iter;
    }
    
    Iterator List::end()
    {
        Iterator iter;
        iter.position = NULL;
        iter.last = last;
        return iter;
    }
    
    Iterator::Iterator()
    {
        position = NULL;
        last = NULL;
    }
    
    string Iterator::get() const
    {
        assert(position != NULL);
        return position->data;
    }
    
    void Iterator::next()
    {
        assert(position != NULL);
        position = position->next;
    }
    void Iterator::previous()
    {
        if (position == NULL)
            position = last;
        else
            position = position->previous;
        assert(position != NULL);
    }
    
    bool Iterator::equals(Iterator b) const
    {
        return position == b.position;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        List staff;
    
        staff.push_back("Cracker, Cral");
        staff.push_back("Hacker, Harry");
        staff.push_back("Lam, Larry");
        staff.push_back("Sandman, Susan");
    
        /* add a value in fourth place */
        Iterator pos;
        pos = staff.begin();
        pos.next();
        pos.next();
        pos.next();
    
        staff.insert(pos, "Reindeer, Rudolf");
        /* remove the value in second place */
        pos = staff.begin();
        pos.next();
    
        staff.erase(pos);
        
        /* print all values */
        for (pos = staff.begin(); !pos.equals(staff.end()); pos.next())
            cout << pos.get() << "
    ";
        system("pause");
        return 0;
    }

  • 相关阅读:
    实验3-4 统计字符 (15分)
    实验3-5 查询水果价格 (15分)
    实验3-6 计算个人所得税 (10分)
    实验3-7 统计学生成绩 (15分)
    实验3-8 输出三角形面积和周长 (15分)
    实验3-9 三天打鱼两天晒网 (15分)
    实验3-11 计算油费 (15分)
    由一个商城项目得到的感悟
    ActiveMQ(三)——理解和掌握JMS(1)
    ActiveMQ(二)——ActiveMQ的安装和基本使用
  • 原文地址:https://www.cnblogs.com/david-zhao/p/5086603.html
Copyright © 2020-2023  润新知