#include #include #include typedef struct Eintrag { char name[25]; char tel[15]; struct Eintrag *naechster_Name; struct Eintrag *naechste_Tel; struct Eintrag *vorheriger_Name; struct Eintrag *vorheriger_Tel; } Eintrag; void einfuegen(Eintrag **Anfang_Name, Eintrag **Anfang_Tel, char name[], char tel[]) { Eintrag *neuerEintrag = (Eintrag *)malloc(sizeof(Eintrag)); strcpy(neuerEintrag->name, name); strcpy(neuerEintrag->tel, tel); neuerEintrag->naechster_Name = NULL; neuerEintrag->naechste_Tel = NULL; Eintrag *aktuellerEintrag_Name = *Anfang_Name; Eintrag *vorherigerEintrag_Name = NULL; while (aktuellerEintrag_Name != NULL && strcmp(aktuellerEintrag_Name->name, neuerEintrag->name) < 0) { vorherigerEintrag_Name = aktuellerEintrag_Name; aktuellerEintrag_Name = aktuellerEintrag_Name->naechster_Name; } if (vorherigerEintrag_Name == NULL) { neuerEintrag->naechster_Name = *Anfang_Name; *Anfang_Name = neuerEintrag; } else { neuerEintrag->naechster_Name = aktuellerEintrag_Name; vorherigerEintrag_Name->naechster_Name = neuerEintrag; } if (neuerEintrag->naechster_Name != NULL) { neuerEintrag->naechster_Name->vorheriger_Name = neuerEintrag; } Eintrag *aktuellerEintrag_tel = *Anfang_Tel; Eintrag *vorherigerEintrag_tel = NULL; while (aktuellerEintrag_tel != NULL && strcmp(aktuellerEintrag_tel->tel, neuerEintrag->tel) < 0) { vorherigerEintrag_tel = aktuellerEintrag_tel; aktuellerEintrag_tel = aktuellerEintrag_tel->naechste_Tel; } if (vorherigerEintrag_tel == NULL) { neuerEintrag->naechste_Tel = *Anfang_Tel; *Anfang_Tel = neuerEintrag; } else { neuerEintrag->naechste_Tel = aktuellerEintrag_tel; vorherigerEintrag_tel->naechste_Tel = neuerEintrag; } if (neuerEintrag->naechste_Tel != NULL) { neuerEintrag->naechste_Tel->vorheriger_Tel = neuerEintrag; } } void ausgebenNachName(Eintrag *Anfang_Name) { printf("....Liste nach Namen sortiert..........\n"); while (Anfang_Name != NULL) { printf("%s \t (Tel. %s)\n", Anfang_Name->name, Anfang_Name->tel); Anfang_Name = Anfang_Name->naechster_Name; } } void ausgebenNachTel(Eintrag *Anfang_Tel) { printf("....Liste nach Telefonnummern sortiert..........\n"); while (Anfang_Tel != NULL) { printf("(Tel. %s) \t %s\n", Anfang_Tel->tel, Anfang_Tel->name); Anfang_Tel = Anfang_Tel->naechste_Tel; } printf("\n"); } void speicherfreigeben(Eintrag *Anfang_Name) { Eintrag *aktuellerEintrag = Anfang_Name; Eintrag *naechsterEintrag; while (aktuellerEintrag != NULL) { naechsterEintrag = aktuellerEintrag->naechster_Name; free(aktuellerEintrag); aktuellerEintrag = naechsterEintrag; } } int main() { struct Eintrag *head_name = NULL; struct Eintrag *head_telefon = NULL; char name[50]; char telefonnummer[15]; char eingabe; do { printf("Namens- und Telefonliste\n"); printf("========================\n"); printf("N Einfügen neuer Namen mit Telefonnummer\n"); printf("A Ausgeben der Liste\n"); printf("E Ende Deine Wahl: "); if (scanf(" %c", &eingabe) != 1) { return 0; } getchar(); if (eingabe == 'N' || eingabe == 'n') { while (1) { printf("Name: "); fgets(name, sizeof(name), stdin); if (name[0] == '\n') { break; } if (name[strlen(name) - 1] == '\n') { name[strlen(name) - 1] = '\0'; } printf("Tel: "); fgets(telefonnummer, sizeof(telefonnummer), stdin); if (telefonnummer[strlen(telefonnummer) - 1] == '\n') { telefonnummer[strlen(telefonnummer) - 1] = '\0'; } einfuegen(&head_name, &head_telefon, name, telefonnummer); } } if (eingabe == 'A' || eingabe == 'a') { ausgebenNachName(head_name); ausgebenNachTel(head_telefon); } printf("\n"); } while (eingabe != 'E' && eingabe != 'e'); return 0; }