Sergej Filenko |
Отправлено: 17.06.2006, 22:30 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 5
|
Уважаемые программисты помогите пожалуйста. Я совсем запарился с этими элементами.
Тему не понял и почитать об этом не знаю где. В общем начали проходить тему Классы. И вот список элементов через создание объектов я не понял. Ранее через структуры и указатели список элементов проходили. Я эту тему упустил и теперь трудно разобраться.
Нужно продолжить программу не меняя кода. Только дополнить новым методом ausgeben_new() — который бы выводил список элементов в обратном порядке. И вызвать этом метод в конце программы. После метода ausgeben().
CODE | #include <iostream.h>
class listenelement
{
char daten[30];
listenelement* next;
public:
void setdaten(char datenneu[30]); //копируем данные
void init(); //инициализация
void einfuegen (char datenneu[30]); //новый элемент вводим
void ausgeben(); // на экран
void ende(); //удаляем все элементы
void ausgeben_new(char datenneu[30]); // элементы в обратном порядке
};
//--------------------------------------------------------------
//Methoden:
void listenelement::setdaten(char datenneu[30])
{
strcpy(daten,datenneu);
}
void listenelement::init()
{
next=NULL;
}
void listenelement::einfuegen(char datenneu[30])// новый объект
{
if (next==NULL)
{
next = new(listenelement);
next->init();
next->setdaten(datenneu);
}
else
{
next->einfuegen(datenneu);
}
}
void listenelement::ausgeben()
{
cout << daten << '\n';
if (next != NULL)
{
next->ausgeben();
}
}
void listenelement::ende()
{
if (next != NULL)
{
next->ende();
delete(next);
}
}
listenelement* liste;
void listenelement::ausgeben_new(char datenneu[30]) //список в обратном порядке
//? ??
//Funktions
void init()
{
liste= new(listenelement);
liste->init();
liste->setdaten("Element 0");
}
void ende()
{
liste->ende();
delete(liste);
liste=NULL;
}
void main()
{
init();
liste->einfuegen("Element 1");
liste->einfuegen("Element 2");
liste->ausgeben();
ende();
char p[50];
cin.getline(p,50);
} |
Отредактировано Konstantine — 18/06/2006, 22:41 |
|
ShibaOn |
Отправлено: 01.07.2006, 09:24 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 37
|
Тут фишка как раз и заключается в том, что обратиться к какому то элементу мы можем, только последством перебора от начала и до необходимого элемента, что собственно у тебя и просходит:
CODE |
void listenelement::ausgeben()
{
cout << daten << '\n';
if (next != NULL) {
next->ausgeben(); // вызов метода следующего элемента
}
}
|
Дык вот, для того, чтобы иметь возможность обращаться к элементам в обратном порядке, необходимо вменить поле в классе listenelement, указывающее на предидущий элемент:
CODE |
class listenelement
{
char daten[30];
listenelement *next;
listenelement *prev;
. . .
|
При добавлении нового экземпляра в очередь необходимо это поле заполнять, я бы решил эту проблему добавлением в init() параметра listenelement *APrev:
CODE |
void listenelement::init(listenelement *APrev)
{
next = NULL;
prev = APrev;
}
|
А при вызове я бы писал
CODE |
liste= new(listenelement);
liste->init(this);
liste->setdaten("Element 0");
|
И после этого функция void listenelement::ausgeben_new(char datenneu[30]) будет выглядеть следующим образом:
CODE |
void listenelement::ausgeben_new(char datenneu[30])
{
if (next != NULL){
prev->ausgeben();
}
}
|
Теперь все. Ах да, чуть не забыл, при создании первого элемента:
CODE |
void init()
{
liste= new(listenelement);
liste->init(NULL); // предъидущего элемента не существует
liste->setdaten("Element 0");
}
|
Отредактировано ShibaOn — 01/07/2006, 09:29
|
|
|