#include<stdio.h>
#include<string.h>


struct telephon {

  char *nachname;
  char *vorname;
  int telnr;
};



struct liste {

  struct telephon person;
  struct liste *rest;
};


struct liste eing[100];
int anzahl = 0;
struct liste *anfang = NULL;
struct liste such[1];

int eing_kleiner ( struct telephon *q, struct telephon *w );


void einfuegen ( struct liste *neu ) {

  if (anfang == NULL || eing_kleiner ( &neu->person, &anfang->person ) ) {

    neu->rest = anfang;
    anfang = neu;
  }

  else {

    struct liste *ptr = anfang;
    while ( ptr->rest != NULL && eing_kleiner (&ptr->rest->person, &neu->person) )
      ptr = ptr->rest;
    neu->rest = ptr->rest;
    ptr->rest = neu;
  }
}


int eing_kleiner ( struct telephon *q, struct telephon *w ) {

  int c = strcmp( q->nachname, w->nachname );
  if ( c < 0 ) return 1;
  if (c == 0 && strcmp ( q->vorname, w->vorname) < 0 ) return 1;
  return 0;
}


void drucke_teilnehmer ( struct telephon *anm ) {

  printf("\t\tName: %s, %s\n", anm->nachname, anm->vorname);
  printf("\t\tTel: %d\n\n", anm->telnr);
}


void drucke_nummer ( struct liste *anm ) {

  if ( strcmp ( anm->person.nachname, anfang->person.nachname ) ==  0 ) {

    printf("\n\nDie zugehoerige NUMMER lautet: %d\n", anfang->person.telnr);
  }

  else{

  struct liste *ptr = anfang;
  while ( eing_kleiner (&ptr->rest->person, &anm->person) )
    ptr = ptr->rest;

  printf("\n\n\tDie zugehoerige NUMMER lautet: %d\n", ptr->rest->person.telnr);
  }
}


void drucke_liste() {

  struct liste *ptr;
  printf("\n\n\t\tTELEPHONLISTE\n\n");
  for ( ptr = anfang; ptr; ptr = ptr->rest )
    drucke_teilnehmer( &ptr->person );
}


void eingabe_teilnehmer ( struct telephon *anm ) {

  char string[25];
  
  printf("\nNachname: ");
  scanf("%s",string);
  anm->nachname = strdup(string);
  printf("Vorname: ");
  scanf("%s",string);
  anm->vorname = strdup(string);
  printf("Telephonnummer: ");
  scanf("%d",&anm->telnr);
}


void eingabe_suchname ( struct telephon *suche ) {

  char string[25];

  printf("\nNachname: ");
  scanf("%s",string);
  suche->nachname = strdup(string);
  printf("Vorname: ");
  scanf("%s",string);
  suche->vorname = strdup(string);
}

int ueberpruefe_suchname ( struct liste *weg ) {
 
 struct liste *ptr;
 for(ptr=anfang;ptr;ptr->rest) {

   if ((strcmp(ptr->person.nachname,weg->person.nachname)==0)&&(strcmp(ptr->person.vorname,weg->person.vorname)==0)) return 1;
   return 0;
 }
}

void entferne_teilnehmer ( struct liste *weg ) {


 if ( strcmp ( weg->person.nachname, anfang->person.nachname ) ==  0 ) {
   anfang = anfang->rest;
    
  }

 else{
  struct liste *ptr = anfang;
  while ( ptr->rest != NULL && eing_kleiner (&ptr->rest->person, &weg->person) )
    ptr = ptr->rest;

  ptr->rest=ptr->rest->rest;


 }
 printf("\n\tDANKE: Der Teilnehmer %s, %s wurde aus der Liste entfernt\n", weg->person.nachname, weg->person.vorname);
}



 main() {

  int i;
  
  printf("\n\n\n\n\tHallo in der \tTELEPHONLISTE\t by b.\nWie immer haette ich wohl lieber in die Falle gesollt...\n\n");


  while ( 1 ) {

    
    printf("\n\nIhnen stehen folgende Moeglichkeiten zur Verfuegung:\n\n");
    printf("\t1) Eintragen eines Namens\n\t2) Loeschen eines Namens\n");
    printf("\t3) Suchen eines Namens\n\t4) Telephonliste anzeigen\n");
    printf("\t0) Beenden\n\n");
    printf("Welche Aktion wollen Sie taetigen: ");
      scanf("%d",&i);
   
      switch ( i ) {

      case 1: 

	eingabe_teilnehmer ( &eing[anzahl].person );
	einfuegen (&eing[anzahl]);
	anzahl++;

	break;
	

      case 2: 

	eingabe_suchname ( &such[0].person );
	if( ueberpruefe_suchname( &such[0] ) == 1 ) entferne_teilnehmer( &such[0] );
	else printf("\n\tFEHLER: Dieser Teilnehmer ist nicht in der Liste!\n");

	break;


      case 3:

	eingabe_suchname ( &such[0].person );
	if( ueberpruefe_suchname( &such[0] ) == 1 ) drucke_nummer ( &such[0] );
	else printf("\n\tFEHLER: Dieser Teilnehmer ist nicht in der Liste!\n");
	

	break;


      case 4: 

	drucke_liste();
      
	break;


      case 0:

	printf("\n\n\n\nEinen schoenen Tag wuensche ich. Gruesse wie immer. \n\n\n");
	printf("On ne voit bien q'avec le coeur... Carpe diem...\n\nbjoern ;-)\n\n");
	exit();


      default:  printf("\n\n\t\tFEHLERHAFTE EINGABE, DU SCHAF\n\n");

      }


  }
}
