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


Автор: arsikjkeee 10.12.2008, 15:22
В HIDER-файле

Код

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);// добавляем в очередь элемент
  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;//цикл по удалению остав-
 }                                                                         шихся списков из очереди



ЗАДАНИЕ: Добавьте в систему функцию увеличения значений элементов очереди на заданную величину 


 ! 
Rodman
Модератор: Используйте подсветку кода!


Автор: radow 10.12.2008, 16:54
Что такое top, link. 

Автор: radow 10.12.2008, 17:37
Реализация очереди в виде двухсвязного списка
hider файл
Код

template <class T>
struct ElemTurn{
    T data;
    ElemTurn<T> *IndexNext;
    ElemTurn<T> *IndexBack;
    ElemTurn(T d):data(d), IndexNext(0), IndexBack(0){}
    ElemTurn(){}
};

template <class T>
class Turn
{
    int SizeTurn;
    ElemTurn<T> *IndexHead, *IndexTail;
public:
    Turn();
    Turn(const Turn<T>&);
    ~Turn();
public:
        bool DelTail();
        void NewData(T NewData);//ф-ция увеличения данных очереди


cpp файл
Код

template <class T>
istream & operator>>(istream&, Turn<T>&);

template <class T>
Turn<T>::Turn():IndexHead(NULL),IndexTail(NULL),SizeTurn(0)
{
}

template <class T>
Turn<T>::Turn(const Turn<T>& ob)
{
    ElemTurn<T> *p = ob.IndexHead;
    ElemTurn<T> *pOld = new ElemTurn<T>(p->data);
    this->SizeTurn=0;
    this->IndexHead=pOld;
    this->IndexHead->IndexBack=NULL;
    p=p->IndexNext;
    while(p)
    {    
        ElemTurn<T> *pNew = new ElemTurn<T>(p->data);
        pOld->IndexNext=pNew;
        pNew->IndexBack=pOld;
        pOld=pNew;
        p=p->IndexNext;
    }
    this->SizeTurn=ob.SizeTurn;
    this->IndexTail=pOld;
    this->IndexTail->IndexNext=NULL;
}

template <class T>
Turn<T>::~Turn(void)
{
    while(this->DelTail());
}
template <class T>
bool Turn<T>::DelTail()
{
    ElemTurn<T> *p, *pBack;
    if(this->SizeTurn==0)
    {
        return false;
    }
    p=this->IndexTail;
    pBack = p->IndexBack;
    this->IndexTail=pBack;
    if(this->IndexTail)
    {
        this->IndexTail->IndexNext=NULL;
    }
    this->SizeTurn--;
    delete[]p;
    return true;
}
[color=darkred]  ф-ция увеличения данных очереди
template <class T>
void Turn<T>::NewData(T NewData)
{
     ElemTurn *p = this->IndexHead;
    while(p)
    {
        p->data+=NewData;
        p=p->IndexNext;
    }
}[/color]


Автор: Earnest 10.12.2008, 18:59
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: arsikjkeee 10.12.2008, 20:47
Цитата(radow @ 10.12.2008,  17:37)
Реализация очереди в виде двухсвязного списка
hider файл
Код

template <class T>
struct ElemTurn{
    T data;
    ElemTurn<T> *IndexNext;
    ElemTurn<T> *IndexBack;
    ElemTurn(T d):data(d), IndexNext(0), IndexBack(0){}
    ElemTurn(){}
};

template <class T>
class Turn
{
    int SizeTurn;
    ElemTurn<T> *IndexHead, *IndexTail;
public:
    Turn();
    Turn(const Turn<T>&);
    ~Turn();
public:
        bool DelTail();
        void NewData(T NewData);//ф-ция увеличения данных очереди


cpp файл
Код

template <class T>
istream & operator>>(istream&, Turn<T>&);

template <class T>
Turn<T>::Turn():IndexHead(NULL),IndexTail(NULL),SizeTurn(0)
{
}

template <class T>
Turn<T>::Turn(const Turn<T>& ob)
{
    ElemTurn<T> *p = ob.IndexHead;
    ElemTurn<T> *pOld = new ElemTurn<T>(p->data);
    this->SizeTurn=0;
    this->IndexHead=pOld;
    this->IndexHead->IndexBack=NULL;
    p=p->IndexNext;
    while(p)
    {    
        ElemTurn<T> *pNew = new ElemTurn<T>(p->data);
        pOld->IndexNext=pNew;
        pNew->IndexBack=pOld;
        pOld=pNew;
        p=p->IndexNext;
    }
    this->SizeTurn=ob.SizeTurn;
    this->IndexTail=pOld;
    this->IndexTail->IndexNext=NULL;
}

template <class T>
Turn<T>::~Turn(void)
{
    while(this->DelTail());
}
template <class T>
bool Turn<T>::DelTail()
{
    ElemTurn<T> *p, *pBack;
    if(this->SizeTurn==0)
    {
        return false;
    }
    p=this->IndexTail;
    pBack = p->IndexBack;
    this->IndexTail=pBack;
    if(this->IndexTail)
    {
        this->IndexTail->IndexNext=NULL;
    }
    this->SizeTurn--;
    delete[]p;
    return true;
}
[color=darkred]  ф-ция увеличения данных очереди
template <class T>
void Turn<T>::NewData(T NewData)
{
     ElemTurn *p = this->IndexHead;
    while(p)
    {
        p->data+=NewData;
        p=p->IndexNext;
    }
}[/color]


спасибо....., но зачем мне реализация очереди в виде двухсвязного списка???
мне нужно увеличение очереди на заданное значение....заранее спасибо)

Автор: radow 12.12.2008, 16:57
очередь в виде чего реализована(массив, список(односвязный, двухсвязный))

Автор: arsikjkeee 15.12.2008, 15:22
я без понятия вообще  smile 

Автор: arsikjkeee 15.12.2008, 17:22
модератор ты меня заебал уже

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