Listenmodul



  • Hallo,
    ich wollte ein Listenmodul programmieren, habs auch getan und alles geht, bis auf meinen Sortieralgorithmus.
    List.h:

    #include <iostream>
    
    struct Knoten
    {
    	int value;
    	Knoten* next;
    	Knoten* prev;
    };
    
    bool sort(Knoten* head)
    {
    	if(head->prev)
    	{
    		if(head->value > head->prev->value)
    		{
    			head->prev->prev->next = head;
    			head->prev->next = head->next;
    			head->next->prev = head->prev;
    			head->next = head->next->prev;
    			head->prev->next = head;
    			sort(head);
    		}
    		return(true);
    	}
    }
    
    bool sortieren(Knoten* head)
    {
    	while(head->next->value)
    	{
    		std::cout << "Jupp" << std::endl;
    		if(head = head->next)
    		{
    			std::cout << "head = head->next;" << std::endl;
    			if(sort(head))
    			{
    				std::cout << "sort(head);" <<std::endl;
    			}
    		}
    	}
    	return(true);
    }
    
    bool push(Knoten* previous, Knoten* newknoten)
    {
    	newknoten->prev = previous;
    	newknoten->next = previous->next;
    	previous->next = newknoten;
    	return(true);
    }
    

    test.cpp

    #include "C:/Programme/Microsoft Visual Studio/MyProjects/LIBDAN/List/list.h"
    #include <iostream>
    void main()
    {
    	Knoten head, torpfen, drei, vier;
    	Knoten* lpKnoten;
    	torpfen.value = 12;
    	vier.value = 13;
    	drei.value = 15;
    	head.value = 19;
    	if(push(&head, &torpfen))
    	{
    		std::cout << "geht" <<std::endl;
    		if(push(&torpfen, &drei))
    		{
    			std::cout << "geht" << std::endl;
    			if(push(&drei, &vier))
    			{
    				std::cout << "geht" << std::endl;
    			}
    		}
    	}
    	lpKnoten = &head;
    	std::cout << lpKnoten->value << std::endl;
    	lpKnoten = lpKnoten->next;
    	std::cout << lpKnoten->value << std::endl;
    	lpKnoten = lpKnoten->next;
    	std::cout << lpKnoten->value << std::endl;
    	lpKnoten = lpKnoten->next;
    	std::cout << lpKnoten->value << std::endl;
    	if(sortieren(&head))
    	{
    		std::cout << "yuchuu!" << std::endl;
    	}
    }
    

    Das ergebnis sieht so aus:

    geht
    geht
    geht
    19 
    12
    15
    13
    

    Dann kommt ein Fehler, das Listtest.exe einen Fehler gefunden hat und abgebrochen werden muss ???

    thx
    Glamdring



  • Vielleicht solltest du next und prev mit NULL initialisieren.



  • Das hilft weiter zu kommen, die Ausgabe jetzt:

    geht
    geht 
    geht
    19  
    12 
    15 
    13
    Jupp
    head = head->next;
    

    und das selbe Fenster mit Fehler gefunden -> Programm beenden

    Gruß
    Glamdring



  • Ich habe das Ganze noch mal "überarbeitet", ich schreib am besten den ganzen Source:
    List.h

    #include <iostream>
    
    struct Knoten
    {
    	int value;
    	Knoten* next;
    	Knoten* prev;
    };
    
    bool init_Knoten(Knoten* head, int value)
    {
    	head->next = 0;
    	head->prev = 0;
    	head->value = value;
    	return(true);
    }
    
    bool sort(Knoten* head)
    {
    	if(head->prev->value)
    	{
    		std::cout << "geht: head->prev" << std::endl;
    		if(head->value > head->prev->value)
    		{
    			Knoten* eins;
    			Knoten* zwei;
    			Knoten* vier;
    			std::cout << "Knoten* eins, zwei, vier;" << std::endl;
    			eins = head->prev->prev;
    			zwei = head->prev;
    			vier = head->next;
    			eins->next = head;
    			head->prev = eins;
    			head->next = zwei;
    			zwei->prev = head;
    			zwei->next = vier;
    			vier->prev = zwei;
    			sort(head);
    			return(true);
    		}
    		else
    		{
    			std::cout << "geht nicht:: head->value" << std::endl;
    			return(true);
    		}
    	}
    	else
    	{
    		std::cout << "geht nicht : if(head->prev)" << std::endl;
    		return(true);
    	}
    }
    
    bool sortieren(Knoten* head)
    {
    	while(head->next->value)
    	{
    		std::cout << "Jupp" << std::endl;
    		if(head = head->next)
    		{
    			std::cout << "head = head->next;" << std::endl;
    			if(sort(head))
    			{
    				std::cout << "sort(head);" <<std::endl;
    			}
    			else
    			{
    				std::cout << "geht nicht: sort(head)" << endl;
    			}
    		}
    	}
    	return(true);
    }
    
    bool push(Knoten* previous, Knoten* newknoten)
    {
    	newknoten->prev = previous;
    	newknoten->next = previous->next;
    	previous->next = newknoten;
    	return(true);
    }
    

    Test.cpp:

    #include "C:/Programme/Microsoft Visual Studio/MyProjects/LIBDAN/List/list.h"
    #include <iostream>
    void main()
    {
    	Knoten head, torpfen, drei, vier;
    	Knoten* lpKnoten;
    	init_Knoten(&head, 15);
    	init_Knoten(&torpfen, 153);
    	init_Knoten(&drei, 19);
    	init_Knoten(&vier, 13);
    	if(push(&head, &torpfen))
    	{
    		std::cout << "geht" <<std::endl;
    		if(push(&torpfen, &drei))
    		{
    			std::cout << "geht" << std::endl;
    			if(push(&drei, &vier))
    			{
    				std::cout << "geht" << std::endl;
    			}
    		}
    	}
    	lpKnoten = &head;
    	std::cout << lpKnoten->value << std::endl;
    	lpKnoten = lpKnoten->next;
    	std::cout << lpKnoten->value << std::endl;
    	lpKnoten = lpKnoten->next;
    	std::cout << lpKnoten->value << std::endl;
    	lpKnoten = lpKnoten->next;
    	std::cout << lpKnoten->value << std::endl;
    	if(sortieren(&head))
    	{
    		std::cout << "yuchuu!" << std::endl;
    	}
    }
    

    Dabei bekomme ich folgende Ausgabe:

    geht
    geht
    geht
    15
    153
    19
    13
    Jupp
    head = head->next;
    

    Und dazu mal wieder die Fehlermeldung von wegen beedet werden, blabla.

    Eigentlich müsste aber sort (meiner Meinung nach) mindestens noch ein geht... oder geht nicht... ausgeben, tuts aber nicht???
    thx
    Glamdring


Anmelden zum Antworten