doppelt verkettete Liste



  • 😃
    Oder vor jedem Beitrag einen Text durchlesen lassen, wo der Unterschied zwischen C++ und C geklärt wird 🤡



  • Îhr seit ja alle soo lieb zu mir 😃

    AJ sei so lieb und walte mal deines Amtes und verschiebe den mal ebend ins C++ Eckchen



  • Immer doch gerne 😉



  • Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • So jetzt bin ich im C++ Eckchen gelandet .Ihr könnt mir dennoch helfen 🙂



  • 😕 wo liegt denn das Problem? Probier es doch mal mit Deadlefs' Variante?



  • Deadlef schrieb:

    @tobiasl: ja sicher, aber soo schwer ist die Überlegung doch auch nicht!
    Überall, wo du Elemente einfügst/löschst/umsortierst in deiner verketteten Liste musst du ja eh den Zeiger auf den Nachfolger anpassen. An gleicher Stelle muss dann natürlich auch der Vorgängerzeiger angepasst werden. In welcher Reihenfolge, das kannst Du dir zum besseren Verständnis mal selber herleiten. 🕶

    Soweit so gut, genrell habe ich das denke ich auch Verstanden, nur happert es bei der Umsetzung..

    ich habe also jetzt erst mal in meiner struct pPrev mit dabei. Sprich wenn mein zeiger auf Next zeigt muß er ja auch auf den Vorgänger zeigen richtig? 😕



  • Soo ich habe das mal Versucht.
    Soweit läuft das auch Fehlerfrei nur die Frage ist:
    Macht das so Sinn wie ich das gemacht habe?

    #include <malloc.h> 
    #include <stdio.h> 
    #include <conio.h> 
    #include <windows.h> 
    #include <string.h>
    
    struct strasse 
    { 
        char str[50]; 
        struct strasse* pNext; // Zeiger der auf das nächste Objekt zeigt
    	struct strasse* pPrev; // Zeiger der auf das vorige Objekt zeigt
        struct strasse* pTemp;
    }; 
    
    typedef struct strasse STRASSE; 
    typedef struct strasse* LPSTRASSE; 
    
    void main() 
    { 
        int i=0, P=0; 
        char buffer[50]; 
        LPSTRASSE pAnfang, pEnde, pNew, pAkt, pTemp;; 
    
        pNew = new STRASSE; 
        pAnfang=pEnde=pNew; 
        pNew->pPrev=NULL;
    	pNew->pNext=NULL;
    
        FILE *pf; 
    
        pf=fopen("strasse.txt","r"); // Öffnen der Datei
    
        if (pf == NULL) 
        { 
            //FEHLER 
            return; 
        } 
    
        while (fgets(buffer, sizeof(buffer), pf) != NULL) 
        { 
            strcpy(pNew->str, buffer); 
    
            pEnde->pPrev = pTemp;
    		pEnde->pNext = pNew; 
    		pTemp->pNext = pEnde;
            pNew->pNext = NULL; 
            pEnde = pNew;
            pNew = new STRASSE; 
            P++; 
        } 
    
        	printf("Bitte geben Sie den Suchbegriff ein : "); 
    		scanf("%s",buffer); 
    		printf("Ihre Eingabe lautet : %s\n",buffer); 
    
    		printf("Gefundene Ergebnisse:\n\n"); 
    
    		pAkt = pAnfang; 
    
        for(i=0;i<P;i++) 
        { 
            if (strstr(pAkt->str, buffer) != NULL) 
              printf("\t%s\n",pAkt->str); 
    
            pAkt = pAkt->pNext; 
        }
    
        fclose(pf); 
        fflush(stdin); 
        getch(); 
        system("cls"); 
    
        // den gesamten Speicher frei geben 
    
        pAkt = pAnfang->pNext; 
    
        for (i=0; i<P; i++) 
        { 
            delete pAnfang; 
    
            if (pAkt != NULL) 
            { 
                pAnfang = pAkt; 
                pAkt = pAkt->pNext; 
            } 
        }             
    }
    


  • Sieht schonmal ganz gut aus.
    Ich versuche mal zu korrigieren, wo es nicht ganz passt:

    while (fgets(buffer, sizeof(buffer), pf) != NULL) 
        { 
            strcpy(pNew->str, buffer); 
    
            pNew->pPrev = pEnde; //Vorgänger des Neuen ist das bisherige Ende
            pEnde->pNext = pNew; //Nachfolger des bisherigen Endes ist das Neue
            pEnde = pNew;
            pEnde->pNext = NULL; //Neues Ende hat noch keinen Nachfolger
            pNew = new STRASSE; 
            P++; 
        }
    

    Soweit ich das beurteilen kann brauchst Du pTemp überhaupt nicht.
    Ansonsten kann man das zwar noch eleganter lösen, aber <ohne Gewähr> das sollte funktionieren </ohne Gewähr>



  • stimmt ohne PTemp geht es auch!

    Scheint in der Tat zu klappen..

    Ich glaube es liegt daran, daß ich mich nie was traue und immer total verunsichert bin. war doch gar nicht so schwer wie ich dachte

    DANKE 🤡


Anmelden zum Antworten