Habe Problem bei der Liste



  • Hallo Leute! Habe Problem bei diesem Programm. Leider hängt sich das Programm beim Ausführen jedesmal auf. Vermutlich kommt es zu einem Überlauf... Kann mir jemand helfen?? Danke schon einmal im Voraus!!

    /*****************************************************************************
    *                                                                            *
    *  ------------------------------- dlist.c --------------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    #include <stdlib.h>
    #include <string.h>
    
    #include "dlist.h"
    
    /*****************************************************************************
    *                                                                            *
    *  ------------------------------ dlist_init ------------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    void dlist_init(DList *list, void (*destroy)(void *data)) {
    
    /*****************************************************************************
    *                                                                            *
    *  Initialize the list.                                                      *
    *                                                                            *
    *****************************************************************************/
    
    list->size = 0;
    list->destroy = destroy;
    list->head = NULL;
    list->tail = NULL;
    
    return;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ---------------------------- dlist_destroy -----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    void dlist_destroy(DList *list) {
    
    void               *data;
    
    /*****************************************************************************
    *                                                                            *
    *  Remove each element.                                                      *
    *                                                                            *
    *****************************************************************************/
    
    while (dlist_size(list) > 0) {
    
       if (dlist_remove(list, dlist_tail(list), (void **)&data) == 0 && list->
          destroy != NULL) {
    
          /***********************************************************************
          *                                                                      *
          *  Call a user-defined function to free dynamically allocated data.    *
          *                                                                      *
          ***********************************************************************/
    
          list->destroy(data);
    
       }
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  No operations are allowed now, but clear the structure as a precaution.   *
    *                                                                            *
    *****************************************************************************/
    
    memset(list, 0, sizeof(DList));
    
    return;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ---------------------------- dlist_ins_next ----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int dlist_ins_next(DList *list, DListElmt *element, const void *data) {
    
    DListElmt          *new_element;
    
    /*****************************************************************************
    *                                                                            *
    *  Do not allow a NULL element unless the list is empty.                     *
    *                                                                            *
    *****************************************************************************/
    
    if (element == NULL && dlist_size(list) != 0)
       return -1;
    
    /*****************************************************************************
    *                                                                            *
    *  Allocate storage for the element.                                         *
    *                                                                            *
    *****************************************************************************/
    
    if ((new_element = (DListElmt *)malloc(sizeof(DListElmt))) == NULL)
       return -1;
    
    /*****************************************************************************
    *                                                                            *
    *  Insert the new element into the list.                                     *
    *                                                                            *
    *****************************************************************************/
    
    new_element->data = (void *)data;
    
    if (dlist_size(list) == 0) {
    
       /**************************************************************************
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       *                                                                         *
       *  Handle insertion when the list is empty.                               *
       *                                                                         *
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       **************************************************************************/
    
    list->head = new_element;
    list->head->prev = NULL;
    list->head->next = NULL;
    list->tail = new_element;
    
       }
    
    else {
    
       /**************************************************************************
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       *                                                                         *
       *  Handle insertion when the list is not empty.                           *
       *                                                                         *
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       **************************************************************************/
    new_element->next = element; 
       new_element->prev = element->prev;
    
       if (element->prev == NULL)
          list->head = new_element;
       else
          element->prev->next = new_element;
    
       element->prev = new_element;
    }
    
    /*****************************************************************************
    *                                                                            *
    *  Adjust the size of the list to account for the inserted element.          *
    *                                                                            *
    *****************************************************************************/
    
    list->size++;
    
    return 0;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ---------------------------- dlist_ins_prev ----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int dlist_ins_prev(DList *list, DListElmt *element, const void *data) {
    
    DListElmt          *new_element;
    
    /*****************************************************************************
    *                                                                            *
    *  Do not allow a NULL element unless the list is empty.                     *
    *                                                                            *
    *****************************************************************************/
    
    if (element == NULL && dlist_size(list) != 0)
       return -1;
    
    /*****************************************************************************
    *                                                                            *
    *  Allocate storage to be managed by the abstract data type.                 *
    *                                                                            *
    *****************************************************************************/
    
    if ((new_element = (DListElmt *)malloc(sizeof(DListElmt))) == NULL)
       return -1;
    
    /*****************************************************************************
    *                                                                            *
    *  Insert the new element into the list.                                     *
    *                                                                            *
    *****************************************************************************/
    
    new_element->data = (void *)data;
    
    if (dlist_size(list) == 0) {
    
       /**************************************************************************
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       *                                                                         *
       *  Handle insertion when the list is empty.                               *
       *                                                                         *
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       **************************************************************************/
    
       list->head=new_element;
       list->head->prev = NULL;
       list->head->next = NULL;
       list->tail = new_element;
       }
       else {
    
       /**************************************************************************
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       *                                                                         *
       *  Handle insertion when the list is not empty.                           *
       *                                                                         *
    
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
       **************************************************************************/
    
       new_element->next = element;
       new_element->next = element->prev;
    
       if (element->prev == NULL)
          list->head = new_element;
       else
          element->prev->next = new_element;
    
       element->prev = new_element;
    }
    
    /*****************************************************************************
    *                                                                            *
    *  Adjust the size of the list to account for the new element.               *
    *                                                                            *
    *****************************************************************************/
    
    list->size++;
    
    return 0;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ----------------------------- dlist_remove -----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int dlist_remove(DList *list, DListElmt *element, void **data) {
    
    /*****************************************************************************
    *                                                                            *
    *  Do not allow a NULL element or removal from an empty list.                *
    *                                                                            *
    *****************************************************************************/
    
    if (element == NULL || dlist_size(list) == 0)
       return -1;
    
    /*****************************************************************************
    *                                                                            *
    *  Remove the element from the list.                                         *
    *                                                                            *
    *****************************************************************************/
    
    *data = element->data;
    
    if (element == list->head) {
    
       /**************************************************************************
       *                                                                         *
       *  Handle removal from the head of the list.                              *
       *                                                                         *
       **************************************************************************/
    
       list->head = element->next;
    
       if (list->head == NULL)
          list->tail = NULL;
       else
          element->next->prev = NULL;
    
       }
    
    else {
    
       /**************************************************************************
       *                                                                         *
       *  Handle removal from other than the head of the list.                   *
       *                                                                         *
       **************************************************************************/
    
       element->prev->next = element->next;
    
       if (element->next == NULL)
          list->tail = element->prev;
       else
          element->next->prev = element->prev;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  Free the storage allocated by the abstract data type.                     *
    *                                                                            *
    *****************************************************************************/
    
    free(element);
    
    /*****************************************************************************
    *                                                                            *
    *  Adjust the size of the list to account for the removed element.           *
    *                                                                            *
    *****************************************************************************/
    
    list->size--;
    
    return 0;
    
    }
    


  • Kannst du nicht erstmal ein bisschen debuggen und das Problem einschränken ? -.- Nicht soo viele werden Lust haben, sich hier durch 300+ Zeilen code durch zu lesen um IRGENDWO einen Fehler zu finden.



  • -capitano- schrieb:

    /*****************************************************************************
    *                                                                            *
    *  ------------------------------- dlist.c --------------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    #include <stdlib.h>
    #include <string.h>
    
    #include "dlist.h"
    
    /*****************************************************************************
    *                                                                            *
    *  ------------------------------ dlist_init ------------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    void dlist_init(DList *list, void (*destroy)(void *data))
    {
      list->size = 0;
      list->destroy = destroy;
      list->head = NULL;
      list->tail = NULL;
    
      return;
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ---------------------------- dlist_destroy -----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    void dlist_destroy(DList *list)
    {
      void               *data;
      while (dlist_size(list) > 0)
      {
        if (dlist_remove(list, dlist_tail(list), (void **)&data) == 0 && list->destroy != NULL)
        {
          list->destroy(data);
        }
      }
      memset(list, 0, sizeof(DList));
      return;
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ---------------------------- dlist_ins_next ----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int dlist_ins_next(DList *list, DListElmt *element, const void *data)
    {
      DListElmt          *new_element;
      if (element == NULL && dlist_size(list) != 0)
        return -1;
    
      if ((new_element = (DListElmt *)malloc(sizeof(DListElmt))) == NULL)
        return -1;
    
      new_element->data = (void *)data;
    
      if (dlist_size(list) == 0)
      {
        list->head = new_element;
        list->head->prev = NULL;
        list->head->next = NULL;
        list->tail = new_element;
      }
      else
      {
        new_element->next = element; 
        new_element->prev = element->prev;
        if (element->prev == NULL)
          list->head = new_element;
        else
          element->prev->next = new_element;
        element->prev = new_element;
      }
    
      list->size++;
    
      return 0;
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ---------------------------- dlist_ins_prev ----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int dlist_ins_prev(DList *list, DListElmt *element, const void *data)
    {
      DListElmt          *new_element;
      if (element == NULL && dlist_size(list) != 0)
        return -1;
    
      if ((new_element = (DListElmt *)malloc(sizeof(DListElmt))) == NULL)
        return -1;
      new_element->data = (void *)data;
    
      if (dlist_size(list) == 0)
      {
        list->head=new_element;
        list->head->prev = NULL;
        list->head->next = NULL;
        list->tail = new_element;
      }
      else
      {
        new_element->next = element;
        new_element->next = element->prev;
    
        if (element->prev == NULL)
          list->head = new_element;
        else
          element->prev->next = new_element;
        
        element->prev = new_element;
      }
      list->size++;
      return 0;
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ----------------------------- dlist_remove -----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int dlist_remove(DList *list, DListElmt *element, void **data)
    {
      if (element == NULL || dlist_size(list) == 0)
        return -1;
      *data = element->data;
    
      if (element == list->head)
      {
        list->head = element->next;
    
        if (list->head == NULL)
          list->tail = NULL;
        else
          element->next->prev = NULL;
      }
      else
      {
        element->prev->next = element->next;
    
        if (element->next == NULL)
          list->tail = element->prev;
        else
          element->next->prev = element->prev;
      }
      free(element);
      list->size--;
      return 0;
    }
    

    Auf den ersten Blick fällt mir daran nichts auf, abgesehen von einigen Stil-Fehlern (die Adresse eines void* noch nach void** zu casten ist unnötig) und einer miserablen Einrückung. Allerdings solltest du dazu auch die Definition der DList, die Anwendung dieser Funktionen und die Stelle, an der das Programm sich aufhängt, dazuliefern.
    Auf den zweiten Blick fällt auf, daß dlist_ins_next() das neue Element vor der angegebenen Position einfügt und dlist_ins_prev() den Vorgänger-Zeiger des neuen Elements nicht setzt.



  • Dlist.h sollte wohl, bis auf kleine Bennenungsunterschiede un das fehlende 'D' so wie dieses Snippet aussehen :

    #ifndef LIST_H
    #define LIST_H
    #include <stdio.h>
    
    typedef struct _ListElmt{
    
    void                *data;
    struct ListElmt     *next;
    
    } ListElmt;
    typedef struct _List{
    
    int                 size;
    int                 (*match)(const void *key1, const void *key2);
    void                (*destroy)(void *data);
    
    ListElmt             *head;
    ListElmt             *tail;
    
    } List;
    
    void list_init(List *list, void (*destroy)(void *data));
    
    void list_destroy(List *list);
    
    int list_ins_next(List *list, ListElmt *element, const void *data);
    
    int list_rem_next(List *list, ListElmt *element, void **data);
    
    int list_size(const List *list);
    
    ListElmt *list_head(const List *list);
    
    ListElmt *list_tail(const List *list);
    
    int list_is_head(const ListElmt *element);
    
    int list_is_tail(const ListElmt *element);
    
    void *list_data(const ListElmt *element);
    
    ListElmt *list_next(const ListElmt *element);
    


  • Ich gehe stark davon aus, dass der Fehler entweder zwischen Zeile 130-137 oder zwischen Zeile 150 und 159 liegen muss, da der Rest des Programms gegeben war...
    Danke schonmal!!


Anmelden zum Antworten