probleme mit Struktur bei listen



  • Hallo zusammen
    hab ein großes Problem bei meinen doppelt verketteten Listen
    ich hab jetzt ein Programm mit einer Struktur und ein paar Funktionen, das funktioniert reibunslos

    will ich nun das ganze Programm mit 2 Funktionen gestalten (müssen wir bei der Klausur leider machen) geht gar nichts mehr

    würde nun gerne wissen was ich falsche mache, bzw. gehe ich davon aus
    dass

    sich die globalen Variablen: ITEM* first; ITEM* last; int count;
    durch eine Struktur mit eben jenen Variablen ersetzen lassen

    CODE1 - mit 1 Struktur (funktioniert)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct list_item
    {
    	char name[100];
    	int size;
    	char path[200];
    	struct list_item *prev, *next;
    };
    
    typedef struct list_item ITEM;
    
    ITEM* first;
    ITEM* last;
    int count;
    
    ITEM* CreateItem(char* name, int size, char* path)
    {
    	ITEM* item = (ITEM*)malloc(sizeof(ITEM));
    	if(item==NULL)
    		return NULL;
    
    	if(count==0)
    	{
    		first = item;
    		last = item;
    		item->prev = item->next = NULL;
    
    	}
    
    	else
    	{
    		//4 Schritte to append
    		item->prev = last;
    		last = item;
    		item->prev->next = item;
    		item->next = NULL;
    
    	}
    
    	strcpy(item->name, name);
    	item->size = size;
    	strcpy(item->path, path);
    	count++;
    
    	return item;
    }
    
    void printList()
    {
    	ITEM* temp;
    	temp = first;
    
    	while(temp)
    	{	
    		printf("\n%s %d %s\n", temp->name, temp->size, temp->path);
    		temp = temp->next;
    	}
    }
    
    int main()
    {
    	count = 0;
    	char name[100];
    	char path[200];
    	int size = 0;
    
    	//Create Item
    	do
    	{
    			size++;
    			CreateItem("Test", size, "C:");
    
    	}
    	while(size<10);
    
    	printList();
    	printReverse();
    
    	return 0;
    }
    

    --------------------------
    CODE2 - 2 Strukturen (geht nicht)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct list_item
    {
    	char name[100];
    	int size;
    	struct list_item *prev;
    	struct list_item *next;
    };
    
    struct list_header
    {
    	int count;
    	struct list_item *first;
    	struct list_item *last;
    };
    
    typedef struct list_item ITEM;
    typedef struct list_header HEAD;
    
    HEAD* list;
    
    ITEM* CreateItem(char* name, int size)
    {
    	ITEM* item = (ITEM*)malloc(sizeof(ITEM));
    	if(item==NULL)
    		return NULL;
    
    	if(list->count==0)
    	{
    		list->first = item;
    		list->last = item;
    		item->prev = item->next = NULL;
    
    	}
    
    	else
    	{
    		//4 Schritte to append
    		item->prev = list->last;
    		list->last = item;
    		item->prev->next = item;
    		item->next = NULL;
    
    	}
    
    	strcpy(item->name, name);
    	item->size = size;
    	list->count++;
    
    	return item;
    }
    
    void printList()
    {
    	ITEM* temp;
    	temp = list->first;
    
    	while(temp)
    	{	
    		printf("\n%s %d\n", temp->name, temp->size);
    		temp = temp->next;
    	}
    }
    
    int main()
    {
    	char name[100];
    	int size = 0;
    	printf("%d", list->count);
    	list = NULL;
    	list->count = 0;
    	printf("%d", list->count);
    
    	do
    	{
    			size++;
    			CreateItem("Test", size);
    
    	}
    	while(size<10);
    
    	//printList();
    	//printReverse();
    
    	return 0;
    }
    

    ich freu mich über jede Hilfestellung, bin etwas verzweifelt
    dankeeee



  • list = NULL; 
    list->count = 0;
    

    Da kann ja nur ein "SegFault" bei raus kommen...

    Wenn du es gleichwertig zum oberen haben willst, dann solltest du keinen Zeiger als Liste benutzen:

    HEAD list;
    

    und dann entsprechend (in der 'main') initialisieren:

    list.count = 0;
    list.first = list.last = NULL;
    

    Wenn doch als Zeiger, dann entsprechend mit 'malloc' Speicher allozieren und am Ende wieder freigeben (das fehlt noch bei dir - auch in der ersten Version).



  • hallo Th69

    danke für deine Antwort

    das mit list->counter und list hab ich nur gemacht weil ich rum probiert habe ohne nach zu denken es war auch vorher schon SegmFault

    ps.: ohne Zeiger kann ichs auch nicht machen, weil unser Prüfer bereits so viel vorgibt (leider) dass da alles eingeschränkt ist

    demnach müssen wir mit HEAD* arbeiten 😡



  • printf("%d", list->count);
    

    Du rufst das in deiner main-Funktion auf - davor rufst du aber keine Funktionen auf um list zu initialisieren.

    EDIT: Mit Konsolenausgaben hättest du den Fehler gleich gefunden. Oder noch besser: Arbeite dich mal in einen Debugger ein.



  • da kann ich dir nicht zustimmen ich arbeite unter linux nur auf der konsole
    aber werd mir eh jetzt dann eclipse mal installieren

    ps.: hab das problem jetzt schon anders gelöst, jab einfach ne funktion zum initialisieren des headers geschrieben



  • AlexTJ schrieb:

    da kann ich dir nicht zustimmen ich arbeite unter linux nur auf der konsole

    Und? Ich verwende gdb, einen Konsolendebugger.

    AlexTJ schrieb:

    aber werd mir eh jetzt dann eclipse mal installieren

    Den Debugger da hab ich bisher noch nie zum laufen gebracht.


Log in to reply