Info2/28.6.2.c
2025-05-21 11:53:14 +02:00

164 lines
4.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}