Verkettung einer Liste ändern? (Zeigeränderungsproblem)



  • Hallo....ich habe eine verkettete Liste, die eingegebene Zahlen aufnimmt und später diese Zahlen 0 aufwärts sortieren soll. (z.b. 0 1 2 3).

    Dies hatte beim überschreiben der einzelnen KnotenValues auch geklappt. Nun soll ich aber nicht die Werte ändern, sondern die Verkettung.
    Bekomme bei diesem Code aber immer ein Fehler. Nach Eingabe der Zahlen wird nur noch ein Eingabezeichen blinkend angezeigt und das Programm ist "abgestürzt".

    Code (Problem bei der Sortierung ganz unten in der SortList() Funktion):

    #include <iostream>
    using std::cin;
    using std::cout;
    
    // ListenKnotenstruktur
    struct ListNode
    {
    	int iValue;
    	ListNode *pNext;
    };
    
    // Funktionen deklarieren
    // Vorne Einfügen
    ListNode *AddListFront(ListNode *l, int value);
    // Liste Anzeigen
    void ShowList(ListNode *l);
    // Liste sortieren
    void SortList(ListNode *l);
    
    // main-Funktion
    int main()
    {
    	// Startzeiger der auf den 1.Listenknoten oder auf NULL ( bei leerer Liste) zeigt
    	ListNode *Liste = NULL;
    
    	int zahl=0;
    	// Zahlen hinzufügen
    	cin >> zahl;
    	Liste = AddListFront(Liste,zahl);
    	cin >> zahl;
    	Liste = AddListFront(Liste,zahl);
    	cin >> zahl;
    	Liste = AddListFront(Liste,zahl);
    	cin >> zahl;
    	Liste = AddListFront(Liste,zahl);
    	cin >> zahl;
    	Liste = AddListFront(Liste,zahl);
    	cin >> zahl;
    	Liste = AddListFront(Liste,zahl);
    	cin >> zahl;
    	Liste = AddListFront(Liste,zahl);
    
    	// Liste Sortieren
    	SortList(Liste);
    
    	// Liste anzeigen
    	ShowList(Liste);
    }
    
    // Funktionen
    // Vorne Einfügen
    ListNode *AddListFront(ListNode *l, int value)
    {
    	// Knoten erzeugen
    	ListNode *p;
    	p = (ListNode *) malloc(sizeof(ListNode));
    
    	// Werte zuweisen
    	p->iValue = value;
    	// Zeiger zuweisen
    	p->pNext = l;
    
    	l = p;
    
    	return l;
    }
    // Liste Anzeigen
    void ShowList (ListNode *l)
    {
    	cout << "\nDie Liste:\n";
    	while ( l!=NULL )
    	{
    		cout << l->iValue << ' ';
    		l = l->pNext;
    	}
    	cout << '\n';
    }
    // Liste sortieren
    void SortList(ListNode *l)
    {
    	ListNode *l2=l;
    	ListNode *pHelp;
    	int data=0;
    	int i=0;
    
    	// Anzahl Listenelemente zählen
    	while ( l2!=NULL )
    	{
    		i++;
    		l2=l2->pNext;
    	}
    
    	// l2 wiederherstellen
    	l2=l;
    
    	// Sortierung
    	for (int index=0;index<i;index++)
    	{
    		l2=l;
    /*Problemstart*/ while ( (l2->pNext!=NULL) && (l2->pNext->pNext!=NULL) )
    		{
    			if ( (l2->pNext->iValue) > (l2->pNext->pNext->iValue) )
    			{
    				pHelp = l2->pNext;
    				l2->pNext = l2->pNext->pNext;
    				l2->pNext->pNext = l2->pNext->pNext->pNext;;
    				l2->pNext->pNext->pNext = pHelp;				
    			}
    			l2 = l2->pNext;
    		}
    	}
    }
    


  • Mal abgeshen davon, dass du da C++ machst (zumindest teilweise) und dein SortList durchaus auch das erste Element umsortieren sollte, wird dein Problem beim verbiegen der Zeiger sein.
    Nimm mal mehr Hilfszeiger (wie pHelp). Denn beim l2->pNext = l2->pNext->pNext; verbiegst du schon die Reihenfolge

    pHelp = l2->pNext;
                    l2->pNext = l2->pNext->pNext; // pNext zeigt jetzt auf das übernächst Element
                    l2->pNext->pNext = l2->pNext->pNext->pNext; // Das überübernächste Element zeigt jetzt auf ....
                    l2->pNext->pNext->pNext = pHelp;
    

    Nimm einen Debugger oder gib mal die Werte deiner Knoten zum Test nach jeder Tauschaktion aus

    printf("l2 : %d | next1 : %d | next2 : %d\n", l2->iValue, l2->pNext->iValue, l2->pNext->pNext->iValue);
    

    Die Reihenfolge der Werte darf sich ändern, aber nicht die Werte.


Anmelden zum Antworten