Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C++]организация структуры данных "очередь"

14K
24 марта 2007 года
Krazist
60 / / 13.03.2007
Здравствуйте, помогите пожалуйста написать программу в Builder C++ 6 в консольном приложении.
Задание такое:
Организовать структуру данных очередь, элементам которой является точка пространства (x, y, z).
В программе информация помещается в конец и удаляется в момент,когда, наконец, достигает ее начала.
Она должна содержать подпрограммы добавления, удаления и чтения элемента.[[COLOR=darkorange]Помогите[/COLOR]]:confused: :confused: :confused:

Очередь - динамическая структура данных, так как с течением времени длина очереди
(количество входящих в нее звеньев) изменяется.
Например, все мы знакомы с очередью людей у кассы в магазине самообслуживания
или очередью автомобилей у бензозаправочной станции.
Вновь прибывшие становятся в один конец очереди и покидают ее после оплаты покупок
или заправки с другого.

Элементы списка определяются как:

[COLOR=darkorange]struct NODE{ double x, y, z; struct NODE *next; }[/COLOR]
9
24 марта 2007 года
Lerkin
3.0K / / 25.03.2003
Могу предложить реализацию на шаблончиках. Строго С++! :)
Код:
// 3D вектор
template <typename T>
struct vec3d
{
    T x, y, z;

    vec3d( void ) {;}

    vec3d( T _x, T _y, T _z)
    {
    x = _x, y = _y, z = _z;
    }

    vec3d<T>& operator =(const vec3d<T>& _vec)
    {
    x = _vec.x, y = _vec.y, z = _vec.z;
    return *this;
    }
};

Класс (структурку) 3D-вектора удобно сделать параметризованным, и не меняя реализации - изменять тип элементов вектора (double, float, int).

Код:
// узел очереди
template <typename T>
struct node
{
    T info;
    node<T>* next;

    node( void ): next( NULL ) {;}
   ~node( void ) {;}
};

// очередь
template <typename T>
struct queue
{
typedef node<T>* ptr_node;

    unsigned int n;
    ptr_node begin, end;

    queue( void )
    {
    n = 0;
    end = begin = NULL;
    }

   ~queue( void )
    {
    clear();
    }

    // очистить список
    void clear( void )
    {
    while( begin )
    {
        ptr_node p = begin;
        begin = p->next;
        delete p;
    }

    n = 0;
    begin = end = NULL;
    }

    // получить количество элементов в списке
    unsigned int size( void )
    {
    return n;
    }

    // поместить элемент в очередь (очередь растет)
    void put( T info )
    {
    ptr_node p = new node<T>;

    if( !end )
        begin = end = p;
    else
    {
        end->next = p;
        end = p;
    }

    n++;
    }

    // получить элемент из очереди (без удаления)
    T get( void )
    {
    return end->info;
    }
};

Вот, собственно (ужасно обрезанная) версия очереди. Без проверки на ошибки и т.д.
Если такой подход катит, то попытайся сам написать функцию получения элемента с его удалением из очереди. Очень, знаешь ли, полезно для самообразования ;)

Код:
// пример использования
int main( void )
{
typedef vec3d<double> vec;

    queue<vec> q;

    q.put( vec(12.0, 10.0, -13.0) );

    ...

    vec a = q.get();
    // a.x = 12.0, a.y = 10.0, a.z = 13.0;

    ...

    return 0;
}


З.Ы. Мог чего-нить упустить. Писал без проверки!
9
24 марта 2007 года
Lerkin
3.0K / / 25.03.2003
Упс.. пардон. Это у меня стек получился :D
Код:
...
    // поместить элемент в очередь (очередь растет)
    void put( T info )
    {
    ptr_node p = new node<T>;

    if( !begin )
        begin = end = p;
    else
    {
        p->next = begin;
        begin = p;
    }

    n++;
    }
...

Вот так будет очередь... FIFO, типа. Только грамотно функцию получения (с удалением) надо написать...
14K
26 марта 2007 года
Krazist
60 / / 13.03.2007
Вот максимум, что я могу, а для моего случая не получается сделать:confused:
[[COLOR="DarkOrange"]Помогите доделать программу[/COLOR]]
Организовать структуру данных очередь, элементам которой является точка пространства (x, y, z).

Код:
#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include<iostream.h>

//nachalo - указатель на начало очереди.
//konec - указатель на конец очереди.

struct node
{
int elem;
node *sled;
};
class Spisok
{
private:
node *nachalo,*konec;
int klad;
public:
Spisok () {nachalo=konec=NULL;}
void Postroenie ();
void Vyvod ();
void Dobavlenie (int);
int  Set_Udal () { return klad; }
void Ydalenie ();
void Ochistka();
};

void main ()
{
Spisok A;
int el;
A.Postroenie ();
A.Vyvod ();
cout<<"Введите добавляемый элемент: ";
cin>>el;
A.Dobavlenie (el); A.Vyvod ();
cout<<"Удалим элемент из очереди.\n";
A.Ydalenie (); A.Vyvod ();
el=A.Set_Udal();
cout<<"Информационное поле удаленного звена: "<<el<<endl;
A.Ochistka();
}

void Spisok::Postroenie ()
{
node *r;
int el;
cout<<"Вводите элементы очереди:\n";
cin>>el;
if  (el!=0)
{
r = new (node);
(*r).elem = el; (*r).sled = NULL;
nachalo = r; konec = r; cin>>el;
while  (el!=0)
{
r = new (node);
(*r).elem = el; (*r).sled = NULL;
(*konec).sled = r; konec = r; cin>>el;
}
}
else
{r = NULL; nachalo = r; konec = r;}
}

void Spisok::Vyvod ()
{
node *r;
cout<<"Очередь: "; r = nachalo;
while  (r!=NULL)
{
cout<<(*r).elem<<" "; r = (*r).sled;
}
cout<<endl;
}

void Spisok::Dobavlenie (int el)
{
node *r;
r = new (node);
(*r).elem = el; (*r).sled = NULL;
if  (nachalo!=NULL)
{
(*konec).sled = r; konec = r;
}
else
{nachalo = r; konec = r;}
}

void Spisok::Ydalenie ()
//nachalo и konec, с помещением его информационного поля в
//параметр klad.
{
node *q;
if  (nachalo==NULL)
cout<<"Удалить нельзя, так как очередь пуста!\n";
else
{
klad = (*nachalo).elem; q = nachalo;
nachalo = (*nachalo).sled; delete q;
}
}

void Spisok::Ochistka()
//Возврат выделенной памяти в "кучу"
{
node *q;
q=nachalo;
if (nachalo!=NULL)
{
while (nachalo!=konec)
{
nachalo=(*q).sled;
delete q;  q=nachalo; }
delete nachalo;
nachalo=konec=NULL;
}
}
14K
28 марта 2007 года
Krazist
60 / / 13.03.2007
[COLOR="Black"][FONT="Comic Sans MS"][SIZE="2"]Здравствуйте уважаемые программисты я прошу вас помогите мне всё таки создать работающее приложение организовывающее структуру данных очередь для точки пространства (x,y,z)
Мне именно сейчас нужна ваша момощь я очень надеюсь на вас...выручайте...[/SIZE][/FONT][/COLOR] :confused: :confused: :confused:
9
28 марта 2007 года
Lerkin
3.0K / / 25.03.2003
Пойми правильно, лично я готов тебе помочь, и даже попытался сделать это (пример показал реальный, не нравятся шаблоны - убирай). Но дописывать твою "писульку", я думаю, никто из уважающих себя участников форума - не будет.
14K
31 марта 2007 года
Krazist
60 / / 13.03.2007
Здравствуйте уважаемый учасник форума [COLOR="Black"]Lerkin[/COLOR] подход который вы выложили мне покатит но сам я его
не смогу воплотить в жизнь...У меня руки опускаются...
Я понимаю что мою прогу наверно никто не допишет, помогите вы мне реализовать эту программу в жизнь
я очень вам буду благодарен.
14K
08 апреля 2007 года
Krazist
60 / / 13.03.2007
Уважаемый [SIZE="2"]Lerkin[/SIZE] прошу вас помогите мне доделать прогу по вашему варианту где нужно написать функцию получения элемента с его удалением из очереди...
Код:
// узел очереди
template <typename T>
struct node
{
    T info;
    node<T>* next;

    node( void ): next( NULL ) {;}
   ~node( void ) {;}
};

// очередь
template <typename T>
struct queue
{
typedef node<T>* ptr_node;

    unsigned int n;
    ptr_node begin, end;

    queue( void )
    {
    n = 0;
    end = begin = NULL;
    }

   ~queue( void )
    {
    clear();
    }

    // очистить список
    void clear( void )
    {
    while( begin )
    {
        ptr_node p = begin;
        begin = p->next;
        delete p;
    }

    n = 0;
    begin = end = NULL;
    }

    // получить количество элементов в списке
    unsigned int size( void )
    {
    return n;
    }

    // поместить элемент в очередь (очередь растет)
    void put( T info )
    {
    ptr_node p = new node<T>;

    if( !begin )
        begin = end = p;
    else
    {
        p->next = begin;
        begin = p;
    }

    n++;
    }

    // получить элемент из очереди (без удаления)
    T get( void )
    {
    return end->info;
    }
};


Ну и здесь что нужно дописать я не знаю [[COLOR="DarkOrange"]помогите[/COLOR]] только вы знаете как это реализовать
Код:
// пример использования
int main( void )
{
typedef vec3d<double> vec;

    queue<vec> q;

    q.put( vec(12.0, 10.0, -13.0) );

    ...

    vec a = q.get();
    // a.x = 12.0, a.y = 10.0, a.z = 13.0;

    ...

    return 0;
}
14K
14 апреля 2007 года
Krazist
60 / / 13.03.2007
Уважаемые участники форума здравствуйте !!!
Вот я написал класс для очереди но мне его нужно переделать чтобы элементами очереди была точка пространства (x,y,z)

Вот сам класс который сделал:

Код:
class queue
{
    int q[100];
    int end, start;
    public:
        void set_start(int var)
        {
            start=var;
        }
    int get_start()
        {
            return start;
        }
    void set_end(int var)  
        {
            end=var;
        }
    int get_end()
        {      
            return end;
        }
   
    queue(void);
   
    void put(int);
    int get(int*&);
    void del();
    void clear();
    void search(int,int&);
};
queue::queue(void)
{
    start=end=0;
}

int queue::get(int*& f)
{
    f=new int[end];
    if(end==start)
    {
        return 0;
    }
    for (int i=0; i<end;i++)
    {
        f=q;
    }
}

void queue::put(int i)
{
    if(end==100)
    {
        return;
    }
    q[end++]=i;
}

void queue::del()
{
    start++;
}

void queue::clear()
{
    end=start=0;
}

void queue::search(int i, int &v)
{
    v=q;
}



Я думаю что должно быть так...хотя даже и не знаю верно ли это:

Код:
double x,y,z;
struct Vec
{
double x,y,z;
Vec(x1,y1,z1)
{
x=x1, y=y1, z=z1
}
Vec{x=0; y=0; z=0}
}
возможно...
p(2,0,3);
p;
p.x=2;p.y=0;p.z=3



Прошу вас помогите мне сделать правильно ))):eek:
9
14 апреля 2007 года
Lerkin
3.0K / / 25.03.2003
[QUOTE=Krazist]Вот я написал класс для очереди...[/QUOTE]
Это не класс для очереди, это дурная обертка для массива в 100 элементов. Но даже в ней, что тебе мешает, вместо
 
Код:
class queue
{
    int q[100];
    int end, start;
...

написать
 
Код:
class queue
{
    Vec q[100];
    Vec *end, *start;
...

и думать уже в этом направлении?

P.S. Ну, неужели так сложно прочитать несколько глав из - хотя бы одной - не самой толстой книжки по С++, а? Уже скоро месяц, как ты с этой элементаркой возишься. Тебе себя-то, не жалко?
14K
15 апреля 2007 года
Krazist
60 / / 13.03.2007
Цитата:
Это не класс для очереди, это дурная обертка для массива в 100 элементов. Но даже в ней, что тебе мешает, вместо
 
Код:
class queue
{ int q[100];
 int end, start;
 ...


написать

 
Код:
class queue
{ Vec q[100];
 Vec *end, *start;
...



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

На самом деле сколько книг у меня не было информации про структуры очень мало... Да правда уже скоро месяц...Но меня это не радует... /*SOS*/

4.3K
18 апреля 2007 года
flat
142 / / 27.12.2005
Код:
class Node
{
    Node * prev;
public:
    double x, y, z;
    Node(double X, double Y, double Z)
    {
          prev = NULL;
          x = X; y = Y; z = Z;
        }
};

class Queue
{
    Node * begin, * end;
public:
    Queue()
    { begin = end = NULL; }

    void Push(Node * add) // добавление в конец очереди
    {
        if (end)
            end->prev = add;
        else
            begin = add;
        end = add;
    }
     
    Node * Pop(void)        // удаление элемента из начала очереди
    {
        Node * t = begin;
        if (begin)
            begin = begin->prev;
        if (!begin)
            end = NULL;

        return t;
    }
}

Примерно такой вид должна иметь очередь, но не проверял код.
В очереди по идее не должно быть других методов, кроме как добавить в конец и извлечь из начала.
Эти методы я описал.
Обрати внимание, что память необходимо выделять во внешних функциях (и освобождать соответственно тоже), сам класс занимается только работой с указателями.
Примерно так, где-нибудь в main:
 
Код:
...
Queue Q;
...
Node * add = new Node(1, 2, 3);
Q.Push(add);
...
Node * get = Q.Pop();
cout << "X = " get->x << endl;
delete get; // когда не нужен

ну вот примерно...
50K
29 июня 2009 года
$kyline
6 / / 29.06.2009
Помогите пожалуйста написать прогу для добавления и удаления элементов очереди, у меня не получается!:(
9
29 июня 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: $kyline
Помогите пожалуйста написать прогу для добавления и удаления элементов очереди, у меня не получается!:(


Элементарно:

 
Код:
...
    // добавление
    queue.push_back( el );
    ...
    // удаление
    queue.pop_back();
    ...
535
29 июня 2009 года
Нездешний
537 / / 17.01.2008
pop_back у очереди? ;)
9
29 июня 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Нездешний
pop_back у очереди? ;)


Ну [FONT="Courier New"]pop_front()[/FONT], какая разница...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог