Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2011, 23:03   #1
№_1
 
Регистрация: 16.03.2011
Сообщений: 3
По умолчанию Программирование на С++

Помогите решить задачку.
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;
}
№_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование или web-программирование? Дмитрий Батогов Помощь студентам 3 23.06.2011 14:14
Программирование на С ! Armon Помощь студентам 1 30.05.2011 16:51
Программирование на С# okfx Фриланс 1 04.09.2010 13:11