Это реализация двусвязного списка в c ++. Я пытаюсь вставить элементы в свой связанный список, поэтому я добавил числа 2, 2, 2, 4, 8, 7 перед печатью, я вызываю функцию быстрой сортировки, которая заменяетпоследний элемент (7) с предыдущим элементом (8) ..print выводит результат: 2,2,2,4, 7, 7 Как этот код можно изменить, чтобы получить правильный результат Вот мой код ..
#include <iostream>
using namespace std ;
template <class T>
class node
{
public :
T data;
node * next;
node * previous ;
};
template <class T>
class LinkedList
{
public:
string delimeter; // optional: just for printing
node<T>* addSorted(T v)
{
insert(T) ;
_quicksort(first , last) ;
}
void swap ( T* a, T* b )
{
T t = *a;
*a = *b;
*b = t;
}
node<T>* get(T v)
{
bool found = false ;
node<T> * Curr = first ;
while (!found)
{
if (Curr-> data == v )
found = true;
else
Curr = Curr-> next;
}
return Curr ;
}
// operator overloading for printing
friend ostream& operator<<(ostream& o, LinkedList<T> & c);
LinkedList()
{
node<T> * curr = new node<T> ;
first = last = curr;
first->next = last ;
first-> previous = NULL;
}
LinkedList(T value, int initial_size) // make n elements = value
{
node<T> * tempNode ;
node<T> * curr = new node<T> ;
first = last = curr;
first->previous =NULL;
for(int i = 0 ; i < initial_size ; i++)
{
tempNode = new node<T>;
tempNode->data = value ;
tempNode->next = first;
first->previous = tempNode;
first = tempNode ;
}
}
~LinkedList()
{
node<T> * current ;
while (first != last)
{
current = first ;
first = first-> next;
delete current;
}
delete last;
}
void print()
{
_quickSort(first, last);
//bubbleSort(first) ;
node<T> * Curr = first ;
while (Curr != NULL)
{
cout << Curr-> data <<"\t";
Curr = Curr-> next;
}
cout << endl;
}
int _size() // returns No. of elements
{
int NumOfelements = 0;
node<T> * temp = first ;
while (temp != last)
{
NumOfelements++;
temp = temp->next;
}
return NumOfelements ;
}
void insert(T value )
{
node<T> * temp = first ;
node<T> * dummy ;
node<T> * n = new node<T> ;
n->data = value;
last->data = value;
last->next = n;
n->previous = last;
last = n;
return;
while (temp != nullptr)
{
dummy = temp ;
temp = temp->next;
if(temp==last)
{
return;
}
}
dummy ->next = n ;
n -> previous = dummy;
n -> next = temp ;
temp-> previous =n;
// _quickSort(first, last) ;
//bubbleSort(first) ;
}
/* Considers last element as pivot, places the pivot element at its
correct position in sorted array, and places all smaller (smaller than
pivot) to left of pivot and all greater elements to right of pivot */
node<T>* pivot_partition(node<T> *f, node<T> *l)
{
// set pivot as l element
T x = l->data;
node<T> *i = f-> previous;
for (node<T> *j = f; j != l; j = j->next)
{
if (j->data <= x)
{
if (i == NULL)
i = f ;
else
i = i-> next ;
swap(&(i->data), &(j->data));
}
}
i = (i == NULL)? f : i->next; // Similar to i++
swap(&(i->data), &(l->data));
return i;
}
/* A recursive implementation of quicksort for linked list */
void _quickSort(node<T> *first, node<T> *last )
{
if (last != NULL && first != last && first != last->next)
{
node<T> *p = pivot_partition(first, last);
_quickSort(first, p->previous);
_quickSort(p->next, last);
}
}
T mylast () // even this returns 7 not 8
{
return last->data ;
}
private:
node<T> * first ;
node<T> * last ;
};
int main (){
LinkedList <int> l(2,3) ;
l.insert(4) ;
l.insert(8) ;
l.insert(7) ;
l.print() ;
return 0 ;
}