Problem mit Listen



  • Hallo Leute,
    also ich habe eine Aufgabe in C gestellt bekommen (von der Uni). Bin eigtl. ein routinierter Java-Programmierer aber hier komme ich einfach nicht weiter.
    Und zwar haben wir eine Liste vorgegeben. Diese Liste ist mit Automarken gefüllt. Die Aufgabe ist es nun, dass beim Löschen der Liste sowohl die Automarke als auch der Speicherplatz ausgegeben wird und anschließend der Speicher freigegeben wird.

    Die Funktion sieht bisher so aus:

    void free_brand_name()
    {   
    
        ListElmt  *element;
    	char        *data; 
    	ListElmt *old_element;
    
    	data=element->next->data;
        fprintf(stdout, "Geloeschtes Element: %s im Speicher %d\n",data,element);
        old_element = element->next;
        free(old_element);
    
    }
    

    Und hierzu die main:

    int main(int argc, char **argv) 
    {        
    	List    	list;    
    	ListElmt	*element;
    	char	*data;
    
    	fprintf(stdout, "Initialisieren der Liste\n");    
    	list_init(&list, free_brand_name); 	// NULL Ersetzen durch eingene Funktion in Teil 2   
    
    	char *chrysler_ptr;
        chrysler_ptr=(char*)malloc(sizeof(chrysler_ptr));
        strcpy(chrysler_ptr,"CHRYSLER");
    
    	fprintf(stdout, "Einfuegen '%s' als head\n", chrysler_ptr);    // Anpassenin Teil 1
    	if (list_ins_next(&list, NULL, chrysler_ptr) != 0)        
    		return 1;
    
        char *bmw_ptr;
        bmw_ptr=(char*)malloc(sizeof(bmw_ptr));
        strcpy(bmw_ptr,"BMW");
    
        fprintf(stdout, "Einfuegen '%s' als head\n", bmw_ptr);	    // Anpassen in Teil 2
    	if (list_ins_next(&list,NULL, bmw_ptr) != 0)		
            return 1;    
    	char *audi_ptr;
        audi_ptr=(char*)malloc(sizeof(audi_ptr));
        strcpy(audi_ptr,"AUDI");
    
    	fprintf(stdout, "Einfuegen '%s' als head\n", audi_ptr);   	    // Anpassen in Teil 1    
    	if (list_ins_next(&list, NULL, audi_ptr) != 0)        
    		return 1;    
    
    	fprintf(stdout, "Ausgabe der Liste.\n");    	
        print_list(&list);
        //free_brand_name();
    	// Kopf ist Audi    
    	fprintf(stdout, "Kopf der Liste, ");    
    	element = list_head(&list);    
    	fprintf(stdout, "Element ist: '%s' \n", list_data(element));        
    
    	// Element danach ist BMW    
    	fprintf(stdout, "Naechstes Element in der Liste, ");    
    	element = list_next(element);    
    	fprintf(stdout, "Element ist: '%s' \n", list_data(element));  
    
        char *bugatti_ptr;
        bugatti_ptr=(char*)malloc(sizeof(bugatti_ptr));
        strcpy(bugatti_ptr,"BUGATTI");      
    
    	fprintf(stdout, "Einfuegen '%s' nach '%s'\n", bugatti_ptr, list_data(element));    
    	if (list_ins_next(&list, element, bugatti_ptr) != 0)      // Anpassen in Teil 1  
    		return 1;    
    	print_list(&list);
    
    	element = list_head(&list);    
    	fprintf(stdout, "Loeschen nach Element '%s', ",list_data(element));
    	if (list_rem_next(&list, element, (void **) &data) != 0)        
    		return 1;  	
        fprintf(stdout, "Geloescht wurde: %s und %d\n", data,element);      
    	fprintf(stdout, "Loeschen der Liste\n");
        list_destroy(&list); 
        system("PAUSE");
    	return 0;    
    }
    

    Die print_list funktion hab ich hier nicht mehr mit rein (unnötig vorerst). Dazu gibt es noch eine list.h und eine list.c. Falls ihr die noch braucht Bescheid sagen.
    Zu dem was ich rausgefunden hab:
    Also das Problem beim Löschen der Liste ist, dass die Automarke nicht ausgegeben werden kann da sie in diesem moment ja gelöscht wird. Somit müsste man die Automarken vor dem löschen speichern und dann um eins nach vorne verschieben damit diese zum Speicher passen.
    Ich hoffe ihr habt eine Idee für mich, denn ich verzweifel hier gerade 😞
    Gruß Fabian



  • Wo bekommt die Funktion free_brand_name denn die Parameter her?

    Für Zeiger ist bei printf der %p Specifier vorgesehen.

    Zeiger sind keine Integer.
    Integer sind keine Zeiger.

    Und nimm bitte für deinen Code die cpp Tags bzw. den C\C++ Button. Dann wird der Text sogar farbig und bunt.



  • Hey....danke für deine Antwort. Ich poste jetzt einfach mal den gesamten Code...hoffe das das nicht zu viel ist.
    Datei 1 (im endeffekt die Main)

    int main(int argc, char **argv) 
    {        
    	List    	list;    
    	ListElmt	*element;
    	char	*data;
    
    	fprintf(stdout, "Initialisieren der Liste\n");    
    	list_init(&list, free_brand_name); 	// NULL Ersetzen durch eingene Funktion in Teil 2   
    
    	char *chrysler_ptr;
        chrysler_ptr=(char*)malloc(sizeof(chrysler_ptr));
        strcpy(chrysler_ptr,"CHRYSLER");
    
    	fprintf(stdout, "Einfuegen '%s' als head\n", chrysler_ptr);    // Anpassenin Teil 1
    	if (list_ins_next(&list, NULL, chrysler_ptr) != 0)        
    		return 1;
    
        char *bmw_ptr;
        bmw_ptr=(char*)malloc(sizeof(bmw_ptr));
        strcpy(bmw_ptr,"BMW");
    
        fprintf(stdout, "Einfuegen '%s' als head\n", bmw_ptr);	    // Anpassen in Teil 2
    	if (list_ins_next(&list,NULL, bmw_ptr) != 0)		
            return 1;    
    	char *audi_ptr;
        audi_ptr=(char*)malloc(sizeof(audi_ptr));
        strcpy(audi_ptr,"AUDI");
    
    	fprintf(stdout, "Einfuegen '%s' als head\n", audi_ptr);   	    // Anpassen in Teil 1    
    	if (list_ins_next(&list, NULL, audi_ptr) != 0)        
    		return 1;    
    
    	fprintf(stdout, "Ausgabe der Liste.\n");    	
        print_list(&list);
        //free_brand_name();
    	// Kopf ist Audi    
    	fprintf(stdout, "Kopf der Liste, ");    
    	element = list_head(&list);    
    	fprintf(stdout, "Element ist: '%s' \n", list_data(element));        
    
    	// Element danach ist BMW    
    	fprintf(stdout, "Naechstes Element in der Liste, ");    
    	element = list_next(element);    
    	fprintf(stdout, "Element ist: '%s' \n", list_data(element));  
    
        char *bugatti_ptr;
        bugatti_ptr=(char*)malloc(sizeof(bugatti_ptr));
        strcpy(bugatti_ptr,"BUGATTI");      
    
    	fprintf(stdout, "Einfuegen '%s' nach '%s'\n", bugatti_ptr, list_data(element));    
    	if (list_ins_next(&list, element, bugatti_ptr) != 0)      // Anpassen in Teil 1  
    		return 1;    
    	print_list(&list);
    
    	element = list_head(&list);    
    	fprintf(stdout, "Loeschen nach Element '%s', ",list_data(element));
    	if (list_rem_next(&list, element, (void **) &data) != 0)        
    		return 1;  	
        fprintf(stdout, "Geloescht wurde: %s und %d\n", data,element);      
    	fprintf(stdout, "Loeschen der Liste\n");
        list_destroy(&list); 
        system("PAUSE");
    	return 0;    
    }
    

    Die list.h

    /*****************************************************************************
    *                                                                            *
    *  -------------------------------- list.h --------------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    #ifndef LIST_H
    #define LIST_H
    
    #include <stdlib.h>
    
    /*****************************************************************************
    *                                                                            *
    *  Define a structure for linked list elements.                              *
    *                                                                            *
    *****************************************************************************/
    
    typedef struct ListElmt_ {
    
    void               *data;
    struct ListElmt_   *next;
    
    } ListElmt;
    
    /*****************************************************************************
    *                                                                            *
    *  Define a structure for linked lists.                                      *
    *                                                                            *
    *****************************************************************************/
    
    typedef struct List_ {
    
    int                size;
    
    void               (*destroy)(void *data);
    
    ListElmt           *head;
    ListElmt           *tail;
    
    } List;
    
    /*****************************************************************************
    *                                                                            *
    *  --------------------------- Public Interface ---------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    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);
    
    #define list_size(list) ((list)->size)
    
    #define list_head(list) ((list)->head)
    
    #define list_tail(list) ((list)->tail)
    
    #define list_is_head(list, element) ((element) == (list)->head ? 1 : 0)
    
    #define list_is_tail(element) ((element)->next == NULL ? 1 : 0)
    
    #define list_data(element) ((element)->data)
    
    #define list_next(element) ((element)->next)
    
    #endif
    

    Und die list.c

    /*****************************************************************************
    *                                                                            *
    *  -------------------------------- list.c --------------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    #include <stdlib.h>
    #include <string.h>
    
    #include "list.h"
    
    /*****************************************************************************
    *                                                                            *
    *  ------------------------------- list_init ------------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    void list_init(List *list, void (*destroy)(void *data)) {
    
    /*****************************************************************************
    *                                                                            *
    *  Initialize the list.                                                      *
    *                                                                            *
    *****************************************************************************/
    
    list->size = 0;
    list->destroy = destroy;
    list->head = NULL;
    list->tail = NULL;
    
    return;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ----------------------------- list_destroy -----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    void list_destroy(List *list) {
    
    void               *data;
    
    /*****************************************************************************
    *                                                                            *
    *  Remove each element.                                                      *
    *                                                                            *
    *****************************************************************************/
    
    while (list_size(list) > 0) {
    
       if (list_rem_next(list, NULL, (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(List));
    
    return;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ----------------------------- list_ins_next ----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int list_ins_next(List *list, ListElmt *element, const void *data) {
    
    ListElmt           *new_element;
    
    /*****************************************************************************
    *                                                                            *
    *  Allocate storage for the element.                                         *
    *                                                                            *
    *****************************************************************************/
    
    if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL)
       return -1;
    
    /*****************************************************************************
    *                                                                            *
    *  Insert the element into the list.                                         *
    *                                                                            *
    *****************************************************************************/
    
    new_element->data = (void *)data;
    
    if (element == NULL) {
    
       /**************************************************************************
       *                                                                         *
       *  Handle insertion at the head of the list.                              *
       *                                                                         *
       **************************************************************************/
    
       if (list_size(list) == 0)
          list->tail = new_element;
    
       new_element->next = list->head;
       list->head = new_element;
    
       }
    
    else {
    
       /**************************************************************************
       *                                                                         *
       *  Handle insertion somewhere other than at the head.                     *
       *                                                                         *
       **************************************************************************/
    
       if (element->next == NULL)
          list->tail = new_element;
    
       new_element->next = element->next;
       element->next = new_element;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  Adjust the size of the list to account for the inserted element.          *
    *                                                                            *
    *****************************************************************************/
    
    list->size++;
    
    return 0;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  ----------------------------- list_rem_next ----------------------------  *
    *                                                                            *
    *****************************************************************************/
    
    int list_rem_next(List *list, ListElmt *element, void **data) {
    
    ListElmt           *old_element;
    
    /*****************************************************************************
    *                                                                            *
    *  Do not allow removal from an empty list.                                  *
    *                                                                            *
    *****************************************************************************/
    
    if (list_size(list) == 0)
       return -1;
    
    /*****************************************************************************
    *                                                                            *
    *  Remove the element from the list.                                         *
    *                                                                            *
    *****************************************************************************/
    
    if (element == NULL) {
    
       /**************************************************************************
       *                                                                         *
       *  Handle removal from the head of the list.                              *
       *                                                                         *
       **************************************************************************/
    
       *data = list->head->data;
       old_element = list->head;
       list->head = list->head->next;
    
       if (list_size(list) == 0)
          list->tail = NULL;
    
       }
    
    else {
    
       /**************************************************************************
       *                                                                         *
       *  Handle removal from somewhere other than the head.                     *
       *                                                                         *
       **************************************************************************/
    
       if (element->next == NULL)
          return -1;
    
       *data = element->next->data;
       old_element = element->next;
       element->next = element->next->next;
    
       if (element->next == NULL)
          list->tail = element;
    
    }
    
    /*****************************************************************************
    *                                                                            *
    *  Free the storage allocated by the abstract data type.                     *
    *                                                                            *
    *****************************************************************************/
    
    free(old_element);
    
    /*****************************************************************************
    *                                                                            *
    *  Adjust the size of the list to account for the removed element.           *
    *                                                                            *
    *****************************************************************************/
    
    list->size--;
    
    return 0;
    
    }
    

    Es soll wie gesagt über die Funktion free_brand_name() einfach nur die Automarke und der Speicherplatz ausgegeben werden. Thats it.
    Gruß Fabian



  • GastUser1234 schrieb:

    Es soll wie gesagt über die Funktion free_brand_name() einfach nur die Automarke und der Speicherplatz ausgegeben werden. Thats it.
    Gruß Fabian

    Ich nehme an die sollst du schreiben und du hast keine Vorgaben dafür?

    Du musst der Funktion zumindest die Liste und die Marke mitteilen.
    Hach, dafür ist sicher der Parameter void *data da.

    free_brand_name wird an list_init als Funktionszeiger übergeben und dann über list_destroy aufgerufen.

    Du solltest die die Aufgabe nochmal genauer ansehen.



  • Nice danke ich habs. Tja....gezwungene Aufgaben aus der Uni macht niemand gern...danke nochmal für deine Hilfe 🙂


Anmelden zum Antworten