013
03.08.2004, 14:30 Uhr
0xdeadbeef
Gott (Operator)
|
Warum machst du das denn alles static? Auf die Art wird die Liste ja quasi ein singleton, und das willst du hier nun wirklich nicht. Sinnvoller wäre es, die Liste in Listenkopf und Listenelement zu unterteilen, also etwa so:
C++: |
class my_list { private: struct element { int content; element *prev, *next; };
element *head, tail; size_t length;
public: my_list() { head = new element; tail = new element;
//Dummies einrichten head->prev = tail->prev = head; head->next = tail->next = tail; }
~my_list() { for(element *p = head->next; p != tail; p = p->next) delete p->prev; delete tail; }
void insert_at_beginning(int x) { head->next->prev = new element; head->next = head->next->prev; head->next->content = x;
++length; } void insert_at_end(int x) { tail->prev->next = new element; tail->prev = tail->prev->next; tail->prev->content = x;
++length; } void insert_at_index(size_t index, int x) { element *p = head; for(size_t i = 0; i < index; ++i) p = p->next; p->next->prev = new element; p->next = p->next->prev; p->next->content = x;
++length; }
void remove_beginning() { if(size() == 0) return; head->next = head->next->next; delete head->next->prev; head->next->prev = head;
--length; }
void remove_end() { if(size() == 0) return; tail->prev = tail->prev->prev; delete tail->prev->next; tail->prev->next = tail;
--length; }
///...und so weiter halt.
void remove_at_index(size_t);
size_t size() const { return length; }
int get_item_at_beginning() const; int get_item_at_end() const; int get_item_at_index(size_t) const; };
|
Das ist jetzt völlig ungetesteter Code, aber das Prinzip dürfte klar werden. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |