Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5.  
  6. /* Struktur des Datensatzes  */
  7. typedef struct stud_type_ {
  8.     int    matnum;                /* Matrikelnummer,         */
  9.     char   vorname[20];           /* Vorname und             */
  10.     char   nachname[20];          /* Nachname sind Eintraege.*/
  11.  
  12.     /* Die Datenbank ist eine einfach verkettete Liste.      */
  13.     struct stud_type_ *next_student;
  14. } stud_type;
  15.  
  16. typedef struct sortier_liste_ {
  17.     struct stud_type_ *student;     /* Pointer auf die eigentlichen Daten */
  18.     struct sortier_liste_ *next;        /* einfache Verkettung */
  19. } sortier_liste;
  20.  
  21. /* Initialisierung der Datenbank */
  22. stud_type *studenten_liste = NULL;
  23. sortier_liste *namen_liste = NULL;
  24.  
  25. /* fügt einen Namen per Rekursion in die Sortierliste ein */
  26. void fuege_ein (stud_type *x, sortier_liste *current)
  27. {   printf("a");
  28.     if (current == NULL)        /* am Ende der Liste soll immer eingefügt werden */
  29.     {   printf("b");
  30.         sortier_liste *tmp;
  31.         tmp = malloc(sizeof(sortier_liste));
  32.         tmp->next = NULL;
  33.         tmp->student = x;
  34.         current = tmp;
  35.  
  36.     }
  37.     else
  38.     {
  39.         if (strcmp(x->nachname, current->student->nachname) >= 0)
  40.         /* wenn x >= curr, hänge x hinter curr ein */
  41.         {   printf("c");
  42.             sortier_liste *tmp;
  43.             tmp = malloc(sizeof(sortier_liste));
  44.             tmp->next = current;
  45.             tmp->student = x;
  46.             current = tmp;
  47.         }
  48.         /* x < curr, also geh ein Element weiter */
  49.         else fuege_ein (x, current->next);
  50.     }
  51. }
  52.  
  53. /* erstellt eine "sortier_liste" */
  54. void sort_by_name(stud_type *x, sortier_liste *sliste)
  55. {
  56.     if (x != NULL)
  57.     {  
  58.         stud_type *curr;
  59.         curr = x;
  60.         fuege_ein(curr, sliste);
  61.         while (curr->next_student != NULL)
  62.             {
  63.             printf("e\n");
  64.             fuege_ein(curr->next_student, sliste);
  65.             curr = curr->next_student;
  66.             }
  67.     }
  68.     else printf ("Fehler: übergebene Studentenliste ist leer");
  69. }
  70.  
  71.  
  72. /* gibt eine "sortier_liste" aus */
  73. void print_by_name(sortier_liste *current)
  74. {
  75.     while (current != NULL)
  76.     {
  77.         printf("d\n");
  78.         printf("    Matrikelnummer %4i: %s %s\n",current->student->matnum, current->student->vorname,current->student->nachname);
  79.         current = current->next;
  80.     }
  81.    
  82. }
  83.  
  84. int is_empty()                     /* Ist die Datenbank leer? */
  85. {
  86.     return (studenten_liste==NULL);
  87. }
  88.  
  89. /* Einfuegen eines Elementes */
  90. void enqueue(int matnum, char vorname[20], char nachname[20])
  91. {
  92.     stud_type *curr, *next, *neuer_student;
  93.  
  94.     neuer_student = malloc(sizeof(stud_type));  /* Speicher fuer Element    */
  95.     strcpy(neuer_student->vorname,vorname);     /* anfordern und mit Daten */
  96.     strcpy(neuer_student->nachname,nachname);   /* fuellen.                 */
  97.     neuer_student->matnum = matnum;
  98.  
  99.     curr = studenten_liste;                     /* Neues Element in DB einfuegen */
  100.  
  101.     if ((curr==NULL) || (curr->matnum > neuer_student->matnum))
  102.     {
  103.         neuer_student->next_student = curr; /* Sonderfall: an erster Stelle  */
  104.         studenten_liste = neuer_student;    /* einfuegen                     */
  105.     }
  106.     else
  107.     {
  108.         next = curr->next_student;          /* Durchmustern der DB           */
  109.         while ((next!=NULL) && (next->matnum < neuer_student->matnum))
  110.         {
  111.             curr = next;
  112.             next = next->next_student;
  113.         }
  114.         neuer_student->next_student = next; /* Neues Element nach curr und   */
  115.         curr->next_student=neuer_student;   /* vor next einfuegen            */
  116.     }
  117. }
  118.  
  119. /* Loeschen eines Elementes */
  120. int dequeue(int matnum)
  121. {
  122.     stud_type *curr,*next;
  123.  
  124.     if (is_empty(studenten_liste))
  125.         return 0;                           /* Rueckgabewert: Fehler!*/
  126.  
  127.     curr=studenten_liste;
  128.     if (curr->matnum==matnum) {             /* Sonderfall: erstes Element */
  129.         studenten_liste=curr->next_student; /* loeschen                    */
  130.         free(curr);                         /* Speicher freigeben */
  131.         return 1;                           /* Rueckgabewert: OK.  */
  132.     }
  133.     next=curr->next_student;                /* Durchmustern der DB    */
  134.     while ((next!=NULL)&&(next->matnum<matnum))
  135.     {
  136.       curr=next;
  137.       next=next->next_student;
  138.     }
  139.  
  140.     if ((next==NULL)||(next->matnum!=matnum))
  141.         return 0;                           /* Rueckgabewert: Fehler!    */
  142.  
  143.     curr->next_student=next->next_student;  /* Element loeschen          */
  144.     free(next);                             /* Speicher wieder freigeben */
  145.  
  146.     return 1;                               /* Rueckgabewert: OK.        */
  147. }
  148.  
  149. /* Auslesen eines Elementes. */
  150. int get_student(int matnum, char vorname[20], char nachname[20])
  151. {
  152.     stud_type *curr;
  153.  
  154.     curr=studenten_liste;               /* Durchmustern der DB   */
  155.     while ((curr!=NULL)&&(curr->matnum<matnum))
  156.         curr=curr->next_student;
  157.     if ((curr==NULL)||(curr->matnum!=matnum))
  158.         return 0;                      /* Rueckgabewert: Fehler! */
  159.     else
  160.     {
  161.         strcpy(vorname,curr->vorname);
  162.         strcpy(nachname,curr->nachname);
  163.         return 1;                        /* Rueckgabewert: OK.   */
  164.     }
  165. }
  166.  
  167.  /* Test der Listenfunktionen. */
  168. int main() {
  169.     int matnum;
  170.     char vorname[20],nachname[20];
  171.     stud_type *curr;
  172.  
  173.     printf(">>> Fuege neuen Studenten in die Liste ein: Bill Clinton [6666] ...\n");
  174.     enqueue(6666,"Bill","Clinton");
  175.  
  176.     printf(">>> Fuege neuen Studenten in die Liste ein: Hillary Clinton [4711] ...\n");
  177.     enqueue(4711,"Hillary","Clinton");
  178.  
  179.     printf(">>> Fuege neuen Studenten in die Liste ein: Newt Gingrich [9999] ...\n");
  180.     enqueue(9999,"Newt","Gingrich");
  181.  
  182.     printf(">>> Test, ob die Matrikelnummer 0815 bereits erfasst wurde ...\n");
  183.     if (get_student(815,vorname,nachname))
  184.         printf("    Matrikelnummer %4i: %s %s\n",815,vorname,nachname);
  185.     else
  186.         printf("    Matrikelnummer %4i ist unbekannt\n",815);
  187.  
  188.     printf(">>> Fuege neuen Studenten in die Liste ein: Monica Lewinsky [0815] ...\n");
  189.     enqueue(815,"Monica","Lewinsky");
  190.  
  191.     printf(">>> Loesche die Matrikelnummer 4711 ...\n");
  192.     if (dequeue(4711))
  193.         printf("    Matrikelnummer %4i geloescht\n",4711);
  194.     else
  195.         printf("    Matrikelnummer %4i war nicht erfasst\n",4711);
  196.  
  197.     printf(">>> Test ob die Studentenliste leer ist ...\n");
  198.     if (is_empty())
  199.         printf("    Die Studentenliste ist leer \n");
  200.     else
  201.         printf("    Die Studentenliste ist nicht leer \n");
  202.  
  203.     printf(">>> Test, ob die Matrikelnummer 6666 bereits erfasst wurde ...\n");
  204.     if (get_student(6666,vorname,nachname))
  205.         printf("    Matrikelnummer %4i: %s %s\n",6666,vorname,nachname);
  206.     else
  207.         printf("    Matrikelnummer %4i ist unbekannt\n",6666);
  208.  
  209.     printf(">>> Loesche die Matrikelnummer 9998 ...\n");
  210.     if (dequeue(9998))
  211.         printf("    Matrikelnummer %4i geloescht\n",9998);
  212.     else
  213.         printf("    Matrikelnummer %4i war nicht erfasst\n",9998);
  214.  
  215.     printf(">>> Loesche die Matrikelnummer 9999 ...\n");
  216.     if (dequeue(9999))
  217.         printf("    Matrikelnummer %4i geloescht\n",9999);
  218.     else
  219.         printf("    Matrikelnummer %4i war nicht erfasst\n",9999);
  220.  
  221.     printf(">>> Gebe alle erfassten Studenten aus ...\n");
  222.     curr = studenten_liste;
  223.  
  224.     enqueue(22223, "Gerhard", "Polt");
  225.     enqueue(1231,"Max", "Mustermann");
  226.  
  227.     sortier_liste *lex_ordnung;
  228.     lex_ordnung = malloc(sizeof(sortier_liste));
  229.     lex_ordnung = NULL;
  230.     sort_by_name(studenten_liste, lex_ordnung);
  231.  
  232.  
  233.  
  234.     while(curr!=NULL)
  235.     {
  236.         printf("    Matrikelnummer %4i: %s %s\n",
  237.                curr->matnum, curr->vorname,curr->nachname);
  238.         curr=curr->next_student;
  239.     }
  240.  
  241.     print_by_name(lex_ordnung);
  242.  
  243.     return 0;
  244. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement