SAI || Vorlesungen im WS 98/99 || Systemnahe Software

Übungen zu Systemnahe Software WS 98/99
Blatt 6 (1.12.98 - 08.12.98)


Aufgabe 8 (15 Punkte)

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:

#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) 

SAI || Vorlesungen im WS 98/99 || Systemnahe Software

Franz Schweiggert, 01.12.1998