// 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;
}
};
[C++]организация структуры данных "очередь"
Задание такое:
Организовать структуру данных очередь, элементам которой является точка пространства (x, y, z).
В программе информация помещается в конец и удаляется в момент,когда, наконец, достигает ее начала.
Она должна содержать подпрограммы добавления, удаления и чтения элемента.[[COLOR=darkorange]Помогите[/COLOR]]:confused: :confused: :confused:
Очередь - динамическая структура данных, так как с течением времени длина очереди
(количество входящих в нее звеньев) изменяется.
Например, все мы знакомы с очередью людей у кассы в магазине самообслуживания
или очередью автомобилей у бензозаправочной станции.
Вновь прибывшие становятся в один конец очереди и покидают ее после оплаты покупок
или заправки с другого.
Элементы списка определяются как:
[COLOR=darkorange]struct NODE{ double x, y, z; struct NODE *next; }[/COLOR]
Код:
Класс (структурку) 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;
}
};
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;
}
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;
}
З.Ы. Мог чего-нить упустить. Писал без проверки!
Код:
...
// поместить элемент в очередь (очередь растет)
void put( T info )
{
ptr_node p = new node<T>;
if( !begin )
begin = end = p;
else
{
p->next = begin;
begin = p;
}
n++;
}
...
// поместить элемент в очередь (очередь растет)
void put( T info )
{
ptr_node p = new node<T>;
if( !begin )
begin = end = p;
else
{
p->next = begin;
begin = p;
}
n++;
}
...
Вот так будет очередь... FIFO, типа. Только грамотно функцию получения (с удалением) надо написать...
[[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;
}
}
#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;
}
}
Мне именно сейчас нужна ваша момощь я очень надеюсь на вас...выручайте...[/SIZE][/FONT][/COLOR] :confused: :confused: :confused:
Пойми правильно, лично я готов тебе помочь, и даже попытался сделать это (пример показал реальный, не нравятся шаблоны - убирай). Но дописывать твою "писульку", я думаю, никто из уважающих себя участников форума - не будет.
не смогу воплотить в жизнь...У меня руки опускаются...
Я понимаю что мою прогу наверно никто не допишет, помогите вы мне реализовать эту программу в жизнь
я очень вам буду благодарен.
Код:
// узел очереди
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;
}
};
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;
}
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;
}
Вот я написал класс для очереди но мне его нужно переделать чтобы элементами очереди была точка пространства (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;
}
{
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
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:
Это не класс для очереди, это дурная обертка для массива в 100 элементов. Но даже в ней, что тебе мешает, вместо
Код:
class queue
{
int q[100];
int end, start;
...
{
int q[100];
int end, start;
...
написать
Код:
class queue
{
Vec q[100];
Vec *end, *start;
...
{
Vec q[100];
Vec *end, *start;
...
и думать уже в этом направлении?
P.S. Ну, неужели так сложно прочитать несколько глав из - хотя бы одной - не самой толстой книжки по С++, а? Уже скоро месяц, как ты с этой элементаркой возишься. Тебе себя-то, не жалко?
Цитата:
Это не класс для очереди, это дурная обертка для массива в 100 элементов. Но даже в ней, что тебе мешает, вместо
написать
Код:
class queue
{ int q[100];
int end, start;
...
{ int q[100];
int end, start;
...
написать
Код:
class queue
{ Vec q[100];
Vec *end, *start;
...
{ Vec q[100];
Vec *end, *start;
...
Я делал таким образом...но такой вариант мне не подходит )))
мне нужно совсем избавиться от статической структуры которая у меня есть.
На самом деле сколько книг у меня не было информации про структуры очень мало... Да правда уже скоро месяц...Но меня это не радует... /*SOS*/
Код:
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;
}
}
{
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; // когда не нужен
Queue Q;
...
Node * add = new Node(1, 2, 3);
Q.Push(add);
...
Node * get = Q.Pop();
cout << "X = " get->x << endl;
delete get; // когда не нужен
ну вот примерно...
Помогите пожалуйста написать прогу для добавления и удаления элементов очереди, у меня не получается!:(
Цитата: $kyline
Помогите пожалуйста написать прогу для добавления и удаления элементов очереди, у меня не получается!:(
Элементарно:
Код:
...
// добавление
queue.push_back( el );
...
// удаление
queue.pop_back();
...
// добавление
queue.push_back( el );
...
// удаление
queue.pop_back();
...
pop_back у очереди? ;)
Цитата: Нездешний
pop_back у очереди? ;)
Ну [FONT="Courier New"]pop_front()[/FONT], какая разница...