#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct datum{
              int tag;
              int monat;
              int jahr;
             };

struct angestellt{
                  char name[20];
                  char vorname[20];
                  struct datum alter;
                  struct datum eingest;
                  long gehalt;
                  struct angestellt *next;
                 };

 struct angestellt *next = NULL;
 struct angestellt *anfang=NULL;

/*Wir hängen einen Datensatz an oder geben eine neuen ein
n=name,v=vornam,at=alter.tage,am=alter.monat,aj=alter.jahr
eint=eigestellt tag,einm=eingestellt monat,einj=eingest. jahr
g=gehalt*/

void anhaengen(char n[],char v[],int at,int am,int aj,
int eint,int einm,int einj,long g)
{
/*Zeiger zum Zugriff auf die einzelnen Elemente der Struktur*/
 struct angestellt *zeiger;

/*Wir fragen ab ob es schon ein Element in der List gibt. Wir
suchen das Element auf dem unser Zeiger *anfang zeigt.
Falls *anfang immer noch auf NULL zeigt bekommt *anfang die
Adresse unseres 1.Elementes und ist somit der Kopf (Anfang)
unserer Liste*/
 if(anfang == NULL)
  {
/*Wir reservieren Speicherplatzt für unser Struktur für das
erste Element der Liste*/
   if((anfang =(struct angestellt *)malloc(sizeof(struct angestellt))) == NULL)
     fprintf(stderr,"Kein Speicherplatzt vorhanden für anfang\n");
   strcpy(anfang->name,n);
   strcpy(anfang->vorname,v);
   anfang->alter.tag=at;
   anfang->alter.monat=am;
   anfang->alter.jahr=aj;
   anfang->eingest.tag=eint;
   anfang->eingest.monat=einm;
   anfang->eingest.jahr=einj;
   anfang->gehalt=g;

/*Somit haben wir unseren Anfang der Liste. Von nun an zeigt
der Zeiger anfang immer auf das Element vor ihm. Da dies
aber jetzt das 1.Element der Liste war zeigt der Zeiger
anfang auf den Zeiger next. next zeigt am Ende immer wieder
NULL*/
   anfang->next=NULL;
  }

/*Es scheint schon mindestens 1.Element in der Liste vorhanden
zu sein da der Anfang nicht == NULL ist. Jetzt suchen wir
so lange nach dem nächsten Element bis der *next - Zeiger
auf NULL zeigt. Somit haben wir das Ende der Liste gefunden
und können einen neuen Datensatz anhängen*/
 else
  {
   zeiger=anfang; //Wir zeigen auf das 1.Element
   while(zeiger->next != NULL)
      zeiger=zeiger->next;

/*Wir reservieren einen Speicherplatz für das letzte Element
der Liste und hängen es an.*/
   if((zeiger->next =(struct angestellt *) malloc(sizeof(struct angestellt))) == NULL)
      fprintf(stderr,"Kein Speicherplatz für letztes Element\n");

   zeiger=zeiger->next; //zeiger auf neuen Speicherplatz
   strcpy(zeiger->name,n);
   strcpy(zeiger->vorname,v);
   zeiger->alter.tag=at;
   zeiger->alter.monat=am;
   zeiger->alter.jahr=aj;
   zeiger->eingest.tag=eint;
   zeiger->eingest.monat=einm;
   zeiger->eingest.jahr=einj;
   zeiger->gehalt=g;
   zeiger->next=NULL; //Wir terminieren wieder unsere Datenstruktur
  }
}

/*Funktion zum löschen einer Datei*/
void loesche(char wen[])
{
 struct angestellt *zeiger ,*zeiger1;

/*Ist überhaupt ein Element vorhanden?*/
 if(anfang != NULL)
  {
/*Ist unser 1.Element das von uns gesuchte (wen[]) ?*/
   if(strcmp(anfang->name,wen) == 0)
    {
     zeiger=anfang->next;
     free(anfang);
     anfang=zeiger;
    }
   else
    {
/*Es ist nicht das 1.Element zu löschen. Wir suchen in
der weiteren Kette ob das zu löschende Element vor-
handen ist*/
     zeiger=anfang;
     while(zeiger->next != NULL)
       {
        zeiger1=zeiger->next;
/*Ist die Adresse von zeiger1 der gesuchte Namen?*/
        if(strcmp(zeiger1->name,wen) == 0)
          {
/*Falls ja dann.....*/
            zeiger->next=zeiger1->next;
            free(zeiger1);
            break;
          }
         zeiger=zeiger1;
        }//Ende while
      }//Ende else
  }//Ende if(anfang != NULL)
 else
   printf("Es sind keine Daten zum löschen vorhanden!!!\n");
}

/*Funktion zum Ausgeben der Dateien*/
void ausgabe()
{
 struct angestellt *zeiger;
 zeiger=anfang;

 printf("||=======================================================||\n");
 printf("|%10cName%10c |Geburtsdatum|Eingestellt|Gehalt|\n",' ',' ');
 printf("||=======================================================||\n");

 while(zeiger != NULL)
  {
   printf("|%12s,%-12s| %02d.%02d.%04d| %02d.%02d.%04d|%06ld|\n",
   zeiger->name,zeiger->vorname,zeiger->alter.tag,
   zeiger->alter.monat,zeiger->alter.jahr,zeiger->eingest.tag,
   zeiger->eingest.monat,zeiger->eingest.jahr,zeiger->gehalt);
   printf("|---------------------------------------------------------|\n");

   zeiger=zeiger->next;
  }
}



/*Funktion zur Eingabe der Daten*/
void eingabe()
{
 char nam[20],vorn[20];
 int atag,amon,ajahr,eintag,einmon,einjahr;
 long gehalt;
 fflush(stdin);
 printf("Name........................: ");
 gets(nam);
 printf("Vorname.....................: ");
 gets(vorn);
 printf("Alter...........(tt.mm.jjjj): ");
 scanf("%d.%d.%d",&atag,&amon,&ajahr);
 printf("Eingestellt am..(tt.mm.jjjj): ");
 scanf("%d.%d.%d",&eintag,&einmon,&einjahr);
 printf("Monatsgehalt................: ");
 scanf("%ld",&gehalt);

 anhaengen(nam,vorn,atag,amon,ajahr,eintag,einmon,einjahr,gehalt);
}


int main()
{
 int wahl;
 char dname[20];

 do{
      printf("1 : Eingabe\n");
      printf("2 : Ausgabe\n");
      printf("3 : Namen löschen\n");

      printf("9 : Ende\n");
      printf("Ihre Wahl : ");
      scanf("%d",&wahl);
      switch(wahl)
       {
        case 1 : eingabe();
                 break;
        case 2 : ausgabe();
                 break;
        case 3 : printf("Welchen Namen wollen sie löschen : ");
                 scanf("%s",dname);
                 loesche(dname);
                 break;
        case 9 : break;
        default: printf("Falsche Eingabe!!!\n");
       }
     }while(wahl != 9);

 return 0;
}