Помогите решить задачку.
1. Реализуйте АТД “Список” для любого типа данных и его операторы (INSERT, LOCATE, RETRIEVE, DELETE, NEXT, PREVIOUS, MAKENULL, FIRST, PRINTLIST), используя массив.
2. Создайте программу позволяющую объединять несколько списков в один.
Первую я вроде бы сделал... А вторую надо на на основе нее, но у меня не получается. Вот первая:
Код:
#include <iostream>
using namespace std;
typedef int T;
struct elem
{
T val;
elem* prev;
elem* next;
};
class list{
private:
static const int def_size = 4;
T* values;
int count, val_size;
void expand(int);
public:
list();
~list();
list(const list&);
list& operator=(const list&);
T* BEGIN() const {return values;}
T* END() const {return values+count;};
T NEXT(int i) const {return *(values+i+1);}
T PREVIOUS(int i) const {return *(values+i-1);}
void INSERT(T value, int position);
int FIND(T value) const;
int SIZE() const {return count;}
void CLEAR();
void DELETE(int position);
int operator[](int i) const {return values[i];};
friend ostream& operator<< (ostream& os, const list& l);
};
list::list(){
count = 0;
val_size = def_size;
values = new T[val_size];
}
list::list(const list& l){
count = l.count;
val_size = l.val_size;
values = new T[val_size];
for(int i=0; i< count; i++)
values[i] = l.values[i];
}
list& list::operator=(const list& l){
if(&l == this) return *this;
delete[] values;
count = l.count;
val_size = l.val_size;
values = new T[val_size];
for(int i=0; i< count; i++)
values[i] = l.values[i];
return *this;
}
void list::expand(int increment){
val_size += increment;
T* newmas = new T[val_size];
for(int i=0; i< count; i++)
newmas[i] = values[i];
delete[] values;
values = newmas;
}
void list::CLEAR(){ // очистить
count = 0;
val_size = def_size;
delete[] values;
values = new T[val_size];
}
void list::INSERT(T value, int position){ // вставить в список новый элемент
if(count >= val_size-1) expand(5);
for(int i=count; i>= position; i--){
values[i+1] = values[i];
}
values[position] = value;
count ++;
}
void list::DELETE(int position){ // удалить этот элемент
for(int i= position; i< count; i++)
values[i] = values[i+1];
count --;
}
int list::FIND(T value) const{ // найти элемент со значением value
for(int i=0; i< count; i++)
if(values[i] == value) return i;
return -1;
}
list::~list(){
delete[] values;
}
ostream& operator << (ostream& os, const list& l) {
if(l.count == 0)return os << "empty list\r\n";
for (int i = 0; i < l.count; i++)
cout << l.values[i] << " ";
return os << "\r\n";
}
int main() {
list l;
cout << l;
l.INSERT(10, 0);
cout << l;
l.INSERT(21, 1);
cout << l;
l.INSERT(55, l.FIND(10));
cout << l;
l.INSERT(57, 2);
list m;
m = l;
cout << m;
cout << l;
cout << l.NEXT(l.FIND(55)) << endl;
cout << l.PREVIOUS(l.FIND(21)) << endl;
cout << l.PREVIOUS(l.SIZE()) << endl;
cout << l.SIZE() << endl;
cout << *l.BEGIN() << endl << *(l.END()-1) << endl;
l.DELETE(l.FIND(21));
cout << l;
l.CLEAR();
m.CLEAR();
cout << l;
}