Datei: dlist.c


    1   /*
    2    *      dlist.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    *      klin, Thu Jan  6 08:44:34 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 *prv;   /*   Voriges Listenelement      */
   20     struct _slist *nxt;   /*   Naechstes Listenelement    */
   21   } slist_t;
   22   
   23   void main(void)
   24   {
   25     char str[NBUF];       /* Einlesepuffer                */
   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 Listekomponente 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       /* Zeiger auf voriges Element: NULL, wenn 1. Eintrag */
   84       curr->prv = last;
   85       /* Wenn vorhanden, Vorgaenger mit Liste verknuepfen */
   86       if (last != NULL) 
   87         last->nxt = curr;
   88   
   89       /* Listenelement fuer die naechste Runde merken! */
   90       last = curr;    
   91       
   92     } /* while */
   93     
   94     /* 
   95      *    Liste rueckwaerts mit Zeilennummer und Stringlaenge ausgeben 
   96      */
   97      
   98     /* Ende der Liste suchen */
   99     for (curr = last; curr->nxt != NULL; curr = curr->nxt)
  100       ;
  101     /* Ausgeben und rueckwaerts laufen */
  102     for ( ; curr != NULL; curr = curr->prv) 
  103       printf("%4d: %s (%d)\n", curr->lno, curr->str, curr->len);
  104   
  105     /*
  106      *    Programm terminieren
  107      */
  108      
  109     exit(0);
  110         
  111   } /* main() */


Erzeugt von c2html 1.01