⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex1308.cpp

📁 practice c++, it is from the book http://www.amazon.com/Schaums-Outline-Programming-John-Hubbard
💻 CPP
字号:
//  Programming with C++, Second Edition, by John R. Hubbard
//  Copyright McGraw-Hill 2000
//  Example 13.8, page 313
//  An Iterator Class Template for the List Class Template

#include <iostream>
#include <string>
using namespace std;
#include "List.h"
#include "Iterator.h"

template<class T>
class ListIter : public Iterator<T>
{
public:
  ListIter(List<T>& l) : list(l) { reset(); }
  virtual void reset() { previous = NULL; current = list.first; }
  virtual T operator()() { return current->data; }
  virtual void operator=(T t) { current->data = t; }
  virtual int operator!(); // determine whether current exists
  virtual int operator++(); // advance iterator to next item
  void insert(T t); // insert t after current item
  void preInsert(T t); // insert t before current item
  void remove(); // remove current item
protected:
  ListNode<T>* current; // points to current node
  ListNode<T>* previous; // points to previous node
  List<T>& list; // this is the list being traversed
};

template<class T>
int ListIter<T>::operator!()
{
  if (current == NULL) // reset current pointer
    if (previous == NULL) current = list.first;
    else current = previous->next;
  return (current != NULL); // returns TRUE if current exists
}

template<class T>
int ListIter<T>::operator++()
{
  if (current == NULL) // reset current pointer
    if (previous == NULL) current = list.first;
    else current = previous->next;
  else // advance current pointer
  {
    previous = current;
    current = current->next;
  }
  return (current != NULL);
}

template<class T>
void ListIter<T>::insert(T t)
{
 ListNode<T>* p = list.newNode(t,0);
 if (list.isEmpty()) list.first = p;
 else
   {
  p->next = current -> next;
  current -> next = p;
   }
}

template<class T>
void ListIter<T>::preInsert(T t)
{
  ListNode<T>* p = list.newNode(t,current);
  if (current == list.first) list.first = previous = p;
  else previous->next = p;
}

template<class T>
void ListIter<T>::remove()
{
  if (current == list.first) list.first = current->next;
  else previous->next = current->next;
  delete current;
  current = 0;
}

int main()
{
  List<string> friends;
  ListIter<string> it(friends);
  it.insert("Bowen, Van");
  ++it;
  it.insert("Dixon, Tom");
  ++it;
  it.insert("Mason, Joe");
  ++it;
  it.insert("White, Ann");
  ++it;
  friends.print();
  it.reset();
  ++it;
  it = "Davis, Jim";
  ++it;
  it.remove();
  friends.print();
  if(!it) it.preInsert("Morse, Sam");
  friends.print();
  for (it.reset(); !it; ++it)
    it = "[" + it() + "]";
  friends.print();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -