C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Элементы списка, с++ Builder6
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

Вернуться в Вопросы программирования в C++Builder