Verktette Liste und NULL



  • Hallo,

    ehrlich gesagt konnte ich folgenden Code nur durch Ausprobieren und weniger durch Verständnis funktionsfähig machen. Es handelt sich hierbei um eine einfach verkettete Liste mit zwei Knoten. Einer Wurzel und einem Element, die als Werte jeweils char* Werte haben.

    Für die Methode "eintragen" gibt es zwei Versionen, wobei die auskommentierte nicht funktionsfähig ist.

    if(hilfe == NULL) {
     hilfe = element;
    

    funktioniert bei der auskommentierten Version nicht, doch ich verstehe nicht warum?
    Es müsste doch equivalent sein zur nicht auskommentierten Version:

    if(hilfe->nachfolger == NULL) {
      hilfe->nachfolger = element;
    

    Hier der komplette Code:

    #include <stdlib.h>
    
    typedef struct Node {
       char* value;
       struct Node* nachfolger;
     } node;
    
    node* neuerKnoten(char*);
    void eintragen(node*, node*);
    void ausgeben(node*);
    
    int main(){
       char* eintrag1 = "Eintrag1";
       char* eintrag2 = "Eintrag2";
       node* wurzel = neuerKnoten(eintrag1);
       node* element = neuerKnoten(eintrag2);
       eintragen(wurzel, element); //element als Nachfolger von wurzel eintragen
       ausgeben(wurzel); //verkettete Liste ausgeben.
    
       return 0;
    }
    
    void ausgeben(node* knoten) {
       while(knoten != NULL) {
    	 printf("%s\n",knoten->value);
    	 knoten = knoten->nachfolger;
       }
    
    }
    
    node* neuerKnoten(char* value){
      node* neu = malloc(sizeof(node));
      neu->value = value;
      neu->nachfolger = NULL;
      return neu;
    }
    
    void eintragen(node* wurzel, node* element) {
      node* hilfe = wurzel;
    
      for(;;){
    	if(hilfe->nachfolger == NULL) {
    		hilfe->nachfolger = element;
    		break;
    	}
    	hilfe = hilfe->nachfolger;
      }
    }
    
    /*
    void eintragen(node* wurzel, node* element) {
      node* hilfe = wurzel;
    
       for(;;) {
         if(hilfe == NULL) {
            hilfe = element; //frei? dann eintragen.
            break;
         }
    
         hilfe = hilfe->nachfolger;
       }
    } */
    

    Für Erklärungen vielen Dank im voraus!



  • In dem auskommentierten änderst du über nichts an der Liste, sondern nur die lokale variable hilfe die aber wieder zerstört wird nach dem Block.


Anmelden zum Antworten