Wie kann ich die Aufgabe mit verketteten Listen lösen?

  • C

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von a.b_om.

    @VaporiZed und @exc-jdbi

    Hallo,

    ich komme schon wieder nicht weiter.

    Wenn ich am Schluss schaue, auf was pNext und pPrev verweisen, zeigen sie nicht das richtige an. Wie kann ich den Code ändern, sodass es richtig macht?

    Mein jetztiger Code zum hinzufügen eines Elements:
    Spoiler anzeigen

    C-Quellcode

    1. YugiohKarte YugiohKarteErstellen(YugiohKarte ersteYugiohKarte) {
    2. char antwort[MAX];
    3. int anzahlKarten;
    4. YugiohKarte *vorhaerigeYugiohKarte = &ersteYugiohKarte;
    5. do {
    6. printf("\nWie viele Yugiohkarten moechten Sie erstellen? Bitte geben Sie nur Zahlen ein, sonst kommt es zu einem Absturz.");
    7. fgets(antwort, MAX, stdin);
    8. anzahlKarten = atoi(antwort);
    9. for (int i = 1; i <= anzahlKarten; i++) {
    10. if (ersteYugiohKarte.Beschreibung[0] == 'D' &&
    11. ersteYugiohKarte.Beschreibung[1] == 'a' &&
    12. ersteYugiohKarte.Beschreibung[2] == 's' &&
    13. ersteYugiohKarte.Beschreibung[3] == ' ' &&
    14. ersteYugiohKarte.Beschreibung[4] == 'i' &&
    15. ersteYugiohKarte.Beschreibung[5] == 's' &&
    16. ersteYugiohKarte.Beschreibung[6] == 't' &&
    17. ersteYugiohKarte.Beschreibung[7] == ' ' &&
    18. ersteYugiohKarte.Beschreibung[8] == 'd' &&
    19. ersteYugiohKarte.Beschreibung[9] == 'i' &&
    20. ersteYugiohKarte.Beschreibung[10] == 'e' &&
    21. ersteYugiohKarte.Beschreibung[11] == ' ' &&
    22. ersteYugiohKarte.Beschreibung[12] == 'e' &&
    23. ersteYugiohKarte.Beschreibung[13] == 'r' &&
    24. ersteYugiohKarte.Beschreibung[14] == 's' &&
    25. ersteYugiohKarte.Beschreibung[15] == 't' &&
    26. ersteYugiohKarte.Beschreibung[16] == 'e' &&
    27. ersteYugiohKarte.Beschreibung[17] == ' ' &&
    28. ersteYugiohKarte.Beschreibung[18] == 'Y' &&
    29. ersteYugiohKarte.Beschreibung[19] == 'u' &&
    30. ersteYugiohKarte.Beschreibung[20] == 'g' &&
    31. ersteYugiohKarte.Beschreibung[21] == 'i' &&
    32. ersteYugiohKarte.Beschreibung[22] == 'o' &&
    33. ersteYugiohKarte.Beschreibung[23] == 'h' &&
    34. ersteYugiohKarte.Beschreibung[24] == 'K' &&
    35. ersteYugiohKarte.Beschreibung[25] == 'a' &&
    36. ersteYugiohKarte.Beschreibung[26] == 'r' &&
    37. ersteYugiohKarte.Beschreibung[27] == 't' &&
    38. ersteYugiohKarte.Beschreibung[28] == 'e' &&
    39. ersteYugiohKarte.Beschreibung[29] == '.') {
    40. ersteYugiohKarte = {"Name", "Kartenart", 1, 0, 0, 0, "ATK", "DEF", "Eigenschaft", "Monstertyp", "Kartentyp", "Beschreibung" };
    41. }
    42. else
    43. {
    44. YugiohKarte naechsteYugiohKarte = { "Name", "Kartenart", 1, 0, 0, 0, "ATK", "DEF", "Eigenschaft", "Monstertyp", "Kartentyp", "Beschreibung2" };
    45. do {
    46. if (vorhaerigeYugiohKarte->pNext != NULL) {
    47. vorhaerigeYugiohKarte = vorhaerigeYugiohKarte->pNext;
    48. }
    49. else {
    50. break;
    51. }
    52. }
    53. while (true);
    54. naechsteYugiohKarte.pPrev = vorhaerigeYugiohKarte;
    55. vorhaerigeYugiohKarte->pNext = &naechsteYugiohKarte;
    56. printf(" ");
    57. }
    58. }
    59. } while (true);
    60. }


    Codechaos beseitigt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Du musst mit Pointern arbeiten. Deine erste Karte wird nie ein Verweis auf diese sein, sondern nur eine lokale Kopie im Stack Deiner Funktion, weil Du keinen Zeiger übergibst (Call-By-Value-Prinzip). Das heißt Deine ganze Kette ist nach dem Funktionsaufruf weg, weil Du auf ein Objekt zeigst, dass es nur darin gibt.
    Davon abgesehen fehlt Dein Return. Und da ist dann eben das nächste Problem, was ich schon mal angesprochen habe: Du musst für die zurückgegebene Karte Speicher alloziieren (Heap), damit die nach der Prozedur erhalten bleibt.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Na Moment, der Code und der Prozedurname passen nicht. Der Code macht zuviel. Da sind wir zwar beim Thema CleanCodeDevelopment, aber sobald Du da für Ordnung gesorgt hast, wird auch klarer, was da anders laufen sollte.
    Ein Gegenvorschlagsansatz:

    C-Quellcode

    1. int Main() {
    2. YugiohKarte* ErsteKarte = null;
    3. do
    4. {
    5. ErstelleKarte(ErsteKarte);
    6. //hier abfragen, ob weitere Karten erstellt werden sollen; wenn nicht: break
    7. }
    8. while (true)
    9. return 0;
    10. }
    11. void ErstelleKarte(YugiohKarte* ErsteKarte) {
    12. YugiohKarte neueYugiohKarte;
    13. //hier mit Daten befüllen
    14. if (ErsteKarte != null)
    15. {
    16. while (ErsteKarte -> pPrev != null)
    17. ErsteKarte = ErsteKarte -> pPrev;
    18. };
    19. ErsteKarte = &neueYugiohKarte;
    20. }

    Mir ist klar, dass es nicht Dein Wunsch war, Alternativcode zu bekommen, sondern Deinen Code umgestaltet zu bekommen, aber vielleicht wird es dann (auch für mich) klarer.

    PS: Sollte das syntaktisch nicht klappen: C ist bei mir 15 Jahre her.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dieser Thread hat noch eine Vorgeschichte. Vllt. Hilft dir das.

    Ich möchte da nur eine neue Karte machen und die mit dem Vorherigen Karte verbinden. Das ist das einzige, dass ich in dieser Klasse machen möchte.

    Meine Main:
    Spoiler anzeigen

    C-Quellcode

    1. ​int main()
    2. {
    3. struct YugiohKarte ersteYugiohKarte = { "Name", "Kartenart", 1, 0, 0, 0, "ATK", "DEF", "Eigenschaft", "Monstertyp", "Kartentyp", "Das ist die erste YugiohKarte." };
    4. printf("\nWICHTIG: Bitte maximieren Sie das Fenster, weil es sonst nicht alles richtig darstellt.");
    5. do
    6. {
    7. printf("\nMoechten Sie eine Yugioh-Karten erstellen(YKE), eine Yugioh-Karte loeschen(YKL), eine Yugioh-Karte ausgeben(YKA) oder das Programm schliessen(Prsc):");
    8. char antwort[MAX];
    9. fgets(antwort, MAX, stdin);
    10. if (antwort[0] == 'Y' && antwort[1] == 'K' && antwort[2] == 'E') {
    11. ersteYugiohKarte = YugiohKarteErstellen(ersteYugiohKarte);
    12. }
    13. else if (antwort[0] == 'Y' && antwort[1] == 'K' && antwort[2] == 'L') {
    14. YugiohKarteLoeschen(ersteYugiohKarte);
    15. }
    16. else if (antwort[0] == 'Y' && antwort[1] == 'K' && antwort[2] == 'A') {
    17. YugiohKarteAusgeben(ersteYugiohKarte);
    18. }
    19. else if (antwort[0] == 'P' && antwort[1] == 'r' && antwort[2] == 's' && antwort[3] == 'c') {
    20. return 0;
    21. }
    22. else
    23. {
    24. printf("Bitte geben Sie eine Abkuerzung ein!");
    25. }
    26. } while (true);
    27. }
    Das ist insofern irrelevant, als dass dann nur das if-Statement bei mir in Z#15 überflüssig ist. Ansonsten heißt mein Code nur: Erstelle eine neue Karte, finde den Anfang der Kette und setz da die neue Karte ran. Daher versteh ich tatsächlich nicht, was das aktuelle Problem ist. Sorry.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Gut ich erkläre, was die Methode machen soll.
    1. Fragt den Benutzer ab, wie viele Karten er machen soll.
    2. Wenn es noch keine Karten dort sind, wird die ersteKarte befüllt
      1. Wenn aber es schon eine hat, wird sie dahinter gefügt.
    3. Dann wird die erste Karte returned, sodass ich das später wieder brauchen kann.
    Die Main Funktion ist fertig. Alles andere muss jetzt in den anderen Funktionen gemacht werden.
    Wie ich das sehe, kann in deinem Code nur 2 Karten geben. Ich lese es so. Bin auch nicht so gut mit C. Das ist das erste mal, dass ich mit C arbeite.
    Falls ich das falsch gelesen habe tut mir es leid. Und ich denke, dass deine Z18 eine Exception werfen wird.

    Wenn ich in meinem Code bei der Abfrage, wie viele Karten ich erstellen möchte, eine 1 oder eine 2 eingebe, funktioniert das Programm. Sobald die Zahl höher ist, dann nicht mehr und die Liste ist quasi endlos.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()

    Wieso sollte es mit meinem Code nur möglich sein, 2 Karten zu erstellen? ErsteKarte ist ein Pointer auf die oberste Karte auf dem imaginären Stapel. Wird eine neue Karte erstellt, wird diese zur ersten Karte. Man muss natürlich dafür sorgen, dass die vormals 1. Karte nun auf die neue Karte verweist (und die neue Karte auf die vormals 1., sonst wär's keine double linked list; einzubauen in Post#24, Zeile#14). Aber wie oft Karten erstellt werden, ergibt sich aus dem von mir nicht angegebenen Abbruchcode in P#24, Z#6.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo ich bin es wieder. Mit der Hilfe von einer Datei, die der Lehrer endlich herausgerückt hat, habe ich meine Funktion zu erstellen der Liste fertiggestellt
    Klassencode:
    Spoiler anzeigen

    C-Quellcode

    1. struYugiohKarte* YugiohKartenListeErstellen()
    2. {
    3. char antwort[265];
    4. int anzahlKarten;
    5. printf("\nWie viele Yugiohkarten moechten Sie erstellen? Bitte geben Sie nur Zahlen ein, sonst kommt es zu einem Absturz.");
    6. fgets(antwort, 265, stdin);
    7. anzahlKarten = atoi(antwort);
    8. struYugiohKarte* pFirst = NULL;
    9. for (int i = 0; i < anzahlKarten; i++)
    10. {
    11. struYugiohKarte* pNew = (struYugiohKarte*)malloc(sizeof(struYugiohKarte));
    12. if (pNew == NULL) break;
    13. pNew->Name[0] = 'A' + rand() % 26;
    14. pNew->Name[1] = '\0';
    15. pNew->Kartenart[0] = 'A' + rand() % 26;
    16. pNew->Kartenart[1] = '\0';
    17. pNew->Stufe = 1 + rand() % 12;
    18. pNew->Rang = 1 + rand() % 13;
    19. pNew->Pendelstufe = 1 + rand() % 12;
    20. pNew->Link = 1 + rand() % 8;
    21. pNew->ATK = rand() % 10001;
    22. pNew->DEF = rand() % 10001;
    23. pNew->Eigenschaft[0] = 'A' + rand() % 26;
    24. pNew->Eigenschaft[1] = '\0';
    25. pNew->Monstertyp[0] = 'A' + rand() % 26;
    26. pNew->Monstertyp[1] = '\0';
    27. pNew->Kartentyp[0] = 'A' + rand() % 26;
    28. pNew->Kartentyp[1] = '\0';
    29. pNew->Beschreibung[0] = 'A' + rand() % 26;
    30. pNew->Beschreibung[1] = '\0';
    31. if (pFirst != NULL)
    32. {
    33. pNew->pNext = pFirst;
    34. }
    35. else
    36. {
    37. pNew->pNext = NULL;
    38. }
    39. pFirst = pNew;
    40. }
    41. return pFirst;
    42. }


    Wer hätte das gedacht, dass das schlussendlich doch so einfach geht. Jedenfalls danke für die Hilfe.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ () aus folgendem Grund: Grammatik