链表——插入和删除

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

// 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() << "\n";
    system("pause");
    return 0;
}

posted on 2015-12-29 18:06  抽筋的马  阅读(201)  评论(0编辑  收藏  举报

导航