verkette Liste mit 2 struct



  • Moin. Ich öchte gerne mehere verkette listen in einem Pointer unterbringen. Und die Listen Elemente sollen auch noch verschieden sein.
    erste Frage bei einer Normalen Liste wird doch das erste Listen Element auf NULL gesetzt der Anfang wie mach ich das jetzt aber wenn ich in einem Pointer mehrere Listen Anfänge habe.
    Die andere Sache kann ich wenn ich 2 struct habe, in der Kist von dem einem strcut auf das andere zeigen(glaube ja weiß es aber nciht 100%.

    mfg



  • stell das mal bildlich dar bitte.



  • Bildlich oh ha.
    Ich versuch das nochmal besser zuerklären.
    Die Verkette Liste hat im ersten Element Name und Nachname und alle weiteren Elemente sollen z.B. Prüfungsergebnisse haben. So das man im ersten Element guckt wer ist das und in den weiteren Elementen was für Punkte er gemacht hat. z.B. Tore.
    So nun soll aber nicht nur eine Person aufgenommen werden sondern mehrere. Deswegen sollen alle ersten Elemente der Verketteten Listen in einem eind. Pointer gespeichert werden.

    Frage war ja nun wie speicher ich jeweils das erste Element der Listen. Habe schon eine "Normale verk. Liste" geschrieben und da habe ich den Start Pointer auf NULL gestzt. Aber wie mach ich das bei meheren Listen??

    Danke für die Antwort
    mfg



  • moep! falsch!

    so geht das richtig:

    struct person {
        struct person *next;
        char *vorname;
        char *nachname;
        struct zensur *zensuren;
    };
    
    struct zensur {
        struct zensur *next;
        int zenzur;
    };
    

    "eindeutiger pointer"... *sich-beherrschen-muss" schlag dir den begriff aus dem kopf.



  • Also wenn ich eine neue Person eingeben will muß ich person *next erweitern.
    Und wenn ich ein ein Elmenet einer Kette anhängen will muß ich mit * Zensur weiter machen.

    sehe ich das richtig??



  • neue person: zu letzter person durchhangeln (->next) und dieser das next verbiegen (neue struct person anlegen etc..., drauf zeigen lassen).

    neue punktzahl: durch personen durchhangeln bis man seine person gefunden hat, dann bis ans ende durch person->zensuren durchhangeln, dort das next verbiegen (neues struct zensur etc..., drauf zeigen lassen).

    du musst nochmal das kapitel ueber zeiger durchlesen. deine beschreibung im letzten post ist nicht entzifferbar.



  • Frido1982 schrieb:

    Frage war ja nun wie speicher ich jeweils das erste Element der Listen. Habe schon eine "Normale verk. Liste" geschrieben und da habe ich den Start Pointer auf NULL gestzt. Aber wie mach ich das bei meheren Listen??

    du machst einfach für jede liste einen eigenen 'start' pointer und wenn du listenelemente von einer liste zur anderen transferieren willst, geht das etwa so:

    AddHead(&list1, RemoveTail(&list2));
    

    verschiebt das listenelement vom ende von list2 an den anfang von list1.



  • Moin. Ich habe doch so meine Problem mit der Aufgabe. Die "einfache" Liste hab ich ja schon. Könnt ihr mir mit der erweiterung bitte helfen.

    Das hier ist meine Liste. Hab ein Problem für den neuen Listeanfang. Könnt ihr mir jier ein bischen helfen?

    # include <stdio.h>
    # include <conio.h>
    # include <stdlib.h>
    # include <string.h>
    # include <windows.h>
    
    typedef struct Person {				//Struktur wird definiert
    
    	char name[21];
    	char vorname[21];
    	char Matrikelnr[21];
    	int  Position_Person;
    	struct Person *next;
    	struct Pruefung *Pruefung;
    } Person_t;
    
    typedef struct Pruefung{
    	char  Fach[21];
    	char  Prof[21];
    	char  Datum[10];
    	int   Punkte;
    	int   Position_Pruefung;
    	struct Pruefung *next;
    }Pruefung_t;
    
    void	einfuegen		(Person_t);
    void	ausgabe			();
    void	speichern		(void);
    int 	suchen			(char Vorname[],char Nachname[]);
    void    Pruefung		(Person_t, Pruefung_t);
    
    Person_t *start = NULL;
    
    int main (void) {
    
    	FILE *Datei;
    	Person_t Person;
    	char Vorname[20],Nachname[20], auswahl;
    	int Abbruch = 1;
    
    	Datei = fopen ("liste.bin","rb");
    	if (!Datei){
    		printf ("Datei nicht vorhanden. Neue wird angelegt.\n");
    		Datei = fopen ("liste.bin","wb");
    		if(!Datei){
    			printf("Es konnte keine Datei angelegt werden."
    				   "Programm wird beendet.\n");
    			return EXIT_FAILURE;
    		}
    	}	
    	while (fread(&Person, sizeof(Person_t), 1, Datei) == 1)
    		einfuegen(Person);
    
    	fclose(Datei);
    
    	do{
    		printf("[1] Neue Student\n");
    		printf("[2] -------------\n");
    		printf("[3] Person suchen\n");
    		printf("[4] Liste zeigen\n");
    		printf("[5] ------------\n");
    		printf("[6] Ende\n");
    
    		printf("Eingabe = ");
    		fflush(stdin);
    		scanf("%i",&auswahl);
    
    		switch(auswahl){
    		case 1:                                
    			fflush(stdin);
    			printf ("Nachnamen: ");
    			gets(Person.name);
    
    			fflush(stdin);
    			printf ("Vorname: ");
    			gets(Person.vorname);
    
    			fflush(stdin);
    			printf ("Matrikelnr: ");
    			gets(Person.Matrikelnr);
    
    			einfuegen (Person);
    
    			ausgabe();
    			break;
    		case 2:		
    			break;
    		case 3:
    			system("cls");
    			fflush(stdin);
    			printf ("Welche Person soll gesucht werden?\n"
    					"Geben Sie Namen und Vornamen an.\n");
    			printf("Namen: ");
    			scanf ("%s",&Nachname);
    			fflush(stdin);
    			printf("Vorname: ");
    			scanf("%s",&Vorname);
    			suchen (Vorname,Nachname);
    			break;
    		case 4:
    			printf("\n\nDie Liste wird ausgegeben.\n");
    			ausgabe();
    			break;
    		case 5:		
    			break;
    		case 6:
    			Abbruch--;
    			break;
    		default:
    			printf("Sie haben ne FALSCHE eingabe gemacht.\n");
    			printf("Widerholen Sie.\n");
    		}
    		speichern();
    	}while(Abbruch == 1);
    		return EXIT_SUCCESS;
    }
    
    int suchen(char Vorname[],char Nachname[]){
    
    	Person_t *ptr;
    
    	if (start == NULL){                                  
    		printf("Liste leer!\n");
    		return EXIT_FAILURE;
    	}
    	ptr = start;	
    	while((ptr != NULL) && (strcmp(ptr->name, Nachname) || strcmp(ptr->vorname, Vorname ) != 0)) 
    		ptr = ptr->next;	
    	if (ptr == NULL){                                        
    		printf("Zu aktualisierender Name nicht vorhanden!\n");
    		return EXIT_FAILURE;
    	}	
    	printf("\nNachname: %s\n",ptr->name);
    	printf("Vorname:  %s\n", ptr->vorname);
    	printf("Matrikelnr:  %s\n",ptr->Matrikelnr);
    	return EXIT_SUCCESS;
    }
    
    void ausgabe (){
    
    	Person_t *ptr = start;
    	int k=0;
    
    	system("cls");
    	printf("*********************************************\n");
    	while (ptr != NULL) {   
    		printf("\nNachname: %s\n",ptr->name);
    		printf("Vorname:  %s\n", ptr->vorname);
    		printf("Matrikelnr:  %s\n",ptr->Matrikelnr);
    		ptr = ptr->next;
    	}
    	printf("*********************************************\n\n");
    }
    
    void	einfuegen	(Person_t Person){
    
    	Person_t *pLL , *pLL_vorher;
    
    	if (start == NULL) 
    	{																
    		start = (Person_t * ) malloc ( sizeof(Person_t) );			
    		strcpy(start->name,			Person.name);						
    		strcpy(start->vorname,		Person.vorname);				
    		strcpy(start->Matrikelnr,	Person.Matrikelnr);
    		start->next = NULL;
    	}
    	else
    	{
    		pLL = start;
    		while ( (pLL != NULL) && (strcmp(pLL->name, Person.name) < 0) )
    			pLL = pLL->next;
    		if (pLL == start) {
    			start = (Person_t*) malloc ( sizeof(Person_t) );			
    			strcpy(start->name,			Person.name);					
    			strcpy(start->vorname,		Person.vorname);				
    			strcpy(start->Matrikelnr,	Person.Matrikelnr);
    
    			start->next = pLL;											
    		}
    		else{															
    			pLL_vorher = start;
    			while ( pLL_vorher->next != pLL )
    			pLL_vorher = pLL_vorher->next;
    			pLL = (Person_t*) malloc ( sizeof(Person_t) );			
    			strcpy(pLL->name,			Person.name);					
    			strcpy(pLL->vorname,		Person.vorname);				
    			strcpy(pLL->Matrikelnr,		Person.Matrikelnr);
    			pLL->next = pLL_vorher->next;								
    			pLL_vorher->next = pLL;									
    
    		}
    	}
    }
    
    void speichern (void) {
    
    	FILE *Datei;
    	Person_t * zeiger = start,Person;
    
    	Datei = fopen("liste.bin", "wb");	
    	for (zeiger = start; zeiger != NULL; zeiger = zeiger->next)
    		fwrite(zeiger, sizeof(Person_t), 1, Datei);
    
    	fclose(Datei);
    }
    


  • Frido1982 schrieb:

    Könnt ihr mir mit der erweiterung bitte helfen.

    du hängst an die ganzen funktionen, suchen, ausgabe, einfügen, löschen, speichern usw. einen weiteren parameter dran (vom typ Person_t**). das muss ein ** sein, weil eine liste schon ein Person_t* ist und du musst den inhalt des pointers ja auch manchmal verändern. dann legst du dir beliebig viele 'starts' (für jede liste einen) an und gibst deren adresse immer an die funktionen mit. damit arbeiten die funktionen immer mit der liste die du angibst...


Anmelden zum Antworten