Aus verkettete Liste löschen *verzweifel*



  • Ich habe erfolgreich eine Liste von Autos erstellt, nun möchte ich wenn RECT position.left < 0, dies ist vereinfacht in der Delete() Function, dass dieses Auto dann aus der Liste gelöscht wird. Habe schon soviel probiert aber anscheinend habe ich da einen Knoten im Kopf 🙄 Im Moment habe ich soviel, nur verliere ich dann einen Teil der Liste 😞

    void AutoListe::AutoDelete(void)
    {		
    	Auto *pTemp = pStart;
    	while(pTemp != NULL)
    	{				
    		if (pTemp->Delete() == true)
    		{				
    			pStart->pNext = pTemp->pNext;
    		} 
    		pTemp = pTemp->pNext;		
    	}
    }
    

    Es kann auch sein das mehrere Auto die Delete Function erfüllen, deswegen in einer Schleife. Könnt ihr mir da vielleicht helfen, wäre super nett 👍

    Gruß
    speedy



  • Ich habe zwar keine Ahnung von C++ aber ich denke mit der Zeile

    pStart->pNext = pTemp->pNext;
    

    setzt Du den Zeiger der auf den Anfang zeigt auf das Element nach dem Element, das Zu loeschen willst, d.h. Du loescht alle Autos vor dem Element, welches weg soll. Meiner Meinung nach musst Du

    pTemp = pTemp->pNext;
    

    schreiben.



  • Bloedsinn!! Entschuldige bitte! Das muesste gehen:

    void AutoListe::AutoDelete(void) 
    {         
        Auto *pTemp = pStart;
        Auto *pTemp2 = pStart; 
        while(pTemp != NULL) 
        {  
    
            if (pTemp->Delete() == true) 
            {                 
                pTemp2->pNext = pTemp->pNext; 
            }  
            pTemp2 = pTemp;        /*pTemp2 zeigt auf das Element vor betrachteten*/
            pTemp = pTemp->pNext;         
        } 
    }
    


  • Ich habe mal zwei Kommentare:
    1. Wo löscht ihr eigentlich? Ich sehe keinen Aufruf von Free.
    2. Was ist wenn der erste Eintrag gelöscht wird? pStart wird nie verändert. Die Integrität der Liste ist nicht gewährleistet.

    Mein Vorschlag folgt gleich...



  • Vorschlag:
    Mach daraus eine doppelt-verkettete Liste und dann:

    void AutoListe::AutoDelete(void) 
    {
      Auto *pTemp = pStart;
      Auto *pTemp2;
        while (pTemp != NULL)
        {
            if (pTemp->Delete() == true)
            {
                pTemp2 = pTemp;
                if (pTemp == pStart)
                    pStart = pStart->next;
                pTemp = pTemp->next;
                free(pTemp2);
            }
            else
                pTemp = pTemp->next;
        }
    }
    


  • Sorry, vergiß den Kommentar mit der doppelt-verketteten Liste. Bin auf der Arbeit und schreibe gerade ein Programm mit solch einer Liste. Konnte Arbeit wohl nicht ganz von Vergnügen trennen. 🕶



  • Wenn ich jetzt nicht totalen Mist gemacht habe, müsste das hier funktionieren.
    Ich weiß nicht wie du Auto organisiert hast, aber ich denke die delete´s gehören da mit hinein.

    void AutoListe::AutoDelete(void) 
    {         
        Auto *pTemp = pStart; 
        Auto *pNext = pTemp->pNext;
    
        while(pNext != NULL) 
        {                 
            if (pNext->Delete() == true) 
            {                 
                pTemp->pNext = pNext->pNext; 
                delete pNext;
            }  
            pTemp = pTemp->pNext;
            pNext = pTemp->pNext;  
        } 
        if (pStart->Delete() == true)
        {
            pTmp = pStart->next;
            delete pStart;
            pStart = pTmp->next;
        }
    }
    

Anmelden zum Antworten