Klasse für Listenzugriff



  • Hallo muss aus diesen implementierten Funktionen eine Klasse für einen Listenzugriff schreiben! Kann mir jemand dafür einen Ansatz geben?
    Ich kenne natürlich den Aufbau von Klassen, aber weiß nicht so recht wie ich das mit den structs und so machen soll!

    Gruß Jens

    #include <iostream>
    
    using namespace std;
    
    // Ein Listenelement
    struct IntListElem {
      IntListElem *next;    // Zeiger auf nächstes Element
      int value;            // Daten zu diesem Element
    };
    
    // Eine Liste
    struct IntList {
      int count;            // Anzahl Elemente in der Liste
      IntListElem *first;   // Zeiger auf erstes Element der Liste
    };
    
    // Initialisiere eine Listenstruktur. Die Liste wird als Referenz,
    // nicht als Wert übergeben, es kann also der Inhalt geändert werden
    void empty_list (IntList &l) {
      l.first = 0;  // 0 ist keine gueltige Adresse: Liste ist leer
      l.count = 0;
    }
    
    // erstes Vorkommen von x in Liste suchen
    IntListElem* find_first_x (IntList &l, int x) {
      for (IntListElem* p=l.first; p!=0; p=p->next)
        if (p->value==x) return p;
    
      return 0;
    }
    
    // erstes Vorkommen von x in Liste suchen
    IntListElem* find_first_before_x (IntList &l, int x) {
      for (IntListElem* p=l.first; p!=0; p=p->next)
        if ((p->next != 0) && (p->next->value == x))
          return p;
    
      return 0;
    }
    
    // Fuege ein Element nach einem gegebenem ein
    void insert_in_list_at_pos (IntList &list,
                    IntListElem * where,
                    IntListElem * ins)
    {
      if (where == 0)       // fuege am Anfang ein
      {
        ins->next = list.first;
        list.first = ins;
        list.count = list.count + 1;
      }
      else              // fuege nach where ein
      {
        ins->next = where->next;
        where->next = ins;
        list.count = list.count + 1;
      }
    }
    
    // Entferne ein Element nach einem gegebenem
    // Liefere das entfernte Element zurueck
    IntListElem *remove_from_list_after_pos (IntList &list, IntListElem * where)
    {
      IntListElem *p;       // das entfernte Element
    
      // where==0 dann entferne erstes Element
      if (where == 0)
      {
        p = list.first;
        if (p != 0)
        {
          list.first = p->next;
          list.count = list.count - 1;
        }
        return p;
      }
    
      // entferne Element nach where
      p = where->next;
      if (p != 0)
      {
        where->next = p->next;
        list.count = list.count - 1;
      };
    
      return p;
    }
    
    // eine Zahl am Anfang der Liste einfügen
    void insert_in_list (IntList &list, int x) {
      IntListElem* elem = new IntListElem;
    
      elem->value = x;
    
      insert_in_list_at_pos(list, 0, elem);
    };
    
    // erstes Vorkommen der Zahl x in der Liste löschen
    IntListElem* remove_from_list(IntList &list, int x) {
      // suche das Element vor x
      IntListElem* p = find_first_before_x(list, x);
    
      // wurde es gefunden?
      if (p != 0)
      {
        // normal das Element entfernen
        p = remove_from_list_after_pos(list, p);
      }
      else
      {
        // kein Element vor x kann auch heissen, dass x das erste Element ist
        if ((list.first != 0) && (list.first->value == x))
          p = remove_from_list_after_pos(list, 0);
      };
    
      // Speicher für Element wieder freigeben
      delete p;
    
      return 0;
    };
    
    // Zugriff auf Anzahl der Elemente
    int list_num (IntList& l)
    {
      return l.count;
    };
    
    // Liste ausgeben
    void print_list (IntList& l)
    {
      cout << list_num(l) << " Elemente: ";
    
      cout << "(";
      for (IntListElem* p=l.first; p!=0; p=p->next)
        cout << " " << p->value;
      cout << " )" << endl;
    }
    
    // Listendaten entfernen
    void discard_list (IntList& l)
    {
      IntListElem* p = l.first;
    
      while (p != 0)
      {
        IntListElem* next = p->next;
        delete p;
        p = next;
      };
    };
    
    int main () {
      IntList list;
    
      // Liste initialisieren (leeren)
      empty_list(list);
    
      for (int i=20; i > 0; i = i - 1)
        insert_in_list(list, i);
    
      print_list(list);
    
      for (int i=0; i < 15; i = i + 1)
        remove_from_list(list, i);
    
      print_list(list);
    
      discard_list(list);
    
      system("Pause");
    };
    


  • Schau dir doch mal den Header <list> an, der dürfte dir eventuell ein paar Ansätze geben 😉 (Ansonsten würde ich aus den ganzen Funktionen lieber Methoden der Klasse 'InTList' machen, anstatt sie global zu definieren)


Anmelden zum Antworten