Datei: slist.c
1 /* 2 * slist.c 3 * Strings bis EOF einlesen, dynamisch in einfach 4 * verketteter Liste mit Zeilennummer und Stringlaenge 5 * speichern. Liste mit Komponenten auf stdout ausgeben. 6 * klin, Thu Jan 6 08:39:38 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 *nxt; /* Naechstes Listenelement */ 20 } slist_t; 21 22 void main(void) 23 { 24 char str[NBUF]; /* Einlesepuffer */ 25 slist_t *root = NULL; /* Wurzel der Liste */ 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 Listenkomponente 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 /* Erstes Element: Wurzel der Liste merken! */ 84 if (last == NULL) 85 root = curr; 86 /* Sonst: verknuepfen! */ 87 else 88 last->nxt = curr; 89 /* Listenelement fuer die naechste Runde merken! */ 90 last = curr; 91 92 } /* while */ 93 94 /* 95 * Liste mit Zeilennummer und Stringlaenge ausgeben 96 */ 97 98 /* Ausgeben und vorwaerts laufen */ 99 for (curr = root; curr != NULL; curr = curr->nxt) 100 printf("%4d: %s (%d)\n", curr->lno, curr->str, curr->len); 101 102 /* 103 * Programm terminieren 104 */ 105 106 exit(0); 107 108 } /* main() */
Erzeugt von c2html 1.01 |