Listen in C++

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

  • Listen in C++

    Hallo, hab hier ne Aufgabe, die ich leider nicht richtig verstehe. Ich müsste sie nichtmal komplett lösen (eine Teilaufgabe würde reichen, ist nur zur Übung).


    Aufgabenstellung:
    ¨
    Gegeben ist ein Beispielprogramm zur Verwendung von Listen. Dieses besteht aus einer Klasse List, welches eine einfach verkettete
    Liste zur Abspeicherung von positiven ganzen Zahlen implementiert und der main-Funktion,
    über welche die Liste mit Elementen gefüllt wird. Das Anhängen neuer Listenelemente erfolgt
    über die Methode append.
    ¨
    a) Durch das Anhangen der neuen Elemente an die Liste, ergibt sich eine unsortierte Folge
    von Zahlen.

    Erweitern Sie die Klasse List um die Methode insert zur Implementierung einer sortier-
    ten Liste. Uber das Einfugen von Elementen mit der insert-Funktion wird ein sortiertes
    Einfügen von Elementen ermoglicht, sodass zu jeder Zeit eine aufsteigende Folge von
    Zahlen in der Liste gegeben ist.

    b) Schreiben Sie eine Methode delete zum gezielten Loschen von Listenelementen. Diese
    bekommt als Parameter den Wert der zu loschenden Elemente. Erweitern Sie das Haupt-
    über welche der Benutzer selbst gewahlte Elemente aus der
    programm um eine Schleife,
    Liste löschen kann. Weiterhin soll nach jedem Loschen der vollstandige Inhalt der Liste
    ausgegeben werden.


    Das Ganze bezieht sich auf diese .CPP:

    Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. /*
    4. * myList - Version 0.02
    5. *
    6. * (c) 2005 by paedubucher
    7. *
    8. * Eine einfache C++-Klasse, welche eine minimale ArrayList für vorzeichenlose
    9. * Integers darstellt. Es können dabei Zahlen von 0 bis zur Integer-Obergrenze
    10. * gespeichert werden.
    11. *
    12. */
    13. // Struktur für die Speicherung eines Werts
    14. struct Value
    15. {
    16. public:
    17. Value *vluNext; // Zeiger auf das naechste Element
    18. unsigned int intValue; // Wert
    19. };
    20. // Eine einfache ArrayList fuer Zahlen von 0 bis zur Integer-Obergrenze
    21. class List
    22. {
    23. private:
    24. Value *vluFirst; // erstes Element der Liste
    25. Value *vluLast; // letztes Element der Liste
    26. unsigned int intCount; // Anzahl Elemente in der Liste
    27. // Gibt den Listeneintrag mit dem uebergebenen Index zurueck
    28. Value *getValue(unsigned int intIndex) const
    29. {
    30. unsigned int n = 0;
    31. Value *vluTemp = this->vluFirst; // erstes Element
    32. // Index im gueltigen Bereich?
    33. if(intIndex < this->intCount)
    34. {
    35. // vluTemp um intIndex verschieben
    36. for(; n < intIndex && vluTemp->vluNext != NULL; n++)
    37. vluTemp = vluTemp->vluNext; // nächstes Element
    38. }
    39. else
    40. vluTemp = NULL;
    41. return (vluTemp); // Rueckgabe von NULL bedeutet ungueltigen Index!
    42. }
    43. public:
    44. // Konstruktor
    45. List()
    46. {
    47. this->vluFirst = NULL;
    48. this->vluLast = NULL;
    49. this->intCount = 0;
    50. }
    51. // haengt der Liste einen neuen Eintrag mit dem uebergebenen Wert an
    52. void append(unsigned int intNewValue)
    53. {
    54. Value *vluNew = 0;
    55. // neues Element erstellen
    56. vluNew = new Value;
    57. vluNew->intValue = intNewValue;
    58. vluNew->vluNext = NULL;
    59. if(this->vluFirst == 0)
    60. {
    61. // erstes Element
    62. this->vluFirst = vluNew;
    63. this->vluLast = vluNew;
    64. }
    65. else
    66. {
    67. // anhaengen
    68. this->vluLast->vluNext = vluNew;
    69. this->vluLast = vluNew;
    70. }
    71. this->intCount++; // Anzahl der Listenelemente erhoehen
    72. }
    73. // gibt den Wert des Elements mit dem uebergebenen Index zurueck
    74. int get(unsigned int intIndex) const
    75. {
    76. int intRet = -1; // Dummy-Wert
    77. Value *vlu = NULL;
    78. // Index gueltig?
    79. if(intIndex < this->intCount)
    80. {
    81. vlu = this->getValue(intIndex); // Listeneintrag suchen
    82. if(vlu != NULL)
    83. intRet = vlu->intValue; // Wert speichern
    84. }
    85. return (intRet);
    86. }
    87. // Anzahl der Listenelemente zurueckgeben
    88. int getCount() const
    89. {
    90. return (intCount);
    91. }
    92. };
    93. int main ()
    94. {
    95. List zahlenliste;
    96. int zahl = 0;
    97. while (zahl >= 0)
    98. {
    99. cout << "Bitte naechste Zahl eingeben (Abbruch bei Zahlen < 0): ";
    100. cin >> zahl;
    101. if (zahl >= 0)
    102. {
    103. zahlenliste.append(zahl);
    104. }
    105. }
    106. cout << "Liste der eingegebenen Zahlen " << endl;
    107. for (int i=0; i < zahlenliste.getCount(); i++)
    108. cout << zahlenliste.get(i) << " ";
    109. return 0;
    110. }
    Alles anzeigen


    Gruß,

    cewbie
  • Wo hakts denn? Bei einfachen verketteten Listen ist das sortierte einfügen nur möglich wenn die Liste sowieso schon sortiert ist. Entweder prüfst du das ab oder gehst einfach davon aus, dass es so ist. Dann musst du solange die Elemente angucken, bist du die Stelle gefunden hast wo dein Listeneintrag hingehört, biegst zwei Zeiger um un fertig. Beim löschen genauso.

    Laufzeit ist O(n), das ist halt bei einfach verketteten Listen nicht schneller machbar.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • SeBa schrieb:

    ... gehst einfach davon aus, dass es so ist. Dann musst du solange die Elemente angucken, bist du die Stelle gefunden hast wo dein Listeneintrag hingehört, biegst zwei Zeiger um un fertig. Beim löschen genauso.


    Ja wie mache ich denn das? Ich verstehe schon WAS ich machen soll, nur nicht WIE. DIe Aufgabe ist irgendwie viel schwieriger als alles, was wir vorher hatten...

    :roll:

    cewbie
  • Ein Listenelement ist ein Record und beinhaltet die Zahl und einen Zeiger. Guck dir die Zahl an wenn die es ist die du suchst dann nimmst du den Record den du einfügen willst, und setzt den Zeiger (vluNext) von deinem Record auf den Wert vom gefundenen Record und den Zeiger vom gefunden Record lässt du auf dein Record zeigen.
    Wenn die Zahl es nicht ist, guckste was im Record steht auf den vluNext zeigt.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]