Zeigerproblem

  • Zeigerproblem

    Versuche ein Klassentemplate für eine lineare Liste von Knoten. Der next-Zeiger scheint irgendwo auf NULL zu zeigen, was in einer Access-Violation endet. Bitte um Hilfe!

    Hier der Quellcode

    Quellcode

    1. #include <iostream.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. template <typename T> struct Node
    5. {
    6. Node() : next (0) {};
    7. T data;
    8. Node* next;
    9. };
    10. template <typename T> class Liste
    11. {
    12. public:
    13. typedef T Type;
    14. typedef Node<Type> NodeType;
    15. typedef NodeType* NodePointer;
    16. NodePointer first;
    17. void einfuegen(const T& wert)
    18. {
    19. NodePointer n = new NodeType;
    20. n->data = wert;
    21. n->next = first;
    22. first = n;
    23. }
    24. void loeschen()
    25. {
    26. NodePointer temp = first;
    27. first= first->next;
    28. delete temp;
    29. }
    30. void anzeigen()
    31. {
    32. NodePointer current = first;
    33. while(current != NULL)
    34. {//hier scheint das Problem zu liegen
    35. cout << current->data <<endl;
    36. current = current->next;
    37. }
    38. }
    39. };
    40. int main()
    41. {
    42. Liste<float> lst;
    43. lst.einfuegen(1.5f);
    44. lst.einfuegen(4.3f);
    45. lst.einfuegen(3.1f);
    46. lst.anzeigen();
    47. lst.loeschen();
    48. lst.anzeigen();
    49. return 0;
    50. getch();
    51. };
    Alles anzeigen
  • Hi chris,
    der Fehler liegt IMHO nicht in der Methode anzeigen() sondern in einem nicht initialisierten first-pointer. Für sowas ist normalerweise ein Constructor zuständig.
    Also in etwa:

    Quellcode

    1. Liste(void) : first(NULL) {}

    würde fürs Erste ausreichen, denk ich.

    Btw:
    * Normalerweise sollte der pointer first private sein, oder?
    * Ist vielleicht Geschmackssache aber der Unterschied zwischen 0 und NULL: Letzteres ist schlichtweg ein Macro, das nach ((void *)0L) aufgelöst wird - und vom Typ her ganz klar ein Pointer ist. Im Constructor von Node verwendest du 0 zum initialisieren eines Pointers. Wenn du hier NULL verwendest wird dadurch schon klar, dass "next" ein Pointer ist und kein int. Ausserdem prüfst du später auf NULL.