Lineare geordnete verkettete Liste



  • Hallo,

    ich hab folgendes Problem, ich will mehrere durch einen Nomenklaturschlüssel unterscheidbare Einträge ordnen und dies mit einer linearen geordneten verketteten Liste realisieren, um damit dann weiter zu arbeiten.
    Dazu habe ich die folgende Funktion zur Erstellung und Belegung der Liste geschrieben:

    void VerketteteLineareListe::suchEinfuegElement(ZBibInhEl &listKopf, ZBibInhEl einfueEl){
    
    	if(listKopf==NULL)                         //Liste ist leer, Anfang mit einfueEl belegen
    		listKopf=einfueEl;
    	else
    		if(vergleichKennzahl(einfueEl, listKopf)){     //einfueEl amAnfang einfügen
    			einfueEl->weiter=listKopf;
    			listKopf=einfueEl;
    		}
    		else{                   //Liste durchsuchen, bis richtiger Platz für einfueEl gefunden
    			ZBibInhEl p1, p2;   //Hilfs-/Laufzeiger bzw. Kamm für Suche;p2 läuft p1 um 1Element hinterher
    			p1=listKopf;
    			do{
    				p2=p1;
    				p1=p1->weiter;
    			}while(p1!=NULL && !vergleichKennzahl(einfueEl,p1));
    			p2->weiter=einfueEl;
    			einfueEl->weiter=p1;
    		}
    }
    

    Die Funktion vergleichKennzahl sieht wie folgt aus:

    bool VerketteteLineareListe::vergleichKennzahl(ZBibInhEl einfuegendeBiInEl, ZBibInhEl bezugBiInEl){
    
    	const int arrayLaengeKennza=7;
    	bool elKleinerBezug=false;
    
    	for(int i=0;i<=arrayLaengeKennza-1;i++){
    
    	    int einfueEl=einfuegendeBiInEl->kennza[i]; //Kennzahl des einzufügenden BiInhEl
    	    int bezugEl=bezugBiInEl->kennza[i];        //Kennzahl des bezugs BiInhEl
    
    		if(einfueEl<bezugEl){
    			elKleinerBezug=true;
    			i=arrayLaengeKennza-1;
    		}
    		if(einfueEl>bezugEl){
    			elKleinerBezug=false;
    			i=arrayLaengeKennza-1;
    		}
    
    	}
    	return elKleinerBezug;
    }
    

    Meine Liste wird auch soweit, wie ich es möchte erstellt, nur bei den Einträgen
    1.2.0.0.0.0, 1.3.0.0.0.0, 1.4.0.0.0.0 usw. werden diese nicht richtig einsortiert. Diese werden nach 1.1.0.0.0.0 in umgekehrter Reihenfolge und vor 1.1.1.0.0.0 eingefügt. Hat jemand eine Idee woran es liegen kann?



  • Das i=arrayLaengeKennza-1 sieht etwas gekünstelt aus (und bewirkt nebenbei noch einen zusätzlichen Schleifendurchlauf) - wenn du aus der Schleife raus willst, nimm lieber break; (in deinem Fall ginge auch ein return).

    (außerdem wäre es eventuell hilfreich zu wissen, was sich hinter 'ZBibInhEl' etc verbirgt)



  • Danke für den Tipp mit dem Schleifenabruch, funktioniert.
    'ZBibInhEl' ist

    typedef Bibelinhaltsverzeichniselement *ZBibInhEl;
    

    Und das Bibelinhaltsverzeichniselement ist ein Objekt, das verschiedene Einträge enthält, wie z.B. int kennza[7] , einen Zeiger *weiter und verschiedene CStrings.


Anmelden zum Antworten