Вот моя реализация двунаправленных списков (отдельная спасиба Магусу за понятный и красивый код):
#include "stdafx.h"
#include <iostream.h>
class item
{
public:
int x;
item* next;
item* prev;
};
class list
{
public:
item* first;
item* last;
//===================================================
list(){
first=NULL;
last=NULL;
}
//===================================================
item* append()
{
item* temp;
temp = new item;
if(!first){
first=temp;
first->prev=NULL;
first->next=NULL;
}else{
if(!last){
last=temp;
first->next=last;
last->prev=first;
last->next=NULL;
}else{
temp->next=NULL;
temp->prev=last;
last->next=temp;
last=temp;
}
}
return temp;
}
//==================================================
item* crash(item* el)
{
if(!(el->next))
{
if(el->prev){
el->prev->next=NULL;
last=el->prev;}
}else{
if(!(el->prev)){
if(el->next){
el->next->prev=NULL;
first=el->next;}
}else{
el->next->prev=el->prev;
el->prev->next=el->next;
}
}
item* ret;
if (el->prev){ret=el->prev;}else{ret=NULL;}
delete el;
return ret;
}
};
int main(int argc, char* argv[])
{
list l;
l.append()->x=34;
l.append()->x=10;
l.append()->x=18;
l.append()->x=20;
l.append()->x=30;
l.append()->x=34;
l.append()->x=21;
printf("Hello World!\n");
for (item* e=l.first;e;e=e->next)
{
printf("x=%d\n",e->x);
}
for (e=l.first;e;e=e->next)
{
if (!(e->x % 10)){e=l.crash(e);}
}
printf("===========================================\n");
for (e=l.first;e;e=e->next)
{
printf("x=%d\n",e->x);
}
cout<<endl<<"enter char"<<endl;
char h;
cin>>h;
return 1;
}
в коде мне нравиться структура типа
for (item* e=l.first;e;e=e->next)
{
printf("x=%d\n",e->x);
}
понятно и просто делаются переборы.
собственно вопрос (с которыми я наверное уже вас всех достал):
есть класс item.
у него поле данных int x;
так вот, если мне необходимо чтоб у него были поля другого типа (да и другое количество) ?
есть идея - создать класс на основе класса item, например:
class bullet : item
{
public:
float y,z;
float spd;
int l;
};
, но тогда что делать с классом list, там повсюду используются указатели на класс item? создавать два новых класса, один из которых будет практически идиентичным базовому нехочецца.
может его зашаблонить? list я имею ввиду, тогда можн перегружть item как надо, чтобы можно было организовать свою структуру любой сложности.