Suche in Listen
-
Hallo, ich habe folgendes Programm:
dekl.
#ifndef dekl_h #define dekl_h #include <iostream.h> #include <conio.h> class Klasse; class Klasse { private: struct Knoten { int Inhalt; Knoten * pNext; }; Knoten *pFirst; Knoten *pLast; int Anzahl; public: Klasse(); Klasse(const Klasse &obj); ~Klasse(); void push_front(int obj); void push_place(int obj,int place); void push_back(int obj); void pop_front(); void pop_place(int place); void pop_back(); int get_front(); int get_back(); friend ostream& operator<<(ostream &os, Klasse &obj); friend istream& operator>>(istream &is, Klasse &obj); void KlasseAusgeben(); }; #endifimpl.
#include "dekl.h" Klasse::Klasse() { Anzahl = 0; pFirst = pLast = NULL; } //Kopierkonstruktor Klasse::Klasse(const Klasse &obj) { this->Anzahl = 0; pFirst = pLast = NULL; Knoten *ptemp = obj.pFirst; for(int anz = obj.Anzahl; anz != 0; anz --) { this->push_front(ptemp->Inhalt); ptemp = ptemp->pNext; } } // Dekonsturktor Klasse::~Klasse() { Knoten *ptemp = pFirst; for (; Anzahl >0; Anzahl--) { pFirst = pFirst->pNext; delete ptemp; ptemp = pFirst; } } // Einfuegen vorne void Klasse::push_front(int obj) { if(Anzahl==NULL) // wenn noch keiner da ist... { pFirst = new Knoten; // Zeiger wird auf Speicheradresse festgelegt... pFirst->Inhalt = obj; // wird objekt in speicher geschrieben pFirst->pNext = NULL; // da wir nur 1 Knoten besitzen, wird der Next Zeiger NULL gesetzt pLast = pFirst; // da nur 1, ist der letzte gleich dem ersten } else // wenn die Anzahl nicht 0 ist { // Knoten ist die Strucktu innerhalb der Klasse... Knoten *pNew = new Knoten; // Erstellen eines neuen Zeigers, und zuweissung des Speichers pNew->Inhalt = obj; // Neuer Knoten wird über Zeiger PNew mit Inhalt gefühlt-->Obj pNew->pNext = pFirst; // Der PNext Zeiger vom vorne einzufügenden Knoten soll den "ehemaligen pFirst "ersten" Konoten zeigen pFirst = pNew; // Der neue Knoten wird der erste Knoten der Liste... } Anzahl ++; } // An Postition einfügen void Klasse::push_place(int obj, int place) { if(Anzahl==NULL) { pFirst = new Knoten; pFirst->Inhalt = obj; pFirst->pNext = NULL; pLast = pFirst; } if(Anzahl<=place && Anzahl!=NULL) { Knoten *pNew = new Knoten; pNew->Inhalt = obj; pNew->pNext = NULL; pNew->pNext = pNew; pLast = pNew; } if(Anzahl>place && Anzahl!=NULL && place > -1) { Knoten *pNew = new Knoten; pNew->Inhalt = obj; pNew->pNext = NULL; if(place == 0) { pNew->pNext = pFirst; pFirst = pNew; } else { Knoten*ptemp = pFirst; for(; place > 1;place--) ptemp=ptemp->pNext; pNew->pNext = ptemp->pNext; ptemp->pNext = pNew; } } Anzahl++; } // hinten hinhaengen void Klasse::push_back(int obj) { if(Anzahl==NULL) { pFirst = new Knoten; // Gleich wie einfuegen vorne...da Anzahl = 0, d.h. nix in Liste... pFirst->Inhalt = obj; pFirst->pNext = NULL; pLast = pFirst; } else { Knoten *pNew = new Knoten; // neuer Speicher für Knoten..zeiger zeigt druff pNew->Inhalt = obj; // Inhalt wird eingefügt pNew->pNext = NULL; // da hinten angefügt, wird der Zeige auf das Nächste 0 gesetzt... pLast->pNext = pNew; // pLast = pNew; // der neue wird dem letzten zugewiesen } Anzahl++; } // lustiges löschen des ersten Elementes void Klasse::pop_front() { if(Anzahl == 1) { cout<<"Erstes Klassenelement "<<pFirst->Inhalt<<" geloescht! "<<endl<<endl; delete pFirst; pFirst = pLast = NULL; Anzahl = 0; } if (Anzahl > 1) { cout<<"Erstes Klassenelement "<<pFirst->Inhalt<<" geloescht! "<<endl<<endl; Knoten *ptemp = pFirst; pFirst = pFirst->pNext; delete ptemp; Anzahl--; } } // an genauer Postition löschen void Klasse::pop_place(int place) { if(Anzahl==NULL) { cout<<"Klasse ist leer! "; } if((Anzahl-1) <= place && Anzahl != NULL) { this->pop_back(); Anzahl--; } if((Anzahl -1) > place && Anzahl != NULL && place > -1) { if(place == 0) { Knoten * ptemp = pFirst; pFirst = pFirst->pNext; delete ptemp; } else { Knoten *ptempV =pFirst; Knoten *ptempL =pFirst; for( ; place >1;place--) ptempV = ptempV->pNext; ptempL = ptempV->pNext; ptempV->pNext = ptempV->pNext->pNext; delete ptempL; } Anzahl--; } } //letztes löschen void Klasse::pop_back() { if(Anzahl ==1) { cout<<"Letztes Element "<<pFirst->Inhalt<<" wird gelöscht!"<<endl; delete pFirst; pFirst= pLast = NULL; Anzahl = 0; } if(Anzahl >1) { Knoten *ptemp= pFirst; while(ptemp->pNext != pLast) ptemp = ptemp->pNext; cout<<"Letztes Klassenelement "<<pLast->Inhalt<<" geloescht! "<<endl<<endl; delete pLast; pLast = ptemp; Anzahl--; } } // Zeige Erstes Element int Klasse::get_front() { return pFirst->Inhalt; } // letztes Element int Klasse::get_back() { return pLast->Inhalt; } // Klasse Ausgeben void Klasse::KlasseAusgeben() { Knoten *ptemp = pFirst; cout<<"Ausgabe der Klasse: "<<endl<<endl; for(int anz = Anzahl; anz !=0; anz--) { cout<<ptemp->Inhalt<< " "; ptemp = ptemp->pNext; } cout<<endl<<endl; } //überladen von was auch immer ostream& operator<< (ostream &os, Klasse &obj) { { if(obj.Anzahl == NULL) os<<"Klasse Leer, lala...!"<<endl<<endl; } os<<"Ausgabe der Klasse mit Operator: "<<endl<<endl; Klasse::Knoten *ptemp = obj.pFirst; for(int anz = obj.Anzahl; anz !=0; anz--) { os<<ptemp->Inhalt<<" "; ptemp = ptemp->pNext; } os<<endl<<endl; return os; }; istream& operator>>(istream &is, Klasse &obj) { cout<<"Eingabe: "; int temp; is>>temp; obj.push_back(temp); return is; }main
#include "impl.cpp" int main() { Klasse L; L.push_front(33); L.push_front(23); L.push_front(45); L.push_front(66); L.push_front(22); L.push_front(11); L.push_back(44); L.push_back(55); L.push_back(66); cout<<L.get_front()<<endl; cout<<L.get_back()<<endl<<endl; L.KlasseAusgeben(); cout<<endl; L.pop_front(); L.KlasseAusgeben(); cout<<endl; L.pop_back(); L.KlasseAusgeben(); cout<<endl; cout<<L; cin>>L; fflush(stdin); cout<<L; L.push_place(000,2); L.push_place(333,3); L.push_place(999,4); cout<<L; L.pop_place(0); cout<<L; L.pop_place(1); cout<<L; L.pop_place(4); cout<<L; Klasse L2(L); Klasse *pL3 = new Klasse(L2); pL3->pop_front(); pL3->pop_back(); L2.push_front(0); L.pop_front(); cout<<L; cout<<L2; cout<<*pL3; cout<<"Ende "<<endl; getch(); return 0; }Nun meine Frage:
wie kann ich eine suche innerhalb der Liste realisieren?Danke im voraus

-
indem du die schleife durchläufst und den wert mit if vergleichst.
-
Mr. Blonde schrieb:
wie kann ich eine suche innerhalb der Liste realisieren?
Am besten mit dem Standard-Algorithmus std::find bzw. std::find_if. Das setzt aber die Existenz von Standard-konformen Iteratoren voraus, die über Deine Liste laufen können.
Zum Beispiel so:
#include <iterator> // iterator<> class Klasse { private: struct Knoten { int Inhalt; Knoten * pNext; }; Knoten *pFirst; Knoten *pLast; int Anzahl; public: class Iterator; friend Iterator; class Iterator : public std::iterator< std::forward_iterator_tag, int > { public: explicit Iterator( Knoten* p = 0 ) : m_p( p ) {} // -- Inkrement Iterator& operator++() { m_p = m_p->pNext; return *this; } Iterator operator++( int ) { Iterator tmp( *this ); this->operator++(); return tmp; } // -- Vergleich bool operator==( const Iterator& b ) const { return m_p == b.m_p; } bool operator!=( const Iterator& b ) const { return !(*this == b); } // -- Element Zugriff int& operator*() const { return m_p->Inhalt; } int* operator->() const { return &(m_p->Inhalt); } private: Knoten* m_p; }; typedef Iterator iterator; Iterator begin() { return Iterator( pFirst ); } Iterator end() { return Iterator(); } Klasse(); Klasse(const Klasse &obj); ~Klasse(); // usw. wie gepostetDie Anwendung 'Suchen' geht dann wie folgt:
#include <algorithm> // std::find #include <iostream> int main() { using namespace std; Klasse l; l.push_back( 9 ); l.push_back( 7 ); Klasse::iterator i = std::find( l.begin(), l.end(), 7 ); if( i != l.end() ) { cout << "Element " << *i << " gefunden" << endl; } return 0; }Der Vorteil von Iteratoren ist, dass dann auch andere std-Algorithmen wie z.B. find_if, distance, copy, min_element usw. mit Deiner Klasse zusammen arbeiten können.
Bem.: die Ableitung von std::iterator< std::forward_iterator_tag, .. > ist für die Algorithmen notwendig, wenn sie die Iterator-Kategorie ermitteln müssen; wie z.B. std::distance.
Gruß
Werner