Как написать функцию вставки в общий список 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