Learnignc Ответов: 1

Как написать функцию вставки в общий список C++ ?


Я пишу код для универсального списка на c++ : в этом lise у меня есть Генический узел (что означает , что данные в нем могут быть любого типа) и итератор класса , который итератор, что его работа состоит в том, чтобы указать на конкретный узел в списке, также итератор может указывать на любой другой список, поэтому в его классе я добавил указатель на текущий список .
моя проблема заключается в функции insert, где я вставляю новый узел в список,
и в этой функции, если итератор указывает в конец списка, мы добавляем новый узел в конец списка, иначе мы вставляем узел на одно место перед узлом , на который в данный момент указывает итератор, и если итератор указывает на другой узел, то это ошибка ..

моя проблема заключается в том, что функция вставляет только первый узел .. в чем может быть проблема? я никак не могу этого понять :\

Что я уже пробовал:

#include <iostream>
#include <assert.h>

class List {

public:
    List();
    List(const List&);
    ~List();
    List<T>& operator=(const List& list);
    template <class E>
    class ListNode {
        private:
             E data;
             ListNode(const E& t, ListNode<E> *next):data(t), next(next){}
             ~ListNode(){delete next;}
             ListNode<E> *next;
        public:
            friend class List<E>;  //??
            friend class Iterator;   // ??
            E getData() const{
               return this->data;
            }
            ListNode<E>* getNext() const{
               return this->next;
            }
            };
    class Iterator {
        List<T>* list;
        ListNode<T>* current;
        Iterator( List<T>* list=NULL, ListNode<T>* current=NULL);
        friend class List<T>;
        friend class ListNode<T>;
    public:
     ///// functions for iterator
    };
    Iterator begin() ;
    Iterator end() ;
    void insert(const T& data, Iterator iterator=0); // what is wrong with you //!! just insert two more elements i want to sleep
    void remove(Iterator iterator);
    class Predicate{
    private:
      T target;
    public:
      Predicate(T i) : target(i) {}
      bool operator()(const T& i) const {
        return i == target;
      }
    };
    Iterator find(const Predicate& predicate);
    class Compare{
    private:
      T target;
    public:
      Compare(T i) : target(i) {}
      bool operator()(const T& i) const {
        return i < target;
      }
    };
    void sort(const Compare& compare);
    bool operator==(const List& list);
    bool operator!=(const List& list);
    int getSize() const;
    bool empty() const;

    int compareLinkedList(ListNode<T> *node1,  ListNode<T> *node2);

private:
   ListNode<T> *head;
   ListNode<T> *tail;
int size;
};



// my lovely insert function (not really :'((((  )
template <typename T>
void List<T>::insert(const T& data, Iterator iterator){
    if(iterator.list!=this){
        throw mtm::ListExceptions::ElementNotFound();
        return;
    }
    ListNode<T> *newNode = new ListNode<T>(data, NULL);
    if(iterator.current==this->end().current){
        newNode->next=this->end().current;
        Iterator temp=end();
        temp--;
        temp.current->next=newNode;
           }
    else {
    if (head == NULL) {
    head = newNode;
    }
   else {
       Iterator temp1=iterator;
        temp1--;
        temp1.current->next=newNode;
        temp1++;
        newNode->next=temp1.current;

   }

   }
    size++;
}



and how i tested the list :


static void listExample(){
    List<int> list;
    list.insert(1, list.end());
    list.insert(2, list.end());
    list.insert(3, list.end());

    int counter = 1;
  for (List<int>::Iterator it = list.begin(); it != list.end(); ++it) {   // ????
    ASSERT_EQUALS(counter++, *it);
  }

Learnignc

helppppp plzzzzzzz anyoneeeeeeeeeeeeeeeeeeee

1 Ответов

Рейтинг:
0

KarstenK

Если вы хотите вставить элемент в середине списка, вы должны решить, где, как правило, "вставить в позицию".

Для этого
1. Вы перечисляете вставленную позицию,
2. добавьте новую запись как последователь элемента до
3. Установите старый элемент в качестве последователя нового элемента

Некоторые учебные материалы: фундаментальная теория с картинками о списки в C.