/* AGS 3.14 */ /* * Vereinbarung: (*neu).next wird als neu->next geschrieben, * wenn neu Zeiger auf Struktur ist */ #include #include typedef struct elem *IntList; /* elem Bezeichner der Struktur */ typedef struct elem { int nr; IntList next; } elemtype; /* elemtype ist Typbezeichner */ IntList l; /* l ist Zeiger auf Struktur */ int number; /* einzufuegender Wert */ void NeueListe(IntList *l) { *l = NULL; } void ListeAusgeben(IntList l) { int i; if (l == NULL) printf("Liste leer!\n"); else { i = 1; while (l != NULL) { printf("%d. Wert: %d", i, l->nr); if ((i % 4) == 0) printf("\n"); else printf(" | "); l = l->next; i++; } printf("\n"); } } int ReadZahl() { int z = 0; printf("Bitte geben Sie die einzufuegende Zahl ein (0: Ende): "); scanf("%d", &z); return z; } void Insert(IntList *l, int n) { /* l ist Zeiger auf Zeiger (l Zeiger auf IntList, IntList Zeiger auf Struktur (hier Zeiger auf Listenkopf)); Zeiger auf Listenkopf muss geaendert werden koennen, deswegen Referenzparameter */ IntList neu, HZ; neu = (IntList) malloc(sizeof(elemtype)); neu->nr = n; /* neu ist Zeiger auf neues Listenelement mit eingetragenem Wert n */ HZ = *l; /* Hilfszeiger HZ zum Finden des Einfuegepunktes */ if (*l == NULL) { /* uebergebene Liste ist noch leer, also neu als Liste setzen */ *l = neu; /* Aenderung des Listenkopfes */ neu->next = NULL; } else if (HZ->nr > n) { /* n ist kleinstes Element, also vor Listenkopf setzen, deswegen Änderung von *l */ neu->next = *l; *l = neu; /* Aenderung des Listenkopfes */ } else { /* Element muss nach Listenkopf eingekettet werden, also Suche nach dieser Stelle in while-Schleife und Einfuegen zwischen 2 Elementen oder ans Ende der Liste */ while ((HZ->next != NULL) && (HZ->next->nr < n)) HZ = HZ->next; neu->next = HZ->next; HZ->next = neu; /* Einketten */ } } int main() { NeueListe(&l); number = ReadZahl(); while (number != 0) { Insert(&l, number); ListeAusgeben(l); number = ReadZahl(); } ListeAusgeben(l); return 0; }