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