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