Показать сообщение отдельно
Старый 09.04.2007, 16:36   #14
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Списки данных

Вот моя реализация двунаправленных списков (отдельная спасиба Магусу за понятный и красивый код):
#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 как надо, чтобы можно было организовать свою структуру любой сложности.
(Offline)
 
Ответить с цитированием