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;
}