001: #include <string>
002: #include <iostream>
003: #include <cassert>
005: using namespace std;
006:
007: class List;
008: class Iterator;
009:
010: class Node {
012: public:
013: /*
014: Constructs a node with a given data value.
015: @param s the data to store in this node
016: */
017: Node(string s);
018: private:
019: string data;
020: Node* previous;
021: Node* next;
022: friend class List;
023: friend class Iterator;
024: };
025:
026: class List {
028: public:
029: /**
030: Constructs an empty list;
031: */
032: List();
033: /**
034: Appends an element to the list.
035: @param s the value to append
036: */
037: void push_back(string s);
038: /**
039: Inserts an element into the list.
040: @param iter the position before which to insert
041: @param s the value to append
042: */
043: void insert(Iterator iter, string s);
044: /**
045: Removes an element from the list.
046: @param i the position to remove
047: @return an iterator pointing to the element after the
048: erased element
049: */
050: Iterator erase(Iterator i);
051: /**
052: Gets the beginning position of the list.
053: @return an iterator pointing to the beginning of the list
054: */
055: Iterator begin();
056: /**
057: Gets the past-the-end position of the list.
058: @return an iterator pointing past the end of the list
059: */
060: Iterator end();
061: private:
062: Node* first;
063: Node* last;
064: };
065:
066: class Iterator {
068: public:
069: /**
070: Constructs an iterator that does not point into any list.
071: */
072: Iterator();
073: /**
074: Looks up the value at a position.
075: @return the value of the node to which the iterator points
076: */
077: string get() const;
078: /**
079: Advances the iterator to the next node.
080: */
081: void next();
082: /**
083: Moves the iterator to the previous node.
084: */
085: void previous();
086: /**
087: Compares two iterators
088: @param b the iterator to compare with this iterator
089: @return true if this iterator and b are equal
090: */
091: bool equals(Iterator b) const;
092: private:
093: Node* position;
094: Node* last;
095: friend class List;
096: };
097:
098: Node::Node(string s)
099: { data = s;
101: previous = NULL;
102: next = NULL;
103: }
104:
105: List::List()
106: { first = NULL;
108: last = NULL;
109: }
110:
111: void List::push_back(string s)
112: { Node* newnode = new Node(s);
114: if (last == NULL) /* list is empty */
115: { first = newnode;
117: last = newnode;
118: }
119: else
120: { newnode->previous = last;
122: last->next = newnode;
123: last = newnode;
124: }
125: }
126:
127: void List::insert(Iterator iter, string s)
128: { if (iter.position == NULL)
130: { push_back(s);
132: return;
133: }
134:
135: Node* after = iter.position;
136: Node* before = after->previous;
137: Node* newnode = new Node(s);
138: newnode->previous = before;
139: newnode->next = after;
140: after->previous = newnode;
141: if (before == NULL) /* insert at beginning */
142: first = newnode;
143: else
144: before->next = newnode;
145: }
146:
147: Iterator List::erase(Iterator i)
148: { Iterator iter = i;
150: assert(iter.position != NULL);
151: Node* remove = iter.position;
152: Node* before = remove->previous;
153: Node* after = remove->next;
154: if (remove == first) first = after;
156: else before->next = after;
158: if (remove == last) last = before;
160: else after->previous = before;
162: iter.position = after;
163: delete remove;
164: return iter;
165: }
166:
167: Iterator List::begin()
168: { Iterator iter;
170: iter.position = first;
171: iter.last = last;
172: return iter;
173: }
174:
175: Iterator List::end()
176: { Iterator iter;
178: iter.position = NULL;
179: iter.last = last;
180: return iter;
181: }
182:
183: Iterator::Iterator()
184: { position = NULL;
186: last = NULL;
187: }
188:
189: string Iterator::get() const
190: { assert(position != NULL);
192: return position->data;
193: }
194:
195: void Iterator::next()
196: { assert(position != NULL);
198: position = position->next;
199: }
200:
201: void Iterator::previous()
202: { if (position == NULL) position = last;
205: else position = position->previous;
207: assert(position != NULL);
208: }
209:
210: bool Iterator::equals(Iterator b) const
211: { return position == b.position; }
214:
215: int main()
216: { List staff;
218:
219: staff.push_back("Cracker, Carl");
220: staff.push_back("Hacker, Harry");
221: staff.push_back("Lam, Larry");
222: staff.push_back("Sandman, Susan");
223:
224: /* add a value in fourth place */
226: Iterator pos;
227: pos = staff.begin();
228: pos.next();
229: pos.next();
230: pos.next();
232: staff.insert(pos, "Reindeer, Rudolf");
233:
234: /* remove the value in second place */
236: pos = staff.begin();
237: pos.next();
239: staff.erase(pos);
240:
241: /* print all values */
243: for (pos = staff.begin(); !pos.equals(staff.end()); pos.next())
244: cout << pos.get() << "\n";
245:
246: return 0;
247: }