Datei: dlist.c
1 /* 2 * dlist.c 3 * Strings bis EOF einlesen, dynamisch in doppelt verketteter 4 * Liste mit Zeilennummer und Stringlaenge speichern, 5 * Liste mit Komponenten vom Enden her auf stdout ausgeben 6 * klin, Thu Jan 6 08:44:34 2000 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 13 #define NBUF 1024 /* Groesse des Einlesepuffers */ 14 15 typedef struct _slist { /* Strukt fuer Stringliste */ 16 char *str; /* String */ 17 size_t len; /* Stringlaenge */ 18 int lno; /* Zeilennummer */ 19 struct _slist *prv; /* Voriges Listenelement */ 20 struct _slist *nxt; /* Naechstes Listenelement */ 21 } slist_t; 22 23 void main(void) 24 { 25 char str[NBUF]; /* Einlesepuffer */ 26 slist_t *last = NULL; /* Letztes Listenelement */ 27 slist_t *curr = NULL; /* Aktuelles Listenelement */ 28 int lno = 0; /* Zeilennummer */ 29 size_t len; /* Stringlaenge */ 30 31 /* 32 * Strings bis EOF von stdin lesen 33 * und in dynamische liste eintragen 34 */ 35 36 while (fgets(str, sizeof(str), stdin) != NULL) { 37 38 /* 39 * 1.) String, Stringlaenge, Zeilennummer 40 */ 41 42 /* Zeilennummer hochzaehlen */ 43 ++lno; 44 /* Stringlaenge feststellen, NL ('\n') entfernen */ 45 len = strlen(str); 46 if (str[len - 1] == '\n') 47 str[--len] = '\0'; 48 49 /* 50 * 2.) Neues Listenelement allozieren 51 */ 52 53 curr = (slist_t *) calloc(1, sizeof(slist_t)); 54 /* Fehler: Kein Speicherplatz */ 55 if (curr == NULL) { 56 fprintf(stderr, "u7-1: Fehler: Kein Speicherplatz!\n"); 57 exit(1); 58 } 59 /* Platz fuer String allozieren */ 60 curr->str = (char *) calloc(len + 1, sizeof(char)); 61 /* Fehler: Kein Speicherplatz */ 62 if (curr->str == NULL) { 63 fprintf(stderr, "u7-1: Fehler: Kein Speicherplatz!\n"); 64 exit(1); 65 } 66 67 /* 68 * 3.) Komponenten des neuen Elements besetzen 69 */ 70 71 /* String in Listekomponente kopieren */ 72 (void) strcpy(curr->str, str); 73 /* Stringlaenge und Zeilennummer eintragen */ 74 curr->len = len; 75 curr->lno = lno; 76 /* Zeiger auf naechstes Element initialisieren */ 77 curr->nxt = NULL; 78 79 /* 80 * 4.) Liste verknuepfen 81 */ 82 83 /* Zeiger auf voriges Element: NULL, wenn 1. Eintrag */ 84 curr->prv = last; 85 /* Wenn vorhanden, Vorgaenger mit Liste verknuepfen */ 86 if (last != NULL) 87 last->nxt = curr; 88 89 /* Listenelement fuer die naechste Runde merken! */ 90 last = curr; 91 92 } /* while */ 93 94 /* 95 * Liste rueckwaerts mit Zeilennummer und Stringlaenge ausgeben 96 */ 97 98 /* Ende der Liste suchen */ 99 for (curr = last; curr->nxt != NULL; curr = curr->nxt) 100 ; 101 /* Ausgeben und rueckwaerts laufen */ 102 for ( ; curr != NULL; curr = curr->prv) 103 printf("%4d: %s (%d)\n", curr->lno, curr->str, curr->len); 104 105 /* 106 * Programm terminieren 107 */ 108 109 exit(0); 110 111 } /* main() */
Erzeugt von c2html 1.01 |