Klasse für Listenzugriff
-
Hallo muss aus diesen implementierten Funktionen eine Klasse für einen Listenzugriff schreiben! Kann mir jemand dafür einen Ansatz geben?
Ich kenne natürlich den Aufbau von Klassen, aber weiß nicht so recht wie ich das mit den structs und so machen soll!Gruß Jens
#include <iostream> using namespace std; // Ein Listenelement struct IntListElem { IntListElem *next; // Zeiger auf nächstes Element int value; // Daten zu diesem Element }; // Eine Liste struct IntList { int count; // Anzahl Elemente in der Liste IntListElem *first; // Zeiger auf erstes Element der Liste }; // Initialisiere eine Listenstruktur. Die Liste wird als Referenz, // nicht als Wert übergeben, es kann also der Inhalt geändert werden void empty_list (IntList &l) { l.first = 0; // 0 ist keine gueltige Adresse: Liste ist leer l.count = 0; } // erstes Vorkommen von x in Liste suchen IntListElem* find_first_x (IntList &l, int x) { for (IntListElem* p=l.first; p!=0; p=p->next) if (p->value==x) return p; return 0; } // erstes Vorkommen von x in Liste suchen IntListElem* find_first_before_x (IntList &l, int x) { for (IntListElem* p=l.first; p!=0; p=p->next) if ((p->next != 0) && (p->next->value == x)) return p; return 0; } // Fuege ein Element nach einem gegebenem ein void insert_in_list_at_pos (IntList &list, IntListElem * where, IntListElem * ins) { if (where == 0) // fuege am Anfang ein { ins->next = list.first; list.first = ins; list.count = list.count + 1; } else // fuege nach where ein { ins->next = where->next; where->next = ins; list.count = list.count + 1; } } // Entferne ein Element nach einem gegebenem // Liefere das entfernte Element zurueck IntListElem *remove_from_list_after_pos (IntList &list, IntListElem * where) { IntListElem *p; // das entfernte Element // where==0 dann entferne erstes Element if (where == 0) { p = list.first; if (p != 0) { list.first = p->next; list.count = list.count - 1; } return p; } // entferne Element nach where p = where->next; if (p != 0) { where->next = p->next; list.count = list.count - 1; }; return p; } // eine Zahl am Anfang der Liste einfügen void insert_in_list (IntList &list, int x) { IntListElem* elem = new IntListElem; elem->value = x; insert_in_list_at_pos(list, 0, elem); }; // erstes Vorkommen der Zahl x in der Liste löschen IntListElem* remove_from_list(IntList &list, int x) { // suche das Element vor x IntListElem* p = find_first_before_x(list, x); // wurde es gefunden? if (p != 0) { // normal das Element entfernen p = remove_from_list_after_pos(list, p); } else { // kein Element vor x kann auch heissen, dass x das erste Element ist if ((list.first != 0) && (list.first->value == x)) p = remove_from_list_after_pos(list, 0); }; // Speicher für Element wieder freigeben delete p; return 0; }; // Zugriff auf Anzahl der Elemente int list_num (IntList& l) { return l.count; }; // Liste ausgeben void print_list (IntList& l) { cout << list_num(l) << " Elemente: "; cout << "("; for (IntListElem* p=l.first; p!=0; p=p->next) cout << " " << p->value; cout << " )" << endl; } // Listendaten entfernen void discard_list (IntList& l) { IntListElem* p = l.first; while (p != 0) { IntListElem* next = p->next; delete p; p = next; }; }; int main () { IntList list; // Liste initialisieren (leeren) empty_list(list); for (int i=20; i > 0; i = i - 1) insert_in_list(list, i); print_list(list); for (int i=0; i < 15; i = i + 1) remove_from_list(list, i); print_list(list); discard_list(list); system("Pause"); };
-
Schau dir doch mal den Header <list> an, der dürfte dir eventuell ein paar Ansätze geben
(Ansonsten würde ich aus den ganzen Funktionen lieber Methoden der Klasse 'InTList' machen, anstatt sie global zu definieren)