[C++] Pointer Problem bzw. dynamische Liste


  • Priologie
  • 926 Aufrufe 1 Antwort

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [C++] Pointer Problem bzw. dynamische Liste

    Ich zerbreche mir seit Tagen den Kopf über folgende Aufgabenstellung:

    Es soll eine verkettete dynamische Liste aus aufsteigend sortierten Elementen aufgebaut werden. Jedes Listenelement enthält einen Namen und einen Zahlenwert, sortiert wird nach dem Zahlenwert. Das Hauptprogramm fragt in einer Wiederholschleife einen Namen und einen dazugehörigen Zahlenwert ab und ruft damit eine Einfuege_Routine auf, die das Element an der richtigen Stelle einkettet.. Anschließend wird eine Ausgabe_Routine aufgerufen, die die Kette traversiert und Namen und zugehörigen Zahlenwert ausgibt.


    Mein Quellcode schaut mittlerweile folgendermaßen aus:

    PHP-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. struct knoten
    5. {
    6. int nr;
    7. string name;
    8. struct knoten *next;
    9. };
    10. struct knoten *anfang, *ende; // Zeiger auf Anfang und Ende der Liste
    11. void einfuegen (int x, string name)
    12. { // einfuegen am Ende der Liste
    13. struct knoten *p_neu = new knoten; // erzeuge neuen Knoten
    14. struct knoten *pre_knoten = new knoten;
    15. struct knoten *folg_knoten = new knoten;
    16. p_neu->next=NULL;
    17. if (anfang == NULL)
    18. { // Leere Liste
    19. p_neu->nr=x;
    20. p_neu->name=name;
    21. anfang=p_neu;
    22. p_neu->next=NULL;
    23. cout << "hallo";
    24. }
    25. else
    26. { // Liste nicht leer
    27. cout << "hello";
    28. p_neu=anfang;
    29. pre_knoten=anfang;
    30. while (true)
    31. {
    32. if (p_neu->next == NULL)
    33. {
    34. p_neu->nr=x;
    35. p_neu->name=name;
    36. cout << "if";
    37. break;
    38. }
    39. else
    40. {
    41. if (x>=p_neu->nr)
    42. {
    43. p_neu->nr=x;
    44. p_neu->name=name;
    45. pre_knoten->next=p_neu;
    46. break;
    47. }
    48. else
    49. {
    50. p_neu=p_neu->next;
    51. pre_knoten=pre_knoten->next;
    52. }
    53. }
    54. }
    55. }
    56. }
    57. void ausgeben()
    58. { // ausgeben von Anfang bis Ende
    59. struct knoten *p = anfang; // p zeigt auf aktuellen Knoten
    60. p=p->next;
    61. cout << "Liste: \n";
    62. while (p != NULL)
    63. {
    64. cout << p->nr << " "; // Infoteil des aktuellen Knoten ausgeben
    65. cout << p->name << endl;
    66. p = p->next; // p auf Folgeelement setzen
    67. }
    68. cout << endl;
    69. }
    70. void main()
    71. {
    72. anfang = ende = NULL; // Leere Liste
    73. int eingabe;
    74. string name;
    75. char dummy;
    76. while (true)
    77. {
    78. cout << "Integer (Abbruch mit negativem Wert): ";
    79. cin >> eingabe;
    80. if (eingabe<0)
    81. break; // Beende Eingabeaufforderung
    82. cout << "Name: ";
    83. cin >> name;
    84. einfuegen (eingabe, name);
    85. }
    86. ausgeben();
    87. cin >> dummy;
    88. }
    Alles anzeigen


    Allerdings will das Einfügen eines neuen Knotens einfach nicht funktionieren. Der muss erzeugt und an der richtigen Stelle eingefügt werden.
    Hat vielleicht jemand einen Tipp was ich ändern muss?

    // hab mal das (quote) durch (php) ausgetauscht. dann ist das syntax highlighting besser ;) [feuerstein]
  • versuchs damit:

    PHP-Quellcode

    1. void einfuegen (int x, string name)
    2. { // einfuegen am Ende der Liste
    3. struct knoten *p_neuer = new knoten; // erzeuge neuen Knoten
    4. p_neuer->nr = x;
    5. p_neuer->name = name;
    6. p_neuer->next=NULL;
    7. if (anfang == NULL)
    8. { // Leere Liste
    9. anfang = p_neuer;
    10. } else
    11. { // Liste nicht leer
    12. if (anfang->nr>x)
    13. { // anfang kleienr als X
    14. p_neuer->next=anfang;
    15. anfang = p_neuer;
    16. } else {
    17. struct knoten *p_lauf = anfang;
    18. while ((p_lauf->next != NULL) && (p_lauf->nr<x))
    19. {
    20. p_lauf = p_lauf->next ;
    21. }
    22. if (p_lauf->next == NULL)
    23. { // ende der liste
    24. cout << "ende" << endl;
    25. p_lauf->next = p_neuer;
    26. //p_lauf->next->prev=p_lauf;
    27. } else {
    28. cout << "swap" << endl;
    29. p_neuer->nr = p_lauf->nr;
    30. p_neuer->name = p_lauf->name;
    31. p_neuer->next = p_lauf->next;
    32. p_lauf->nr = x;
    33. p_lauf->name = name;
    34. p_lauf->next = p_neuer;
    35. }
    36. } // else nicht kleiner als anfang
    37. }
    38. }
    Alles anzeigen


    achja: und ausgeben() hat auch nen fehler:

    PHP-Quellcode

    1. void ausgeben()
    2. { // ausgeben von Anfang bis Ende
    3. struct knoten *p = anfang; // p zeigt auf aktuellen Knoten
    4. cout << "Liste: \n";
    5. while (p != NULL)
    6. {
    7. cout << p->nr << " "; // Infoteil des aktuellen Knoten ausgeben
    8. cout << p->name << endl;
    9. p = p->next; // p auf Folgeelement setzen
    10. }
    11. cout << endl;
    12. }
    Alles anzeigen


    zu "EDIT" : Sorry, hab in der Eile nicht dran gedacht :)