Datei: dlist-d.c
1 /* 2 * dlist-d.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 * Mit Debug-Ausgaben: cc -DDEBUG 7 * klin, Thu Jan 6 08:44:20 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 *prv; /* Voriges Listenelement */ 21 struct _slist *nxt; /* Naechstes Listenelement */ 22 } slist_t; 23 24 void main(void) 25 { 26 char str[NBUF]; /* Einlesepuffer */ 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: last=%08p curr=%08p curr->str=%08p\n", 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 nxt=%08p lno=%d len=%d str=%s\n", curr, curr->nxt, curr->lno, curr->len, curr->str); 87 #endif 88 89 /* 90 * 4.) Liste verknuepfen 91 */ 92 93 /* Zeiger auf voriges Element: NULL, wenn 1. Eintrag */ 94 #ifdef DEBUG 95 printf("DEBUG4: last=%08p curr=%08p\n", last, curr); 96 #endif 97 curr->prv = last; 98 /* Wenn vorhanden, Vorgaenger mit Liste verknuepfen */ 99 if (last != NULL) 100 last->nxt = curr; 101 102 /* Listenelement fuer die naechste Runde merken! */ 103 last = curr; 104 105 #ifdef DEBUG 106 { 107 slist_t *p; 108 109 for (p = last; p->prv != NULL; p = p->prv) 110 ; 111 for ( ; p; p = p->nxt) 112 printf("DEBUG5: p=%08p (%03d) p->prv=%08p (%03d) p->nxt=%08p (%03d)\n", 113 p, p->lno, 114 p->prv, p->prv ? p->prv->lno : 0, 115 p->nxt, p->nxt ? p->nxt->lno : 0); 116 } 117 #endif 118 119 } /* while */ 120 121 /* 122 * Liste rueckwaerts mit Zeilennummer und Stringlaenge ausgeben 123 */ 124 125 /* Ende der Liste suchen */ 126 for (curr = last; curr->nxt != NULL; curr = curr->nxt) 127 ; 128 /* Ausgeben und rueckwaerts laufen */ 129 for ( ; curr != NULL; curr = curr->prv) 130 printf("%4d: %s (%d)\n", curr->lno, curr->str, curr->len); 131 132 /* 133 * Programm terminieren 134 */ 135 136 exit(0); 137 138 } /* main() */
Erzeugt von c2html 1.01 |