Probleme mit LinkedList



  • Hallo,

    ich habe eine LinkedList implementiert, also ein Liste mit Elementen, die jeweils einen Zeiger auf ihr vorheriges und ihr nächstes Element haben. Die Liste sekbst hat einen Zeiger auf ihr erstes Element (lowest) und ihr letztes Element (highest). Die Listenelemente sind anhand einer Nummer, die jedem Element als Wert zugewiesen ist, sortiert. Mein Code zum Einfügen eines Elementes in die Liste sieht so aus:

    void insert(Cell* cell_to_insert) {
                Cell* temp;
                Cell* temp2;
                if (lowest == NULL) {
                    lowest = cell_to_insert;
                    lowest->set_previous(NULL);
                    lowest->set_next(NULL);
                } else if (lowest->get_number() > cell_to_insert->get_number()) {
                    temp = lowest;
                    lowest = cell_to_insert;
                    lowest->set_previous(NULL);
                    lowest->set_next(temp);
                    temp->set_previous(lowest);
                } else {
                    temp = lowest;
                    while (true) {
                        if (temp->get_number() <= cell_to_insert->get_number()) {
                            if (temp-get_next() != NULL) {
                                temp2 = temp->get_next();
                                cell_to_insert->set_next(temp2);
                            } else {
                                cell_to_insert->set_next(NULL);
                            }
                            cell_to_insert->set_previous(temp);
                            temp->set_next(cell_to_insert);
                            break;
                        }
                        temp = temp->get_next();
                    }
                }
    

    Der erste Fall (Einfügen in leere Liste) und der zweite Fall (Einfügen vor erstem Element) funktionieren, nur der dritte nicht (Einfügen irgendwo nach dem ersten Element), da wird generell nach dem ersten Element eingefuegt. Faellt irgendjemandem was auf?

    Marco

    [ Dieser Beitrag wurde am 04.05.2003 um 13:16 Uhr von marcoow editiert. ]



  • Original erstellt von marcoow:
    **Faellt irgendjemandem was auf?
    **

    1. Geschmaksache, aber dein Code ist (fuer mich) schwer lesbar
      weil die Blöcke recht unübersichtlich sind.

    2. weil "insert" keine Klassenmethode ist, nehme ich an dass "lowest" global
      ist, was ziemlich schlecht ist. Du solltest diese Var als Parameter mitgeben.

    3. while (true) break finde ich hässlich... ginge das nicht auch mit
      mit Abbruch-Bedingung ?

    4. lässt sich "if (temp-get_next() != NULL)" bei dir überhaupt übersetzen ?
      Müsste das nicht heissen "if (temp->get_next() != NULL)" ?

    5. du verwendest ja eine doppelt verlinkte Liste, müsste da nicht mal auch
      "highest" modifiziert werden ?

    6. programmer->shutdown_pc(); programmer->move_to_sun();



  • Das ist eine Klassenmethode, ich hab's nur rauskopiert. temp-get_next() ist ein Tipfehler, temp->get_next() geht auch nicht. highest müßte auch geändert werden, aber so lange das andere nicht richtig funktioniert, interessiert miahc das erst mal noch nicht.

    [ Dieser Beitrag wurde am 04.05.2003 um 14:00 Uhr von marcoow editiert. ]



  • Ich habe was rausgefunden. get_number() liefert keine Wert zurück. Der Code sieht so aus:

    class Cell {
    
        private:
            Cell* next;
            Cell* previous;
    
        public:
            Cell(Cell* next = NULL, Cell* previous = NULL) {
    
            }
    
            virtual ~Cell() {
    
            }
    
            Cell& operator=(const Cell&) {
    
            }
    
            virtual void display() const = 0;
    
            virtual int get_number() const = 0;
    
            void set_next(Cell* cell_to_set) {
                next = cell_to_set;
            }
    
            void set_previous(Cell* cell_to_set) {
                previous = cell_to_set;
            }
    
            Cell* get_next() const {
                return next;
            }
    
            Cell* get_previous() const {
                return previous;
            }
    
    };
    
    .
    .
    .
    
    class BaseEl : public Cell {
    
        private:
            int customer_number;
            string customer_name;
    
        public:
            BaseEl(int number, string name) {
                customer_number = number;
                customer_name = name;
            }
    
            ~BaseEl() {
    
            }
    
            int get_number() const {
                return customer_number;
            }
    
            string get_name() const {
                return customer_name;
            }
    
            void display() const {
                cout << "Nummer:       " << get_number() << "\nName:         " << get_name() << "\n";
            }
    
    };
    
    .
    .
    .
    
    class LinkedList {
    
        private:
            Cell* lowest;
            Cell* highest;
    
        public:
            LinkedList(Cell* lowest = NULL, Cell* highest = NULL) {
    
            }
    
            ~LinkedList() {
    
            }
    
            void set_lowest(Cell* lowest_cell) {
                lowest = lowest_cell;
            }
    
            void set_highest(Cell* lowest_cell) {
                lowest = lowest_cell;
            }
    
            Cell* get_lowest() const {
                return lowest;
            }
    
            Cell* get_highest() const {
                return highest;
            }
    
            void insert(Cell* cell_to_insert) {
          Cell* temp;
          Cell* temp2;
          if (lowest == NULL) {
            lowest = cell_to_insert;
            lowest->set_previous(NULL);
            lowest->set_next(NULL);
          } else if (lowest->get_number() > cell_to_insert->get_number()) {
            temp = lowest;
            lowest = cell_to_insert;
            lowest->set_previous(NULL);
            lowest->set_next(temp);
            temp->set_previous(lowest);
          } else {
            temp = lowest;
            while (true) {
                        cout << "test";
              if (cell_to_insert->get_number() > temp->get_number()) {
                            cout << "Nummer: " + temp->get_number();
                            //cell_to_insert->display();
                if (temp->get_next() != NULL) {
                  temp2 = temp->get_next();
                  cell_to_insert->set_next(temp2);
                } else {
                  cell_to_insert->set_next(NULL);
                }
                cell_to_insert->set_previous(temp);
                temp->set_next(cell_to_insert);
                break;
              }
              temp = temp->get_next();
            }
          }
            }
    
            void delete_cell(int customer_number) {
                Cell* temp;
                temp = lowest;
                do {
                    if (temp->get_number() == customer_number) {
                        temp->~Cell();
                        if (temp == lowest) {
                            lowest = NULL;
                        }
                        break;
                    } else {
                        temp = temp->get_next();
                    }
                } while (temp != NULL);
                if (temp == NULL) {
                    cout << "Kein Eintrag zu dieser Kundennummer gefunden.\n";
                }
            }
    
            void retrieve(int customer_number) {
                Cell* temp;
                if (lowest != NULL) {
                    temp = lowest;
                    do {
                        if (temp->get_number() == customer_number) {
                            temp->display();
                            break;
                        } else {
                            temp = temp->get_next();
                        }
                    } while (temp != NULL);
                    if (temp == NULL) {
                        cout << "Kein Eintrag zu dieser Kundennummer gefunden.\n";
                    }
                } else {
                    cout << "keine Eintraege vorhanden!\n";
                }
            }
    
            void display() {
                Cell* temp;
                if (lowest != NULL) {
                    temp = lowest;
                    do {
                        temp->display();
                        temp = temp->get_next();
                    } while (temp != NULL);
                } else {
                    cout << "keine Eintraege vorhanden!\n";
                }
            }
    };
    

    Ich bin noch ziemlicher Anfänger in C++. Kann mir irgendjemand sagen, was ich da falsch gemacht habe?

    Marco


Anmelden zum Antworten