Помогите, пожалуйста, разобраться:
необходимо реализовать класс List, только не шаблонный, а на интах, я пытаюсь переделать код, представленный в Дейтлах, (там он шаблонный), в свой, помогите, кто может! Не понимаю, почему вывод получается наикривой?
Итак, код ниже. Чтобы было понятнее, расшифровываю идентификаторы:
res_ptr - указатель на резервный элемент (tempPtr)
el_1_ptr - указатель на начало списка (firstPtr)
el_n_ptr - указатель на конец списка (lastPtr)
tek_el_ptr - указатель на текущий элемент (currentPtr)
Код:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class List
{
private:
int *el_1_ptr;
int *el_n_ptr;
int znach;
int *next_ptr;
public:
// конструктор по умолчанию
List()
: el_1_ptr (0),
el_n_ptr (0)
{}
// вставить в начало списка
void insertAtFront (const int & value)
{
int *new_ptr = new_el(value);
if ( isEmpty() )
el_1_ptr = el_n_ptr = new_ptr;
else
{
next_ptr = el_1_ptr;
el_1_ptr = new_ptr;
}
}
// вставить в конец списка
void insertAtBack (const int & value)
{
int *new_ptr = new_el(value);
if ( isEmpty() )
el_1_ptr = el_n_ptr = new_ptr;
else
{
next_ptr = new_ptr;
el_n_ptr = new_ptr;
}
}
// удалить из начала списка
bool delFromFront (int & value)
{
if ( isEmpty() )
return false;
else
{
int *res_el_ptr = el_1_ptr;
if ( el_1_ptr == el_n_ptr )
el_1_ptr = el_n_ptr = 0;
else
{
el_1_ptr = next_ptr;
value = znach;
delete res_el_ptr;
return true;
}
}
}
// удалить из конца списка
bool delFromBack (int & value)
{
if ( isEmpty() )
return false;
else
{
int *res_el_ptr = el_n_ptr;
if ( el_1_ptr == el_n_ptr )
el_1_ptr = el_n_ptr = 0;
else
{
int *tek_el_ptr = el_1_ptr;
while (next_ptr != el_n_ptr)
tek_el_ptr = next_ptr;
el_n_ptr = tek_el_ptr;
next_ptr = 0;
}
value = znach;
delete res_el_ptr;
return true;
}
}
// возврат указателя на новый элемент
int *new_el (const int & value)
{
int v = value;
return &v;
}
// проверка элемента на наличие значения
bool isEmpty () const
{
return el_1_ptr == 0;
}
// вывод на экран
void print () const
{
if ( isEmpty() )
{
cout << "Spisok pust" << endl;
return;
}
int *tek_el_ptr = el_1_ptr;
cout << "Spisok sostoit iz: ";
while (tek_el_ptr != 0)
{
cout << *tek_el_ptr << ' ';
tek_el_ptr = next_ptr;
}
cout << endl;
}
// деструктор
~List()
{
if (!isEmpty() )
{
cout << "Destroying nodes ..." << endl;
int *el_ptr = el_1_ptr;
int *res_el_ptr;
while (el_ptr != 0)
{
res_el_ptr = el_ptr;
cout << znach << endl;
el_ptr = next_ptr;
delete res_el_ptr;
}
}
cout<< "All nodes destroyed" <<endl;
}
};
int main()
{
/*cout<<endl<<"Testirovanie vektor"<<endl;
Vector vec;
vec.setVector();
vec.getVector();
vec.sort();
cout<<"Poisk po kluchu=3: vec[3]="<<vec.search(3)<<endl;*/
cout<<endl<<"Testirovanie list"<<endl;
List list;
cout<<"Komandy:"<<endl;
cout<<"1-vstavit v nachalo"<<endl;
cout<<"2-vstavit v konez"<<endl;
cout<<"3-udalit iz nachala"<<endl;
cout<<"4-udalit iz konza"<<endl;
cout<<"5-konez"<<endl;
int komanda;
int value;
do
{
cout<<"?: ";
cin>>komanda;
switch(komanda)
{
case 1:
cout<<"Vstavka v nachalo spiska. Vvedite chislo: ";
cin>>value;
list.insertAtFront(value);
list.print();
break;
case 2:
cout<<"Vstavka v konez spiska. Vvedite chislo: ";
cin>>value;
list.insertAtBack(value);
list.print();
break;
case 3:
cout<<"Udalenie iz nachala spiska. Vvedite chislo: ";
cin>>value;
list.delFromFront(value);
list.print();
break;
case 4:
cout<<"Udalenie iz konza spiska. Vvedite chislo: ";
cin>>value;
list.delFromBack(value);
list.print();
break;
}
} while (komanda != 5);
system("pause");
return 0;
}