Guest User

Domino

a guest
Jun 10th, 2016
538
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2.  
  3. struct domino{
  4. int zahl1;
  5. int zahl2;
  6. domino *next;
  7. };
  8.  
  9. struct verwaltung{ // Struktur zum Verwalten der Listenelemente für die Ringlisten
  10. domino *ringliste;
  11. verwaltung *next;
  12. };
  13.  
  14. int hilfsvariable; // zum Drehen der Dominosteine
  15. domino *hilfszeiger = NULL; // Hilfszeiger zum Zwischenspeichern, beim Tauschen von Dominosteinen
  16. verwaltung *kopf, *ende; // Listenkopf und Listenende erstellen
  17. domino *urkopf, *urmitte, *urende; // Listenkopf der Urliste
  18. domino *ringkopf, *ringmitte, *ringende; // Ringlistenzeiger (soll nach Ausgabe recyclet werden)
  19.  
  20. void drehen(domino *dreh){ // Funktion zum drehen der Dominosteine
  21. hilfsvariable = dreh->zahl1;
  22. dreh->zahl1 = dreh->zahl2;
  23. dreh->zahl2 = hilfsvariable;
  24. }
  25.  
  26. void entfernen (domino *y){ // Funktion zum Löschen der verbrauchten Dominos aus der Urliste
  27. domino *q;
  28. if (y == urkopf){ // wenn der erste Domino der Liste entfert werden soll
  29. urkopf = urkopf->next;
  30. }
  31. else{
  32. for (q = urkopf; q->next != y; q = q->next){// schleifendurchlauf bis q
  33. }// wenn q->next = y:
  34. if (q->next->next == NULL) { // wenn der letzte Domino entfernt werden soll
  35. q->next = NULL;
  36. }
  37. else { // wenn ein Domino in der Mitte entfernt werden soll
  38. q->next = q->next->next;
  39. }
  40. }
  41. }
  42.  
  43. void ausgabe (domino *kopf){ // Funktion zum ausgeben einer Liste, soll auch Ringliste ausgeben können
  44. for (domino *a = kopf; a != NULL; a = a->next){
  45. printf("%d %d\n", a->zahl1, a->zahl2);
  46. }
  47. }
  48. void ausgabeRing(domino *ringkopf){
  49. domino *b;
  50. // printf("%d %d\n", ringkopf->zahl1, ringkopf->zahl2);
  51. for (b = ringkopf; b->zahl2 != ringkopf->zahl1; b = b->next){
  52. printf("%d %d\n", b->zahl1, b->zahl2);
  53. }
  54. printf("%d %d\n", b->zahl1, b->zahl2);
  55. }
  56.  
  57. void bautRing (domino *n){// n = urkopf
  58. for (n; n != NULL; n = n->next){
  59. if ((n == NULL) && (ringende->zahl2 != ringkopf->zahl1)){//n->next = NULL;
  60. n = urkopf;
  61. }
  62. if (ringende->zahl2 == n->zahl1){ // wenn der folgende Dominostein passt, wird er angehängt
  63. ringende->next = n;
  64. ringende = ringende->next;
  65. entfernen(n); // löscht das Element, das verwendet wurde
  66. ringende->next = NULL;
  67. bautRing (urkopf); return; // wenn Stein entfernt, Ursprungsliste von vorn durchgehen
  68. }
  69. if (ringende->zahl2 == n->zahl2){ // wenn der Stein falschrum liegt
  70. drehen(n); // Stein wird gedreht
  71. ringende->next = n; // und angehängt
  72. ringende = ringende->next;
  73. entfernen(n);
  74. ringende->next = NULL; // löscht das Element, das verwendet wurde, aus der Ursprungsliste
  75. bautRing (urkopf); return; // wenn Stein entfernt, von vorn suchen
  76. }
  77. }
  78. ringende->next = ringkopf;
  79. return;
  80. }
  81. //
  82. int main (int x, char *pups[]){ // pups beinhaltet die Parameter (Anzahl übergebener Werte und Datei)
  83. FILE *text;
  84. int anzahl;
  85. kopf = new verwaltung;
  86. ende = kopf;
  87. ende->next = 0; // Nullzeiger am Listenende der Verwaltungsliste
  88.  
  89. urkopf = new domino;
  90. urende = urkopf;
  91. urmitte = urkopf;
  92. urende->next = 0; // Nullzeiger am Listenende
  93. ringkopf = urkopf;
  94. ringende = ringkopf;
  95. ringende->next = 0; // NUllzeiger am ende des rings
  96. int z = 0; // zeigerzähler
  97.  
  98. text = fopen (pups[1], "r"); // Datei öffnen um daraus zu lesen
  99. fscanf (text, "%d", &anzahl);
  100. fscanf (text, "%d %d", &urkopf->zahl1, &urkopf->zahl2);// der Anker zeigt auf erstes Element der Liste
  101.  
  102. for (int i = anzahl-1; i != 0; i--){// so lange neue Listenelemente erstellen, bis Textdatei abgearbeitet
  103. urmitte = new domino; // neues Element erzeugt
  104. fscanf (text, "%d %d", &urmitte->zahl1, &urmitte->zahl2); // einlesen der Werte des neuen Dominosteins
  105. urmitte->next = 0;
  106. urende->next = urmitte;
  107. urende = urmitte;
  108. }
  109.  
  110. printf("\nDie Liste der Dominosteine: \n\n");
  111. ausgabe (urkopf); // funktioniert
  112.  
  113. while (urkopf->next != NULL){ //solange die Ausgangsliste nicht leer ist;
  114. // Verwaltung der Ringlisten
  115. ende->next = new verwaltung; // neues Element in Ringverwaltung
  116. ende = ende->next;
  117. ende->next = NULL;
  118. ende->ringliste = urkopf;
  119. // Ringlisten erstellen
  120. ringkopf = urkopf;
  121. entfernen (urkopf);
  122. //ringende = ringkopf;// wieso?
  123. ringmitte = ringkopf;
  124. //printf("Mein neues erstes Listenelement: %d %d\n", urkopf->zahl1, urkopf->zahl2);
  125. ringende->next = NULL;
  126. bautRing (urkopf);
  127. printf("\n\nRing:\n\n");
  128. ausgabeRing (ringkopf);
  129. //urkopf = urkopf->next;// Anker rutscht weiter
  130. }
  131. }
RAW Paste Data