Advertisement
Guest User

double linked list

a guest
Dec 12th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. struct TListenKnoten
  6. {
  7. int data;
  8. TListenKnoten* next, * prev;
  9. };
  10.  
  11.  
  12. void hinten_anfuegen(TListenKnoten*& anker, const int wert)
  13. {
  14. TListenKnoten* neuer_eintrag = new TListenKnoten;
  15. neuer_eintrag->data = wert;
  16. neuer_eintrag->next = nullptr;
  17. neuer_eintrag->prev = nullptr;
  18. if (anker == nullptr)
  19. anker = neuer_eintrag;
  20. else
  21. {
  22. TListenKnoten* ptr = anker;
  23. while (ptr->next != nullptr)
  24. {
  25. ptr = ptr->next;
  26. }
  27. neuer_eintrag->prev = ptr;
  28. ptr->next = neuer_eintrag;
  29. }
  30. }
  31. //wert_neu in die Liste einfügt, und zwar vor der Stelle des ersten Vorkommens des Wertes vor_wert
  32. //Sollte der Wert vor_wert nicht in der Liste vorkommen, so soll wert_neu ans Ende der Liste angehängt werden.
  33. //Die Funktion in_liste_einfuegen() soll auch in der Lage sein, einen Wert in eine bisher leere Liste einzufügen.
  34. void in_liste_einfuegen(TListenKnoten*& anker, int wert_neu, int vor_wert)
  35. {
  36. //tao mot Knote moi voi data = wert_neu
  37. TListenKnoten* neuer_eintrag = new TListenKnoten;
  38. neuer_eintrag->data = wert_neu;
  39. neuer_eintrag->next = nullptr;
  40. neuer_eintrag->prev = nullptr;
  41. //neu liste rong, anker = nullptr, anker veraendert.
  42. //neu liste khong rong, kiem tra xem co ton tai vor_wert khong
  43. //neu vor_wert khong ton tai, them vao hinten
  44. //neu vor_wert ton tai, kiem tra vi tri cua pointer
  45. //pointer = anker, them neuer_eintrag vorne, chuyen anker chi vao pointer
  46. //pointer khac anker, neuer ein trag vao giua.
  47. if (anker == nullptr) //liste ist leer
  48. {
  49. anker = neuer_eintrag;
  50. }
  51. else
  52. {
  53. TListenKnoten* ptr = anker;
  54. for (ptr = anker; (ptr->data != vor_wert) && (ptr->next != nullptr); ptr = ptr->next)
  55. if (ptr->data == vor_wert) //vor_wert gefunden => vorner einfuegen
  56. {
  57. //kiem tra vi tri cua pointer
  58. if (ptr == anker) //vor_wert an anker
  59. {
  60. neuer_eintrag->next = anker;
  61. anker->prev = neuer_eintrag;
  62. anker = neuer_eintrag;
  63. }
  64. else //vor_wert nicht an anker
  65. {
  66. neuer_eintrag->next = ptr;
  67. neuer_eintrag->prev = ptr->prev;
  68. ptr->prev = neuer_eintrag;
  69. ptr->prev->next = neuer_eintrag;
  70. }
  71. }
  72. else if (ptr->next == nullptr)// vor_wert nicht vorkommen => hinter einfugen
  73. {
  74. neuer_eintrag->prev = ptr;
  75. ptr->next = neuer_eintrag;
  76. }
  77. }
  78. }
  79.  
  80. string liste_als_string(TListenKnoten* anker)
  81. {
  82. string resultat = "";
  83. if (anker == nullptr)
  84. return "Leere Liste.";
  85. else
  86. {
  87. resultat += "[ ";
  88. TListenKnoten* ptr = anker;
  89. do
  90. {
  91. resultat += std::to_string(ptr->data);
  92. if (ptr->next != nullptr) resultat += " , ";
  93. else resultat += " ";
  94. ptr = ptr->next;
  95. } while (ptr != nullptr);
  96. resultat += "]";
  97. }
  98. return resultat;
  99. }
  100. void liste_ausgeben(TListenKnoten* anker)
  101. {
  102. cout << liste_als_string(anker) << endl;
  103. }
  104. void liste_ausgeben_rueckwaerts(TListenKnoten* anker)
  105. { //chay ptr voi dieu kien ptr->next den cuoi day, tu cuoi day chay ptr voi dieu kien ptr->prev ve.
  106. string resultat = "";
  107. TListenKnoten* ptr = anker;
  108. if (anker == nullptr)
  109. {
  110. cout << "Leere Liste." << endl;
  111. }
  112. else
  113. {
  114. while (ptr->next != nullptr)
  115. {
  116. ptr = ptr->next;
  117. }
  118. resultat += "[ ";
  119. do
  120. {
  121. resultat += std::to_string(ptr->data);
  122. if (ptr->prev != nullptr) resultat += " , ";
  123. else resultat += " ";
  124. ptr = ptr->prev;
  125. } while (ptr != nullptr);
  126. resultat += "]";
  127. cout << resultat << endl;
  128. }
  129. }
  130.  
  131. void aus_liste_loeschen(TListenKnoten*& anker, int wert)
  132. {
  133. for (TListenKnoten* ptr = anker; ptr->next != nullptr; ptr = ptr->next)//Liste durchgehen und sucht den Wert
  134. {
  135. if (ptr->data == wert) //den Wert gefunden
  136. {
  137. if (ptr == anker) //Wert an die erste Knote begegnet
  138. {
  139. if (anker->next == nullptr)// Liste besteht aus nur eine Knote
  140. anker = nullptr;
  141. else // Liste besteht aus mehrere Knoten
  142. anker = anker->next; anker->prev = nullptr;
  143. }
  144. else if (ptr != anker) // Wert nicht an die erste Knote
  145. {
  146. ptr->prev->next = ptr->next;
  147. ptr->next->prev = ptr->prev;
  148. }
  149. break;
  150. }
  151. }
  152. }
  153.  
  154. void liste_loeschen(TListenKnoten*& anker)
  155. {
  156. anker = nullptr;
  157. }
  158.  
  159. int main()
  160. { //kiem tra in liste einfuegen
  161. const int laenge = 10;
  162. TListenKnoten* anker = nullptr;
  163. for (int i = 0; i < laenge; i++) // neu
  164. in_liste_einfuegen(anker, i * i, 9999); // neu
  165. liste_ausgeben(anker);
  166. liste_ausgeben_rueckwaerts(anker);
  167. int wert_neu = 0, vor_wert = 0; // neu
  168. cout << "Einzufuegender Wert: "; cin >> wert_neu; //neu
  169. cout << "Vor welchem Wert? "; cin >> vor_wert; // neu
  170. in_liste_einfuegen(anker, wert_neu, vor_wert); // neu
  171. liste_ausgeben(anker);
  172. liste_ausgeben_rueckwaerts(anker);
  173. system("PAUSE");
  174. return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement