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

// test2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>


class item
{
public:
	int x;
	item* next;
	item* prev;
};

class bullet
{
public:
	float x,y,z;
	float spd;
	int l;
	bullet* next;
	bullet* prev;
};

template<typename item_>
class list
{
public:
	item_* first;
	item_* last;
//===================================================
	list(){
		first=NULL;
		last=NULL;
	}
//===================================================
	item_* append()
	{
		item_* temp;
		temp = new bullet;
		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)) && (!(el->prev)))
		{
			first=NULL;
			last=NULL;
			delete el;
			return NULL;
		}else
		{
		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<bullet> 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 (bullet* e=l.first;e;e=e->next)
	{
		cout<<e->x<<endl;
	}


	for (e=l.first;e;e=e->next)
	{
		if((e->x)<25){e=l.crash(e);}
	}

	printf("===========================================\n");

	
	for (e=l.first;e;e=e->next)
	{
		cout<<e->x<<endl;
	}
	cout<<endl<<"enter char"<<endl;

	char h;
	cin>>h;
	return 1;
}
короче появилась идея, нафиг не шаблонить item а создаавать совершенно новый класс, прчием две строчки-
<имя класса*>prev
<имя класса*>next
все же придеться вручную набирать, не могу пока придумать как это автоматизировать.
а List зашаблонить так, чтобы в качестве типа указывать класс, (bullet) например.
пример выше.
ЗЫ. Криво работает удаление (удаление в переборе)
(Offline)
 
Ответить с цитированием