Datei: slist-d.c
1 /* 2 * slist-d.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 * Mit Debug-Ausgaben: cc -DDEBUG 7 * klin, Thu Jan 6 08:40:51 2000 8 */ 9 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <string.h> 13 14 #define NBUF 1024 /* Groesse des Einlesepuffers */ 15 16 typedef struct _slist { /* Strukt fuer Stringliste */ 17 char *str; /* String */ 18 size_t len; /* Stringlaenge */ 19 int lno; /* Zeilennummer */ 20 struct _slist *nxt; /* Naechstes Listenelement */ 21 } slist_t; 22 23 void main(void) 24 { 25 char str[NBUF]; /* Einlesepuffer */ 26 slist_t *root = NULL; /* Wurzel der Liste */ 27 slist_t *last = NULL; /* Letztes Listenelement */ 28 slist_t *curr = NULL; /* Aktuelles Listenelement */ 29 int lno = 0; /* Zeilennummer */ 30 size_t len; /* Stringlaenge */ 31 32 /* 33 * Strings bis EOF von stdin lesen 34 * und in dynamische liste eintragen 35 */ 36 37 while (fgets(str, sizeof(str), stdin) != NULL) { 38 39 /* 40 * 1.) String, Stringlaenge, Zeilennummer 41 */ 42 43 /* Zeilennummer hochzaehlen */ 44 ++lno; 45 /* Stringlaenge feststellen, NL ('\n') entfernen */ 46 len = strlen(str); 47 if (str[len - 1] == '\n') 48 str[--len] = '\0'; 49 #ifdef DEBUG 50 printf("DEBUG1: lno=%d len=%d str=%s\n", lno, len, str); 51 #endif 52 53 /* 54 * 2.) Neues Listenelement allozieren 55 */ 56 57 curr = (slist_t *) calloc(1, sizeof(slist_t)); 58 /* Fehler: Kein Speicherplatz */ 59 if (curr == NULL) { 60 fprintf(stderr, "u7-1: Fehler: Kein Speicherplatz!\n"); 61 exit(1); 62 } 63 /* Platz fuer String allozieren */ 64 curr->str = (char *) calloc(len + 1, sizeof(char)); 65 /* Fehler: Kein Speicherplatz */ 66 if (curr->str == NULL) { 67 fprintf(stderr, "u7-1: Fehler: Kein Speicherplatz!\n"); 68 exit(1); 69 } 70 #ifdef DEBUG 71 printf("DEBUG2: root=%08p last=%08p curr=%08p curr->str=%08p\n", root, last, curr, curr->str); 72 #endif 73 74 /* 75 * 3.) Komponenten des neuen Elements besetzen 76 */ 77 78 /* String in Listekomponente kopieren */ 79 (void) strcpy(curr->str, str); 80 /* Stringlaenge und Zeilennummer eintragen */ 81 curr->len = len; 82 curr->lno = lno; 83 /* Zeiger auf naechstes Element initialisieren */ 84 curr->nxt = NULL; 85 #ifdef DEBUG 86 printf("DEBUG3: curr=%08p lno=%d len=%d str=%s\n", curr, curr->lno, curr->len, curr->str); 87 #endif 88 89 /* 90 * 4.) Liste verknuepfen 91 */ 92 93 /* Erstes Element: Wurzel der Liste merken! */ 94 #ifdef DEBUG 95 printf("DEBUG4: root=%08p last=%08p curr=%08p\n", root, last, curr); 96 #endif 97 if (last == NULL) 98 root = curr; 99 /* Sonst: verknuepfen! */ 100 else 101 last->nxt = curr; 102 /* Listenelement fuer die naechste Runde merken! */ 103 last = curr; 104 #ifdef DEBUG 105 { 106 slist_t *p; 107 108 for (p = root; p; p = p->nxt) 109 printf("DEBUG5: p=%08p (%03d) p->nxt=%08p (%03d)\n", 110 p, p->lno, 111 p->nxt, p->nxt ? p->nxt->lno : 0); 112 } 113 #endif 114 115 } /* while */ 116 117 /* 118 * Liste mit Zeilennummer und Stringlaenge ausgeben 119 */ 120 121 /* Ausgeben und vorwaerts laufen */ 122 for (curr = root; curr != NULL; curr = curr->nxt) 123 printf("%4d: %s (%d)\n", curr->lno, curr->str, curr->len); 124 125 /* 126 * Programm terminieren 127 */ 128 129 exit(0); 130 131 } /* main() */
Erzeugt von c2html 1.01 |