All pastes #341825 Raw Edit

Stuff

public text v1 · immutable
·published 2007-02-05 21:50 UTC
rendered paste body
#ifndef _ABR_
#define _ABR_
#include <cstring>
#include <iostream>
using namespace std;

class ABR
{
	private:
		struct Tcell {
						int clef;
						char * infos;
						Tcell * fg;
						Tcell * fd;
				 	};
		Tcell * racine;
		void pvid(Tcell *);
	
	public:
		ABR();
		~ABR();
		bool ajouter(char *, int);
		bool supprimer(int);
		char * valeur(int);
		void vider();
};


ABR::~ABR()
{
	vider();
}

ABR::ABR()
{
	racine = NULL;
}


void ABR::vider()
{
	pvid(racine);
	racine = NULL;
}

void ABR::pvid(Tcell * noeud)
{
	if(noeud != NULL)
	{
		pvid(noeud->fg);
		pvid(noeud->fd);
		delete noeud;
	}
}	


bool ABR::supprimer(int telclef)
{
	Tcell * noeud = racine;
	Tcell * pnoeud = NULL;
	Tcell * tmp, * ptmp, * pptmp;
	
	while(noeud != NULL && noeud->clef != telclef)
	{
		if(telclef < noeud->clef)
		{
			pnoeud = noeud;
			noeud = noeud->fg;
		}
		else
		{
			pnoeud = noeud;
			noeud = noeud->fd;
		}
	}
	if(noeud == NULL)
		return false;
	else if(noeud->fg == NULL && noeud->fd == NULL)
	{
		if(pnoeud != NULL)
		{
			if(pnoeud->fg == noeud)
				pnoeud->fg = NULL;
			else
				pnoeud->fd = NULL;
		}
		else
			racine = NULL;
		delete noeud;
	}
	else
	{
		pptmp = noeud;
		if(noeud->fg != NULL)
		{
			tmp = noeud->fg;
		}
		else
			tmp = noeud;
		ptmp = tmp;
		while(tmp != NULL && tmp->fd != NULL)
		{
			pptmp = ptmp;
			ptmp = tmp;
			tmp = tmp->fd;
		}
		if(pptmp->fg == ptmp)
			pptmp->fg = NULL;
		else
			pptmp->fd = NULL;
		noeud->clef = ptmp->clef;
		delete noeud->infos;
		noeud->infos = ptmp->infos;
		delete ptmp;
	}
return true;
}
	
	
	

bool ABR::ajouter(char * telinfos, int telclef)
{
	Tcell * noeud = racine;
	Tcell * pnoeud = NULL; /* élément père de noeud */
	
	while(noeud != NULL)
	{
		if(telclef < noeud->clef)
		{
			pnoeud = noeud;
			noeud = noeud->fg;
		}
		else if(telclef > noeud->clef)
		{
			pnoeud = noeud;
			noeud = noeud->fd;
		}
		else /* Si telclef == noeud->clef */
			return false;
	}
	noeud = new Tcell;
	noeud->clef = telclef;
	noeud->infos = strdup(telinfos);
	noeud->fd = NULL;
	noeud->fg = NULL;
	if(pnoeud != NULL && telclef < pnoeud->clef)
		pnoeud->fg = noeud;
	else if(pnoeud != NULL && telclef > pnoeud->clef)
		pnoeud->fd = noeud;
	else /* Si pnoeud est null */
		racine = noeud;
	return true;
}

char * ABR::valeur(int telclef)
{
	Tcell * noeud = racine;
	
	while(noeud != NULL && noeud->clef != telclef)
	{
		
		if(telclef < noeud->clef)
			noeud = noeud->fg;
		else
			noeud = noeud->fd;
	}
	if(noeud == NULL)
		return NULL;
	else
		return noeud->infos;
}

#endif