Einfache Verkettungen



  • Hallo Leute,

    wie lassen sich den am besten einfache Verkettungen
    mit Pointern in C realisieren?

    Grüße


  • Mod

    struct element
    {
     struct element *next;
     // Nutzdaten
    };
    


  • Verkettungen schrieb:

    Hallo Leute,

    wie lassen sich den am besten einfache Verkettungen in C realisieren?

    Grüße

    Verkettungen schrieb:

    mit Pointern


  • Mod

    DrakoXP schrieb:

    Verkettungen schrieb:

    Hallo Leute,

    wie lassen sich den am besten einfache Verkettungen in C realisieren?

    Grüße

    Verkettungen schrieb:

    mit Pointern

    Exakt(!) diese Antwort wollte ich zuallererst auch geben 🙂 .



  • Die hilfreichere Antwort (und das ist ja Sinn der Sache, zu helfen)
    wäre gewesen: Mit Structs, so wie es SepJ in seinem ersten Post getan hat.

    Das man Pointer benötigt ist ja wohl klar und schrieb ich selbst.

    Also Danke SepJ 😉


  • Mod

    C-Verzweifler schrieb:

    Die hilfreichere Antwort (und das ist ja Sinn der Sache, zu helfen)
    wäre gewesen: Mit Structs, so wie es SepJ in seinem ersten Post getan hat.

    Das man Pointer benötigt ist ja wohl klar und schrieb ich selbst.

    Also Danke SepJ 😉

    Der Witz kommt daher, dass du durch deine etwas unglückliche Wortwahl den Eindruck erweckt hast, als würdest du nicht verkettete Listen suchen, sondern einfache Verknüpfungen (eben Pointer). Daher hatten ich, DrakoXP und sicherlich noch andere, die gleiche doofe Idee.



  • Dann hab ich jetzt mal das hier gebastelt:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
    	int data;
    	struct node* next;
    };
    
    void append(struct node *list, int data)
    {
    	struct node *new_node;
    	new_node = malloc(sizeof(*new_node));
    	new_node->data = data;
    
    	struct node *temp;
    	temp = malloc(sizeof(*temp));
    	temp = list->next;
    
    	list->next = new_node;
    	new_node->next = temp;
    }
    
    void print_list(struct node *list)
    {
    	struct node *temp;
    	temp = list;
    
    	printf("%d\n", temp->data);
    
    	while(temp->next != NULL)
    	{
    		temp = temp->next;
    		printf("%d\n", temp->data);
    	}
    }
    
    int main(void)
    {
    	struct node *list;
    
    	append(list, 1);
    	append(list, 2);
    	append(list, 3);
    
    	print_list(list);
    	return EXIT_SUCCESS;
    }
    

    Allerdings scheint es nicht zu funktionieren, da die cmd abschmirt.
    Hab ich irgendwo was übersehen? ^^


  • Mod

    Dies geht gleich an mehreren Stellen schief:
    1. Dein list in main zeigt auf nix. Wenn du dann in append in Zeile 19 den Zeiger dereferenzierst, explodiert dein Computer.
    2. Selbst wenn das append funktionieren würde, dann würde der Zeiger list in der main durch das append nicht geändert, da in append eine Kopie von list gemacht wird. Derzeit änderst du den Zeiger selber zwar noch nicht, aber höchstwahrscheinlich wirst du dies in der verbesserten Version tun wollen.
    3. In der Ausgabefunktion prüfst du zwar auf ein Ende bei NULL, dieser Endwert wird aber weder in main noch in append gesetzt.

    Lösung:
    Zieh das mit der NULL für das Ende konsequent durch. Initialisier deinen Wurzelzeiger in main mit NULL, in der Appendfunktion musst du das Ende ebenfalls richtig behandeln.



  • Danke 😉

    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
    	int data;
    	struct node* next;
    };
    
    void append(struct node *list, int data)
    {
    	struct node *new_node;
    	new_node = malloc(sizeof(*new_node));
    	new_node->data = data;
    
    	struct node *temp;
    	temp = malloc(sizeof(*temp));
    	temp = list->next;
    
    	list->next = new_node;
    	new_node->next = temp;
    }
    
    void print_list(struct node *list)
    {
    	struct node *temp;
    	temp = list;
    
    	while(temp->next != NULL)
    	{
    		temp = temp->next;
    		printf("%d\n", temp->data);
    	}
    }
    
    int main(void)
    {
    	struct node *list = malloc(sizeof(*list));
    	list->data = 0;
    	list->next = NULL;
    
    	append(list, 1);
    	append(list, 2);
    	append(list, 3);
    
    	print_list(list);
    	return EXIT_SUCCESS;
    }
    


  • Mit insert_before und insert_after:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
    	int data;
    	struct node* next;
    };
    
    void insert_before(struct node *list, int data)
    {
    	struct node *new_node;
    	new_node = malloc(sizeof(*new_node));
    	new_node->data = data;
    
    	struct node *temp;
    	temp = malloc(sizeof(*temp));
    	temp = list->next;
    
    	list->next = new_node;
    	new_node->next = temp;
    }
    
    void insert_after(struct node *list, int data)
    {
    	struct node *new_node;
    	new_node = malloc(sizeof(*new_node));
    	new_node->data = data;
    
    	while(list->next != NULL)
    	{
    		list = list->next;
    	}
    
    	list->next = new_node;
    	new_node->next = NULL;
    }
    
    void print_list(struct node *list)
    {
    	struct node *temp;
    	temp = list;
    
    	while(temp->next != NULL)
    	{
    		temp = temp->next;
    		printf("%d\n", temp->data);
    	}
    }
    
    int main(void)
    {
    	struct node *list = malloc(sizeof(*list));
    	list->data = 0;
    	list->next = NULL;
    
    	insert_before(list, 1);
    	insert_before(list, 2);
    	insert_before(list, 3);
    	insert_after(list, 2);
    	insert_after(list, 3);
    
    	print_list(list);
    	return EXIT_SUCCESS;
    }
    

  • Mod

    Wenn du es jetzt noch hin bekommst, das leere Dummyelement los zu werden, dann bin auch ich glücklich mit der Lösung.


Anmelden zum Antworten