Einfach bzw. doppelt verkettete Listen



  • Servus mitnander,

    ich bräuchte euren Beistand bei folgendem Problem.
    Ich kann in meinem Programm Personen mittels struct eingeben und
    extern auf Festplatte (binär) abspeichern. Nun zu meiner Frage.

    Wie euch sicher bekannt ist, wird bei Listen ein Zeiger innerhalb
    des structs angelegt, der dann anschließend auf das nächste
    Listenelement zeigt. Das funktioniert auch alles ganz gut, aber
    wenn ich nun auf die vorhergehenden Listen "zeigen" möchte, funktioniert
    das alles irgendwie nicht. Das einzige was ich weiß ist, dass ich nun
    auch einen Zeiger innerhalb des structs benötige, der auf das vorher-
    gehende Element zeige.

    Nun weiß ich net so recht wie ich dem prevList-Zeiger beibringen kann
    auf die vorhergehende Liste zu zeigen.

    Das ganze soll dazu dienen, im Programm durch die einzelnen Listen-
    elemente durchblättern zu können.

    Ich hoffe ich konnte mein Problem so einigermaßen vernünftig beschreiben.
    Vielen Dank für eure Hilfe.

    GiJoe



  • In dem Moment, wo du ein Element in die Liste einhängst, mußt du natürlich auch alle Zeiger umbiegen - und den Vorgänger-Zeiger des neuen Elements auf die Position, hinter der du einfügen willst:

    //schematisch
    void insert_element(List_el* pos,int value)
    {
      List_el* tmp = malloc(sizeof(List_el));
      tmp->value = value;
      tmp->next = pos->next;
      tmp->prev = pos;
      pos->next->prev = tmp;
      pos->next = tmp;
    }
    

    (zur Not zeichne es dir auf)



  • leider kann ich mit deiner Version nicht so viel anfangen. Tja, so ist das halt wenn man Dinge versucht von denen man keine Ahnung hat. Ich hab hier mal den Code angehängt. Hier funktioniert das browsen durch die Datenbank mittels '.' nach rechts allerdings sollte man auch nach links bzw. zurück "blättern" können. Bitte um Hilfe und vielen Dank.

    #include "stdafx.h"
    
    struct sPerson
    {
    	char name[60];
    	char stadt[60];
    	sPerson *nextList;
    	sPerson *prevList;
    };
    
    sPerson *firstElement = NULL;
    
    sPerson * inputPerson ()
    {
    	sPerson *person = (sPerson*) malloc(sizeof(sPerson));
    	printf("\nName........: ");
    	fgets(person->name, 60, stdin);
    	printf("Stadt.......: ");
    	fgets(person->stadt, 60, stdin);
    
    	return person;
    }
    
    void appendList(sPerson *useInput)
    {
    	useInput->nextList = NULL;
    	if (firstElement == NULL)
    	{
    		firstElement = useInput;
    	}
    	else 
    	{
    		sPerson *search = firstElement;
    		if (strcmp(useInput->name, firstElement->name) < 0)	
    		{
    			useInput->nextList = firstElement;	
    			firstElement = useInput;	
    		}
    		else 
    		{
    			while (true)
    			{
    				if(search->nextList == NULL) 
    				{
    					search->nextList = useInput;
    					break;
    				}
    				else if (strcmp(search->name, useInput->name) <= 0 && strcmp(search->nextList->name, useInput->name) > 0)
    				{
    					useInput->nextList = search->nextList;	
    					search->nextList = useInput;	
    					break;
    				}
    				else
    					search = search->nextList;
    			}
    		}
    	}
    }
    
    int printList()
    {
    	sPerson *search = firstElement;
    	int index = 1;
    	system("cls");
    	for(search = firstElement; search!=NULL; search=search->nextList)
    	{
    		printf("\n%d.\tName......: %s", index, search->name);
    		printf("\tStadt.....: %s", search->stadt);
    		index++;
    	}
    	return index;
    }
    
    void deleteList()
    {
    	sPerson *search;
    	sPerson *temp;
    	for (search = firstElement, temp = firstElement; temp!=NULL; search=temp)
    	{
    		temp = search->nextList;
    		free (search);
    	}
    	firstElement = NULL;
    }
    
    int saveToBase ()
    {
    	FILE *fp;
    	fp = fopen ("D:\\AzuBi\\Uebung\\Uebung\\AdressDatabase.bin", "wb");
    	sPerson *search;
    	int count = 0;
    	for (search = firstElement; search!=NULL; search=search->nextList)
    	{
    		fwrite(search, sizeof(sPerson), 1 ,fp);
    		count++;
    	}
    	fclose (fp);
    	return count;
    }
    
    int readDatabase()
    {
    	FILE *fp;
    	fp = fopen ("D:\\AzuBi\\Uebung\\Uebung\\AdressDatabase.bin", "rb");
    	fseek(fp, 0, SEEK_END);
    	int filelength = ftell(fp);
    	fseek(fp, 0, SEEK_SET);
    	int count;
    
    	deleteList();
    
    	for (count=0; count<filelength/sizeof(sPerson); count++)
    	{
    		sPerson *search = (sPerson*) malloc (sizeof(sPerson));
    		fread (search, sizeof(sPerson), 1, fp);
    		appendList(search);
    	}
    	fclose(fp);
    	return count;
    }
    
    void deleteElement()
    {
    	int index = 1;
    	int select = 0;
    	int printReturn = 0;
    	sPerson *delptr, *search;
    
    	printReturn = printList();
    	printf("\nWelcher Index soll geloescht werden? ");
    	scanf("%d", &select);
    
    	delptr = firstElement;
    	search = firstElement;
    	if (select > 0 && select < printReturn)
    	{
    		while (delptr != NULL)
    		{
    			if (select == 1)
    			{
    				firstElement=delptr->nextList;
    				free(delptr);
    				break;
    			}
    			if (index == select-1)
    			{
    				search = delptr->nextList;
    				delptr->nextList = search->nextList;
    				free(search);
    				break;
    			}
    			delptr=delptr->nextList;
    			index++;
    		}
    
    		printList();
    		printf("Weiter mit beliebiger Taste\n");
    		_getch();
    	}
    }
    
    void browseRight()
    {
    	static sPerson *select = firstElement;
    
    	printf("Name..........: %s", select->name);
    	printf("Stadt.........: %s", select->stadt);
    
    	if (select->nextList == NULL)
    	{
    		select = firstElement;
    	} 
    	else
    	{
    		select = select->nextList;
    	}
    }
    
    void Menu()
    {
    	sPerson *saveInput;
    	char checkInput = 0;
    	int index = 0;
    	int count = 0;
    
    	do
    	{
    		system("cls");
    		printf("Datenbankverwaltung\n");
    		printf("===================\n\n");
    
    		printf("-------------------------------------------------------------------------\n");
    		printf("Waehlen Sie aus:\n (N) Neue Person hinzufuegen\t (P) Liste ausgeben\n (X) Liste komplett loeschen\t (S) Liste in Datenbank speichern\n (L) Liste aus Datenbank laden\t (D) Element aus Liste loeschen\n (E) Ende\n");
    		printf("-------------------------------------------------------------------------\n");
    
    		//readDatabase();
    
    		checkInput = getch();
    		switch(checkInput)
    		{
    			case 'N':
    			case 'n':
    				saveInput = inputPerson();
    				appendList(saveInput);
    				break;
    			case 'P':
    			case 'p':
    				if (firstElement == NULL)
    				{
    					printf("\nListe leer!\nDruecken Sie eine beliebige Taste um fortzufahren");
    					getch();
    					break;
    				}
    				else
    					index = printList();
    					printf("Weiter mit beliebiger Taste\n");
    					getch();
    					break;
    			case 'X':
    			case 'x':
    				if (firstElement == NULL)
    				{
    					printf("\nListe leer!\nDruecken Sie eine beliebige Taste um fortzufahren");
    					getch();
    				}
    				else
    					deleteList();
    					break;
    			case 'S':
    			case 's':
    				if (firstElement == NULL)
    				{
    					printf("\nListe leer!\nDruecken Sie eine beliebige Taste um fortzufahren");
    					getch();
    				}
    				else
    					count = saveToBase();
    					if (count <= 1)
    					{
    						printf("%d Datensatz gespeichert.\n", count);
    						printf("Weiter mit beliebiger Taste");
    					}
    					else
    					{
    						printf("%d Datensaetze gespeichert.\n", count);
    						printf("Weiter mit belibiger Taste");
    					}
    					getch();
    					break;
    			case 'L':
    			case 'l':
    				count = 0;
    				count = readDatabase();
    				if (count <= 1)
    				{
    					printf("Es wurde %d Datensatz geladen.\n", count);
    					printf("Weiter mit beliebiger Taste");
    					getch();
    					break;
    				}
    				else
    				{
    					printf("Es wurden %d Datensaetze geladen:\n", count);
    					printf("Weiter mit beliebiger Taste");
    					getch();
    					break;
    				}
    			case 'D':
    			case 'd':
    				deleteElement();
    				break;
    			case ',':
    				if (firstElement == NULL)
    				{
    					printf("\nListe leer!\nDruecken Sie eine beliebige Taste um fortzufahren");
    					getch();
    					break;
    				}
    				else
    				{
    					//browseLeft();
    					break;
    				}
    			case '.':
    				if (firstElement == NULL)
    				{
    					printf("\nListe leer!\nDruecken Sie eine beliebige Taste um fortzufahren");
    					getch();
    					break;
    				}
    				else
    				{
    					browseRight();
    					break;
    				}
    		}
    	} while (checkInput != 'E' && checkInput != 'e');
    }
    
    int main(void) 
    {
    	Menu();
    	return 0;
    }
    


  • hier mal der Code um den es sich dreht

    void appendList(sPerson *useInput)
    {
    	sPerson *nextPointer = firstElement;
    	useInput->nextList = NULL;
    
    	if (firstElement == NULL)
    	{
    		firstElement = useInput;
    	}
    	else 
    	{
    		if (strcmp(useInput->name, firstElement->name) < 0)	
    		{
    			useInput->nextList = firstElement;
    			firstElement = useInput;
    		}
    		else
    		{
    			while (true)
    			{
    				if(nextPointer->nextList == NULL) 
    				{
    					nextPointer->nextList = useInput;
    					break;
    				}
    				else if (strcmp(nextPointer->name, useInput->name) <= 0 && strcmp(nextPointer->nextList->name, useInput->name) > 0)
    				{
    					useInput->nextList = nextPointer->nextList;	
    					nextPointer->nextList = useInput;	
    					break;
    				}
    				else
    				{
    					nextPointer = nextPointer->nextList;
    				}
    			}
    		}
    	}
    }
    

    Hier muss irgendwie der prevList mit rein. Ich weiß leider nicht wie. Bitte um Hilfe. Vielen Dank.


Anmelden zum Antworten