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