PraktikumProgrammierung1:Aufgabe 4

Aus Tudwiki
Wechseln zu: Navigation, Suche

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>

typedef struct elem *IntList;

typedef struct elem { int wert;

                     IntList next;
                   } elemtype;

/* die folgenden Funktionen sind zu implementieren sowie in der

   main-Funktion eine Anweisungsfolge einzufuegen, so dass das
   Programm eine beliebig lange ungeordnete Liste von ganzen
   Zahlen erzeugt, diese einschliesslich ihrer Laenge ausgibt
   und anschliessend in zwei geordnete Listen mit jeweils
   den geradzahligen bzw. ungeradzahligen Werten aufloest  */


/* -- Element mit Wert n erzeugen und hinten an eine Liste anhaengen --- */

/* --- Liste kann noch leer sein ! ------------------------ */

void Append(IntList *l, int n) {

       if(*l == NULL)
       {
               *l=(IntList)malloc(sizeof(elemtype));
               (*l)->wert=n;
               (*l)->next=NULL;
       }
       else
               Append(&(*l)->next,n);

}


/* --- Laenge einer Liste zurueckgeben ----------------- */

/* --- ( 0 -> Liste ist leer! ) */

int GetLaenge(IntList l) {

       if(l==NULL)
               return 0;
       else return 1 + GetLaenge(l->next);

}


/* --- komplette Liste auf dem Bildschirm ausgeben -------------------- */

/* --- (Liste kann leer sein) ----------------- */

void ListeAusgeben(IntList l) {

       if(l!=NULL)
       {
               printf("%8d",l->wert);
               ListeAusgeben(l->next);
       }

}


/* --- Kopfelement abkoppeln und als Pointer zurueckgeben ------ */

/* --- (Liste nicht leer ! ------------ */

IntList GetEle(IntList *l) {

       IntList r = *l;
       *l=(*l)->next;
       r->next=NULL;
       return r;

}


/* -- Element (als Pointer) in eine geordnete Liste einfuegen -- */

/* --- Liste kann noch leer sein ! ------------------------ */

void InsertEle(IntList *l, IntList Ele) {

       if(*l == NULL)
               *l = Ele;
       else
               if((*l)->wert>=Ele->wert)
               {
                       Ele->next=*l;
                       *l=Ele;
               }
               else
                       InsertEle(&(*l)->next,Ele);

}


/* **************** vorgegebene Funktionen ******************** */

/* ----- Erzeugen einer Liste zufaelliger Laenge mit zufaelligen Werten --- */

/* ----- 0 soll in der Liste als wert nicht vorkommen !! ------ */

void ZufallsListe(IntList *l) { int i, anzahl;

 srand((unsigned) time(NULL));
 anzahl = 10 + rand()%20;
 for(i=0;i<anzahl;i++) Append(l,1+rand()%10000000);
       /* haenge anzahl elemente an eine bisher leere liste an */

}


/* ----- Eingabe einer Liste von der Tastatur --- */

/* ----- Eingabeende mit 0 --- */

void NeueListe(IntList *l) { int Zahl;

 printf("\nEingabe der Listenelemente (0 = Ende)\n\n");
 do { printf("Zahl: ");
      scanf("%i",&Zahl);
      if (Zahl != 0)  Append(l,Zahl);
     } while (Zahl != 0);

}


int main(void) { IntList Liste = NULL, /* Gesamtliste */

         UListe = NULL,    /* Liste mit ungeraden Werten */
         GListe = NULL;    /* Liste mit geraden Werten */
 char ch;
 IntList help; /* Alternativloesung OHNE diese Variable denkbar */
 int Zahl;     /* Alternativloesung OHNE diese Variable denkbar */
 printf("\nSollen die Elemente von der Tastatur eingegeben werden (j/n)? ");
 do ch = toupper(getchar()); while ((ch!='J')&&(ch!='N'));
 if (ch == 'J') NeueListe(&Liste);
    else  ZufallsListe(&Liste);
 printf("\nGesamtliste mit %d Elementen: \n", GetLaenge(Liste));
 ListeAusgeben(Liste);
 printf("\nJetzt wird geordnet\n");

/* --- Aufloesen der Gesamtliste und erzeugen zweier geordneter Listen */

/* --- mit geraden bzw. ungeraden Werten */

 while(Liste != NULL)
 {
         help=GetEle(&Liste);
         Zahl=help->wert;
         if(Zahl%2==0)
                 InsertEle(&GListe,help);
         else
                 InsertEle(&UListe,help);
 }
 printf("\nGesamtliste mit %d Elementen: \n", GetLaenge(Liste));
 ListeAusgeben(Liste);     /* muss jetzt leer sein !! */
 printf("\n\nListe mit %d ungeraden Elementen: \n", GetLaenge(UListe));
 ListeAusgeben(UListe);
 printf("\n\nListe mit %d geraden Elementen: \n", GetLaenge(GListe));
 ListeAusgeben(GListe);
 printf("\n\n");
 return 0;

}