Dieses Blatt beschäftigt sich mit etwas Argumentverarbeitung, dynamischen Datenstrukturen und File-I/O.
Schreiben Sie ein C-Programm addrsort.c, das Datensätze der Form
Name:Telefonnummer:Postleitzahl:Ort
aus Dateien einliest, in einer sortierten dynamischen linearen Liste abspeichert und das sortierte Ergebnis auf stdout ausgibt.
Das Sortierkriterium kann dem Programm als Argument übergeben werden:
addrsort [-t | -p] { file }
Bei der Option -t soll die Ausgabe sortiert nach Telefonnummern, bei -p nach Postleitzahlen erfolgen. Ohne Sortieroption erfolgt die Ausgabe sortiert nach Namen. Die Ausgabe soll übersichtlich formatiert als Tabelle (via printf()) dargestellt werden.
Hinweise:
char *strchr(const char *s, int c); int strcmp(const char *s1, const char *s2); char *strdup(const char *s1);
#define FSEP ':' /* Feldtrenner */ struct plist /* Listenstruktur */ { char *name; /* ein Eintrag */ char *tel; char *plz; char *ort; struct plist *next; /* naechstes Listenelement */ }; /*---------------- ZU IMPLEMENTIEREN: -------------------------*/ /* * Sortierfunktion nach Name */ static int namcmp(struct plist *a, struct plist * b) /* * Sortierfunktion nach Plz */ static int plzcmp(struct plist *a, struct plist *b) /* * Sortierfunktion nach Telefonnummer */ static int telcmp(struct plist *a, struct plist *b) /* * liefert Speicherplatz fuer ein neues Listenelement * zerlegt und speichert die eingelesene Zeile ab */ static struct plist *newelem(char *s) /* * traegt eine Dateizeile an die entsprechende Stelle in die Liste ein * Resultat: Zeiger auf die veraenderte Liste */ static struct plist *insert(struct plist *liste, char *buf, int (*cmp)()) /* liste Zeiger auf Listenanfang */ /* buf eingelesene Zeile */ /* int (*cmp)(); entsprechende Vergleichsfunktion */ /* * Hauptroutine: liest Datensaetze einer Datei ein * und baut die lin. Liste auf */ static struct plist *addrsort(FILE *fp, int (*cmp)(), struct plist *liste) /*fp die Datei zum Lesen */ /*cmp entsprechende Vergleichsfunktion */ /*liste Anker der Liste */ /* * gibt die sortierte Liste formatiert am Bildschirm aus */ static void format(struct plist *liste) /* * gibt den Speicherplatz der Liste wieder frei */ static void freelist(struct plist *liste)