#include #include #include typedef struct tmp { struct tmp * next; int value; }element; typedef struct { element * first; element * next; int count; }menge; menge * neu () { menge * set; set = malloc (sizeof (menge)); set->count = 0; set->next = NULL; /* Dummy Element am Anfang der Liste */ set->first = malloc (sizeof (element)); set->first->next = NULL; return set; } void zerstoeren (menge * set) { element * elem, * tmp; assert (set != NULL); elem = set->first; free (set); while (elem) { tmp = elem; elem = elem->next; free (tmp); } } void einfuegen (menge * set, int value) { element * elem, * new; assert (set != NULL); elem = set->first; while (elem->next && (elem->next->value < value)) { elem = elem->next; } if (elem->next && (elem->next->value == value)) return; new = malloc (sizeof (element)); new->value = value; new->next = elem->next; elem->next = new; set->count++; } void entfernen (menge * set, int value) { element * elem, * tmp; assert (set != NULL); elem = set->first; while (elem->next && (elem->next->value < value)) { elem = elem->next; } if (elem->next == NULL) return; if (elem->next->value != value) return; tmp = elem->next; elem->next = elem->next->next; if (set->next == tmp) set->next = tmp->next; free (tmp); set->count--; } int zaehlen (menge * set) { assert (set != NULL); return set->count; } int enthalten (menge * set, int value) { element * elem; assert (set != NULL); elem = set->first->next; while (elem && (elem->value < value)) { elem = elem->next; } if (!elem) return 0; return (elem->value == value); } void first (menge * set) { assert (set != NULL); set->next = set->first->next; } int next (menge * set, int * ptr) { if (set->next) { *ptr = set->next->value; set->next = set->next->next; return 1; } return 0; } menge * mengen[100]; int main () { char string[100]; char command[100]; int i, val; for (i=0; i<100; ++i) mengen[i] = NULL; while (1) { fgets (string, 100, stdin); if (feof (stdin)) break; sscanf (string, "%s", command); if (0 == strcmp ("new", command)) { for (i=0; i<100; ++i) { if (mengen[i] == NULL) { mengen[i] = neu(); printf ("Menge Nummer %d erzeugt\n", i); break; } } if (i >= 100) printf ("Kein Platz mehr fuer neue Mengen\n"); } else if (0 == strcmp ("destroy", command)) { if (sscanf (string, "%*s %d", &i) == 1) { if (mengen[i]) { zerstoeren (mengen[i]); mengen[i] = NULL; printf ("Menge %d zerstoert\n", i); } else { printf ("Die Menge gibt es nicht\n"); } } else { printf ("Ja..?\n"); } } else if (0 == strcmp ("add", command)) { if (sscanf (string, "%*s %d %d", &i, &val) == 2) { if (mengen[i]) { printf ("Versuche %d der Menge Nummer %d hinzuzufuegen\n", i, val); einfuegen (mengen[i], val); } else { printf ("Die Menge gibt es nicht\n"); } } else { printf ("Ja..?\n"); } } else if (0 == strcmp ("del", command)) { if (sscanf (string, "%*s %d %d", &i, &val) == 2) { if (mengen[i]) { printf ("Versuche %d aus der Menge Nummer %d zu entfernen\n", i, val); entfernen (mengen[i], val); } else { printf ("Die Menge gibt es nicht\n"); } } else { printf ("Ja..?\n"); } } else if (0 == strcmp ("count", command)) { if (sscanf (string, "%*s %d", &i) == 1) { if (mengen[i]) { printf ("Die Menge %d sollte %d Elemente haben\n", i, zaehlen (mengen[i])); } else { printf ("Die Menge gibt es nicht\n"); } } else { printf ("Ja..?\n"); } } else if (0 == strcmp ("isin", command)) { if (sscanf (string, "%*s %d %d", &i, &val) == 2) { if (mengen[i]) { printf ("Teste ob %d in der Menge Nummer %d enthalten ist: %s\n", i, val, enthalten (mengen[i], val)?"Ja":"Nein"); } else { printf ("Die Menge gibt es nicht\n"); } } else { printf ("Ja..?\n"); } } else if (0 == strcmp ("list", command)) { if (sscanf (string, "%*s %d", &i) == 1) { if (mengen[i]) { printf ("Elemente der Menge %d:", i); first (mengen[i]); while (next (mengen[i], &val)) { printf (" %d", val); } printf ("\n"); } else { printf ("Die Menge gibt es nicht\n"); } } else { printf ("Ja..?\n"); } } else if (0 == strcmp ("end", command)) { break; } else { printf ("Ja..?\n"); } } return 0; }