ArchivVorführaufgaben08

Verkettete Listen

Vorführaufgabe 08 · C

  • Datei: vorfuehraufgabe08.c
  • Stand:
  • Umfang: 160 Zeilen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Tperson
{
	char	name[20];
	int		groesse;  //in cm
	int		gebdat;   //jahrmonattag -> z.B.: 20020815
	struct Tperson *next;
};

void append_element(struct Tperson **anker,struct Tperson *element)
{
	struct Tperson *liste;
	liste=*anker;

	if(liste)
	{
		while (liste->next)
    		liste=liste->next;

		liste->next   = element;
		element->next = NULL;
	}
	else
	{
		*anker=element;
	}
}

struct Tperson *person_eingeben(void)
{
	struct Tperson *merker;
	char gebdat[10],newgebdat[9]="00000000";
	int position=0;
	
	merker = (struct Tperson*)malloc(sizeof(struct Tperson));
	
	printf("Name          : ");
	scanf("%s",&(merker->name));
	printf("Groesse       : ");
	scanf("%d",&(merker->groesse));
	printf("Geburtsdatum  : ");
	scanf("%s",gebdat);
	
	strncpy(newgebdat+0,gebdat+6,4);
	strncpy(newgebdat+4,gebdat+3,2);
	strncpy(newgebdat+6,gebdat+0,2);

	merker->gebdat=atoi(newgebdat);

	merker->next=NULL;
	return merker;
}

struct Tperson *copy_person(struct Tperson *person)
{
	struct Tperson *newperson;
	newperson = (struct Tperson*)malloc(sizeof(struct Tperson));
   *newperson =*person;
    return newperson;
}

void insert_person(struct Tperson **anker,struct Tperson *person)
{
	person->next=*anker;
	*anker=person;
}

int compare_groesse(struct Tperson *p1, struct Tperson *p2)
{
	if (p1->groesse < p2->groesse)
	{
		return 1;
	}
	else return 0;
}

int compare_alter(struct Tperson *p1, struct Tperson *p2)
{
	if (p1->gebdat > p2->gebdat)
	{
		return 1;
	}
	else return 0;
}

struct Tperson *sort(struct Tperson *liste, int (*compare)(struct Tperson*, struct Tperson*))
{
	struct Tperson *sortlist=NULL,**aktuell=NULL;

	if(liste)
	{
		insert_person(&sortlist, copy_person(liste));
		liste=liste->next;
	}
	while(liste)
	{
		aktuell=&sortlist;
		while(*aktuell && compare(*aktuell, liste))
		{
			aktuell=&((*aktuell)->next);
		}
		insert_person(aktuell, copy_person(liste));
		liste=liste->next;
	}
	return sortlist;
}

void liste_ausgeben(struct Tperson *liste)
{
	while(liste)
	{
		printf("Name: %s \t Groesse: %d \t Geb.Dat.: %d\n",liste->name,liste->groesse,liste->gebdat);
		liste=liste->next;
	}
}

void personen_intervall(struct Tperson *liste)
{
	int obere,untere,zaehler=0;

	printf("\nObere und Untere Grenze eingeben:");
	scanf("%d %d",&obere,&untere);

	while(liste)
	{
		if((liste->groesse<=obere) && (liste->groesse>=untere))
			zaehler++;
		liste=liste->next;
	}
	printf("\nAnzahl der zutreffenden Personen = %d\n\n",zaehler);
}

int main(void)
{
	struct Tperson *Kartei=NULL,*nach_gr,*nach_alter;

	do{

		append_element(&Kartei,person_eingeben());
		printf("\nWeiter machen?");

	}while(getchar(),getchar()!='n');

	liste_ausgeben(Kartei);

	nach_gr		= sort(Kartei, compare_groesse);
	nach_alter	= sort(Kartei, compare_alter);

	printf("\n-------------Nach Groesse-------------\n\n");
	liste_ausgeben(nach_gr);

	printf("\n--------------Nach Alter--------------\n\n");
	liste_ausgeben(nach_alter);

	personen_intervall(Kartei);
	return 0;
}