Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Задача на структуры данных


Автор: ktejke 23.12.2008, 14:32
никак не могу сообразить, как обратиться к элементам очереди.

в задании нужно создать кнопку, при нажатии которой будет выводиться сумма четных элементов очереди.


вот отрывок из методички по этому заданию: 

III. Динамические очереди
Введение
Очереди являются универсальными структурами данных. По своей организации оче-реди делятся на прямые ( fifo - first in first out) и обратные ( lifo - last in first out). Существуют также их различные комбинации. Наибольшее распространение получили динамические очереди, реализуемые на основе связных списков.
Целью настоящей работы является начальное знакомство с организацией данных в виде простой lifo - очереди и ее реализация в среде визуального программирования. 
Элементами динамической очереди служат экземпляры класса List. В соответствии с объявлением этого класса (листинг ниже) каждый список содержит два обычных элемента  целого типа  info и link, в которых размещаются число (полезная информация) и адрес следующего связного  списка (служебная информация). Кроме этого, в классе List имеется статический элемент  top - адрес начала  очереди (один на все экземпляры). Его значение инициализируется при объявлении нулем (так как при создании экземпляра класса List очередь пуста). 
Конструктор класса List  выполняет заполнение данными нового списка и подключение его к существующей очереди, а деструктор – удаление уничто-жаемого списка из очереди. Сама же память под элемент очереди выделяется оператором new, а освобождается после использования оператором delete.
В классе List имеются два статических метода: show - показать списки и gettop - вернуть адрес вершины очереди. Следующий листинг содержит объяв-ление класса List и сразу же определяет некоторые его методы. В отчет поместите блок - схему деструктора класса.

Создайте в личном каталоге папку lifo , откройте новое приложение и разместите на форме  три кнопки. Очередь будет управляться щелчком левой клавиши мыши на соответствующей кнопке формы. Для этого подготовьте 
(с помощью мастера приложений) заготовки для обработчиков событий 
OnClick по каждой из кнопок. Кроме этого, в системе должна освобождаться динамическая память в случае, когда форма закрывается, но в очереди еще имеются элементы. Один из вариантов – определить обработчик события за-крытия формы. Подготовьте заготовку и для данного обработчика.
В header - файле формы разместите объявление класса List (смотри предыдущий листинг). В cpp – файле формы следует набрать код для невстро-енного метода  show , а также для обработчиков событий


в header-файле: 

Код


class List {static List* top;
int info;
List *link;
public: List ( int i)
{   link=top; //подключение списка к существующему
info = i; // заполнение информационной части списка 
top = this; // на вершине очереди - текущий список
// вывод сообщения о создании элемента очереди
char istr[10],str[40];//временные строки для MessageBox
_ltoa( this->info, istr, 10 );//функция, преобразующая
                                                                  //десятичное целое в строку
strcpy(str,"Создается элемент списка :");//формирование начала строки
strcat(str,istr);
MessageBox(0,str,"Создание",MB_OK); };//диалог MessageBox
~List (){
List *p;
char istr[10],str[40];
_ltoa( this->info, istr, 10 );
if(top==this)top= link;// элемент удаляется с вершины
else {
    for(p=top;p;p=p->link)if(p->link == this)break;
     if(p) p-> link = link;
     else                {
MessageBox(0,"Элемент не найден !",””, MB_OK);
 exit(1);              } }
//вывод сообщения об удалении элемента из очереди
strcpy(str,"Удаляется элемент списка :");
strcat(str,istr);
MessageBox(0,str,"Удаление",MB_OK); };
static void show();// демонстрация содержимого очереди
static List *gettop(){return top;}; };





в cpp-файле: 
Код


#include<stdlib.h>
#include<string.h>
#pragma hdrstop
#include "stat.h"
#pragma resource "*.dfm"
TForm1 *TForm1;
List* List::top=0;//top должен быть объявлен как глобальный
int element; //переменная, используемая для заполнения списков
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void List::show()
{    List *p; char istr[10],str[40];// просмотр списков
if(!top)MessageBox(0,"Список пуст","Нет элементов",MB_OK);
for(p=top;p;p=p->link)
{ _ltoa( p->info, istr, 10 );
strcpy(str,"Элемент списка :");
strcat(str,istr);
MessageBox(0,str,"Просмотр",MB_OK);
}     }
void __fastcall TForm1::Button1Click(TObject *Sender)
{ Visible=false;// скрываем форму на время MessageBox
  new List(element=rand());// добавляем в очередь элемент
  Visible=true;// восстанавливаем статус формы
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{ List *p; // вспомогательный указатель
  Visible=false;
  p = List::gettop();
  if( p ) delete p; //удаление элемента с вершины очереди
  Visible=true;}
void __fastcall TForm1::Button3Click(TObject *Sender)
{ Visible=false;
  List::show();
  Visible=true;}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{   //освобождение памяти при закрытии формы
List* p;// вспомогательный указатель
Visible=false;
while( p=List::gettop())delete p;//цикл по удалению остав-
 }                                                                         шихся списков из очереди



помогите, пожалуйста!  smile 

Автор: ktejke 23.12.2008, 23:53
все умники спят что ли? =(

Автор: Dmi3ev 24.12.2008, 00:05
Цитата

_ltoa( p->info, istr, 10 );
strcpy(str,"Элемент списка :");
strcat(str,istr);
MessageBox(0,str,"Просмотр",MB_OK);

ты это называешь элементом? тогда у тебя уже есть пример (p->info)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)