PraktikumProgrammierung1:Aufgabe 4
#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;
}