einfach verkettete Liste



  • Hallo,

    das folgende Programm stammt angeblich aus einem Einstellungstest. Nun ging es darum ein oder mehrere Fehler darin zu finden. Ich markiere einfach mal die Funktionen in dehnen die Fehler stecken sollen mit //Fehler. Vielleicht kann mir einer sagen was konkret an diesen Funktionen falsch sein soll. Des weiteren ist mir die Zeile typedef struct _NODE NODE, *PNODE; nicht ganz klar. Für ne kurze Erklärung dieser Zeile wäre ich dankbar.

    also vorab schonmal vielen Danke

    #include <stdio.h>
    #include <stdlib.h>
    
    /*
    Die folgende Deklaration repraesentiert Elemente einer
    einfach verketteten Liste.
    */
    
      typedef struct _NODE NODE, *PNODE;     // Fehler
      struct _NODE {                         // Fehler
        int Value;
        PNODE NextNode;
      };
    
    /*
    Eine iterative C-Funktion i_anzelem, welche die Anzahl der in
    einer Liste enthaltenen Elemente ermittelt.
    Die Funktion i_anzelem liefert einen int-Wert zurueck.
    i_anzelem erhaelt als Parameter einen Zeiger auf den Listenanfang.
    */
    
      int i_anzelem(PNODE FirstNodeInList)
      {
        int anz = 0;
    
        while(FirstNodeInList != NULL) {
          anz++;
          FirstNodeInList = FirstNodeInList->NextNode;
        }
    
        return anz;
      }
    
    /*
    Eine zu i_anzelem aequivalente rekursive C-Funktion r_anzelem,
    welche die Anzahl der in einer Liste enthaltenen Elemente ermittelt.
    r_anzelem darf natuerlich keine Schleife verwenden.
    */
    
      int r_anzelem(PNODE FirstNodeInList)
      {
        if(FirstNodeInList == NULL)
          return 0;
        else
          return 1 + r_anzelem(FirstNodeInList->NextNode);
      }
    
    void
    add_front(PNODE *FirstNodeInList, int Key)
    {
      PNODE tmp = (PNODE)malloc(sizeof(NODE));
    
      if (tmp == NULL)
        perror("out of memory");
      tmp->Value = Key;
      tmp->NextNode = *FirstNodeInList;
      *FirstNodeInList = tmp;
    }
    
    void
    delete_front(PNODE *FirstNodeInList)
    {
      PNODE tmp;
    
      if (FirstNodeInList == NULL)
        perror("list is empty");
      else {
        tmp = *FirstNodeInList;
        *FirstNodeInList = (*FirstNodeInList)->NextNode;
        free((void*)tmp);
      }
    }
    
    void
    print_list(PNODE FirstNodeInList)
    {
      while(FirstNodeInList != NULL)
      {
        printf("%d\t", FirstNodeInList->Value);
        FirstNodeInList = FirstNodeInList->NextNode;
      }
      printf("\n");
    }
    
    PNODE
    NewNode(int Value)
    {
      PNODE tmp;
    
      tmp = (PNODE)malloc(sizeof(NODE));
      if (tmp == NULL)
        perror("out of memory");
      tmp->Value = Value;
      tmp->NextNode = NULL;
    
      return tmp;
    }
    
    PNODE                                      // Fehler
    InsertNodeInSortedSinglyLinkedList(                
      PNODE FirstNodeInList,
      PNODE NewNode)
    {
      PNODE NodeInList = FirstNodeInList;
      PNODE PreviousNode = NULL;
    
      while(NodeInList->Value <= NewNode->Value){
        PreviousNode = NodeInList;
        NodeInList = NodeInList->NextNode;
      }
    
      PreviousNode->NextNode = NewNode;
      NewNode->NextNode = NodeInList;
    
      return FirstNodeInList;
    }
    
    int
    main()
    {
      PNODE list = NULL;
    
      printf("i_anzelem(NULL) == %d\n", i_anzelem(list));
      printf("r_anzelem(NULL) == %d\n", r_anzelem(list));
    
      add_front(&list, 5);
      add_front(&list, 4);
      add_front(&list, 3);
      add_front(&list, 2);
      add_front(&list, 1);
      print_list(list);
    
      printf("i_anzelem(list) == %d\n", i_anzelem(list));
      printf("r_anzelem(list) == %d\n", r_anzelem(list));
    
      delete_front(&list);
      delete_front(&list);
      print_list(list);
      printf("i_anzelem(list) == %d\n", i_anzelem(list));
      printf("r_anzelem(list) == %d\n", r_anzelem(list));
    
      list = NULL;
      list = InsertNodeInSortedSinglyLinkedList(list, NewNode(50));
      print_list(list);
      list = InsertNodeInSortedSinglyLinkedList(list, NewNode(30));
      print_list(list);
      list = InsertNodeInSortedSinglyLinkedList(list, NewNode(40));
      print_list(list);
      list = InsertNodeInSortedSinglyLinkedList(list, NewNode(45));
      print_list(list);
      list = InsertNodeInSortedSinglyLinkedList(list, NewNode(40));
      print_list(list);
      list = InsertNodeInSortedSinglyLinkedList(list, NewNode(60));
      print_list(list);
      list = InsertNodeInSortedSinglyLinkedList(list, NewNode(3));
      print_list(list);
    
      return 0;
    }
    


  • typedef struct _NODE NODE, *PNODE;
    

    ich nehm an hier ist gemeint:

    typedef struct _NODE NODE;
    typedef struct *_NODE PNODE;
    
    ...
      PNODE PreviousNode = NULL;
    
      while(NodeInList->Value <= NewNode->Value){
        PreviousNode = NodeInList;
        NodeInList = NodeInList->NextNode;
      }
    
      PreviousNode->NextNode = NewNode;
    ...
    

    angenommen das erste element in der liste ist kleiner als das neue element, dann geht er in die schleife nicht rein.
    macht dann also:

    ...
      PNODE PreviousNode = NULL;
      PreviousNode->NextNode = NewNode;
    ...
    

    und das hat undefiniertes verhalten.


Anmelden zum Antworten