Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- struct domino{
- int zahl1;
- int zahl2;
- domino *next;
- };
- struct verwaltung{ // Struktur zum Verwalten der Listenelemente für die Ringlisten
- domino *ringliste;
- verwaltung *next;
- };
- int hilfsvariable; // zum Drehen der Dominosteine
- domino *hilfszeiger = NULL; // Hilfszeiger zum Zwischenspeichern, beim Tauschen von Dominosteinen
- verwaltung *kopf, *ende; // Listenkopf und Listenende erstellen
- domino *urkopf, *urmitte, *urende; // Listenkopf der Urliste
- domino *ringkopf, *ringmitte, *ringende; // Ringlistenzeiger (soll nach Ausgabe recyclet werden)
- void drehen(domino *dreh){ // Funktion zum drehen der Dominosteine
- hilfsvariable = dreh->zahl1;
- dreh->zahl1 = dreh->zahl2;
- dreh->zahl2 = hilfsvariable;
- }
- void entfernen (domino *y){ // Funktion zum Löschen der verbrauchten Dominos aus der Urliste
- domino *q;
- if (y == urkopf){ // wenn der erste Domino der Liste entfert werden soll
- urkopf = urkopf->next;
- }
- else{
- for (q = urkopf; q->next != y; q = q->next){// schleifendurchlauf bis q
- }// wenn q->next = y:
- if (q->next->next == NULL) { // wenn der letzte Domino entfernt werden soll
- q->next = NULL;
- }
- else { // wenn ein Domino in der Mitte entfernt werden soll
- q->next = q->next->next;
- }
- }
- }
- void ausgabe (domino *kopf){ // Funktion zum ausgeben einer Liste, soll auch Ringliste ausgeben können
- for (domino *a = kopf; a != NULL; a = a->next){
- printf("%d %d\n", a->zahl1, a->zahl2);
- }
- }
- void ausgabeRing(domino *ringkopf){
- domino *b;
- // printf("%d %d\n", ringkopf->zahl1, ringkopf->zahl2);
- for (b = ringkopf; b->zahl2 != ringkopf->zahl1; b = b->next){
- printf("%d %d\n", b->zahl1, b->zahl2);
- }
- printf("%d %d\n", b->zahl1, b->zahl2);
- }
- void bautRing (domino *n){// n = urkopf
- for (n; n != NULL; n = n->next){
- if ((n == NULL) && (ringende->zahl2 != ringkopf->zahl1)){//n->next = NULL;
- n = urkopf;
- }
- if (ringende->zahl2 == n->zahl1){ // wenn der folgende Dominostein passt, wird er angehängt
- ringende->next = n;
- ringende = ringende->next;
- entfernen(n); // löscht das Element, das verwendet wurde
- ringende->next = NULL;
- bautRing (urkopf); return; // wenn Stein entfernt, Ursprungsliste von vorn durchgehen
- }
- if (ringende->zahl2 == n->zahl2){ // wenn der Stein falschrum liegt
- drehen(n); // Stein wird gedreht
- ringende->next = n; // und angehängt
- ringende = ringende->next;
- entfernen(n);
- ringende->next = NULL; // löscht das Element, das verwendet wurde, aus der Ursprungsliste
- bautRing (urkopf); return; // wenn Stein entfernt, von vorn suchen
- }
- }
- ringende->next = ringkopf;
- return;
- }
- //
- int main (int x, char *pups[]){ // pups beinhaltet die Parameter (Anzahl übergebener Werte und Datei)
- FILE *text;
- int anzahl;
- kopf = new verwaltung;
- ende = kopf;
- ende->next = 0; // Nullzeiger am Listenende der Verwaltungsliste
- urkopf = new domino;
- urende = urkopf;
- urmitte = urkopf;
- urende->next = 0; // Nullzeiger am Listenende
- ringkopf = urkopf;
- ringende = ringkopf;
- ringende->next = 0; // NUllzeiger am ende des rings
- int z = 0; // zeigerzähler
- text = fopen (pups[1], "r"); // Datei öffnen um daraus zu lesen
- fscanf (text, "%d", &anzahl);
- fscanf (text, "%d %d", &urkopf->zahl1, &urkopf->zahl2);// der Anker zeigt auf erstes Element der Liste
- for (int i = anzahl-1; i != 0; i--){// so lange neue Listenelemente erstellen, bis Textdatei abgearbeitet
- urmitte = new domino; // neues Element erzeugt
- fscanf (text, "%d %d", &urmitte->zahl1, &urmitte->zahl2); // einlesen der Werte des neuen Dominosteins
- urmitte->next = 0;
- urende->next = urmitte;
- urende = urmitte;
- }
- printf("\nDie Liste der Dominosteine: \n\n");
- ausgabe (urkopf); // funktioniert
- while (urkopf->next != NULL){ //solange die Ausgangsliste nicht leer ist;
- // Verwaltung der Ringlisten
- ende->next = new verwaltung; // neues Element in Ringverwaltung
- ende = ende->next;
- ende->next = NULL;
- ende->ringliste = urkopf;
- // Ringlisten erstellen
- ringkopf = urkopf;
- entfernen (urkopf);
- //ringende = ringkopf;// wieso?
- ringmitte = ringkopf;
- //printf("Mein neues erstes Listenelement: %d %d\n", urkopf->zahl1, urkopf->zahl2);
- ringende->next = NULL;
- bautRing (urkopf);
- printf("\n\nRing:\n\n");
- ausgabeRing (ringkopf);
- //urkopf = urkopf->next;// Anker rutscht weiter
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment