Alberi red and black

di il
4 risposte

Alberi red and black

Ho un problema:
facendo varie prove vedo che non viene mai un albero bilanciato per numero di nodi neri oppure per lunghezza dei rami. Credo di sbagliare qualcosa nel fix up o nel rotate ma non trovo l errore.
Insert copiato dal professore dovrebbe essere corretto.

(per i mod non ho capito come formattare il codice da regolamento)



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable : 4996)

void inserisci(char* id);
struct Node *root = NULL;
void inserisci_fixup(struct Node* z);
void ruota_sinistra(struct Node* z);
void ruota_destra(struct Node* z);
void report();
void report2(struct Node *z);
void elimina(char *id);
void elimina_fixup(struct Node* x);
struct Node* cerca(struct Node *n,char* id);
struct Node* successore(struct Node* x);

struct  Node
{
	char nome[100];
	char c;
	struct Node* right, * left, * p;
};

struct Node* foglia;


int main()
{
	foglia = malloc(sizeof(struct Node));
	foglia->c = 'n';
	

	char *comando,*id;
	comando = (char*)malloc(sizeof(char*));
	id = (char*)malloc(sizeof(char*));
	
	while (comando != "end")
	{
		int cont1=7;
		printf("Inserisci comando: \n");
		gets(comando);

		char com[7];

		for (int i = 0; i < 6; i++)
		{
			com[i] = comando[i];
		}
		com[6] = '\0';

		while (comando[cont1] == ' ')
			cont1++;
		
		if (comando[cont1] == '"')
			cont1++;
		
		for (int i = cont1; ; i++)
		{
			id[i - cont1] = comando[i];
			if (comando[i] == '"')
			{
				id[i - cont1] = '\0';
				break;
			}
		}

		if (strcmp(com, "addent") == 0)
			inserisci(id);
		else if (strcmp(com, "report") == 0)
			report();
		else if (strcmp(com, "delent") == 0)
			elimina(id);
	}
	return 0;
}

void inserisci(char *id)
{
	//char *nome;
	//nome = (char*)malloc((strlen(id)+1)*sizeof(char*));
	//strcpy(nome,id);
	//nome[strlen(id)] = '\0';
	struct Node *z = malloc(sizeof(struct Node));
	struct Node *x = root;
	struct Node *y= NULL;
	strcpy(z->nome, id);
	z->right = NULL;
	z->left = NULL;
	z->c = 'r';

	while (x != NULL)
	{
		y = x;
		if (strcmp(x->nome , z->nome)>0)
			x = x->left;
		else
			x = x->right;
	}

	z->p = y;

	if (y == NULL)
	{
		root = z;
	}
	else if (strcmp(y->nome, z->nome) > 0)
		y->left = z;
	else
		y->right = z;

	inserisci_fixup(z);	
}

void inserisci_fixup(struct Node *z)
{
	struct Node *x,*y;
	
	if (z == root)
		root->c = 'n';
	else
	{
		x = z->p;
		if(x->c== 'r')
			if (x == x->p->left)
			{
				y = x->p->right;
				if (y == NULL)
				{					
					//y = foglia;
				}
				else if (y->c == 'r')
				{
					x->c = 'n';
					y->c = 'n';
					x->p->c = 'r';
					inserisci_fixup(x->p);
				}
				else if (z == x->right)
				{
					z = x;
					ruota_sinistra(z/*->p->p*/);
					x = z->p;
				}
				/*else
				{*/
				x->c = 'n';
				x->p->c = 'r';
				ruota_destra(x->p/*z->p->p*/);
				/*}*/
				
			}
			else 
			{
				y = x->p->left;
				if (y == NULL)
				{
					//y = foglia;
				}
				else if (y->c == 'r')
				{
					x->c = 'n';
					y->c = 'n';
					x->p->c = 'r';
					inserisci_fixup(x->p);
				}
				else if (z == x->left)
				{
					z = x;
					ruota_destra(z/*->p->p*/);
					x = z->p;
				}
				/*else
				{*/
				x->c = 'n';
				x->p->c = 'r';
				ruota_sinistra(x->p/*z->p->p*/);
				/*}*/
				
			}
		
	}
}

void ruota_sinistra(struct Node *x)
{
	struct Node *y;
	y = x->right;
	x->right = y->left;

	if (y->left != NULL)
		y->left->p = x;

	y->p = x->p;

	if (x->p == NULL)
		root = y;
	else if (x == x->p->left)
		x->p->left = y;
	else
		x->p->right = y;

	y->left = x;
	x->p = y;
}

void ruota_destra(struct Node* x)
{
	struct Node* y;
	y = x->left;
	x->left = y->right;

	if (y->right != NULL)
		y->right->p = x;

	y->p = x->p;

	if (x->p == NULL)
		root = y;
	else if (x == x->p->right)
		x->p->right = y;
	else
		x->p->left = y;

	y->right = x;
	x->p = y;
}


4 Risposte

  • Re: Alberi red and black

    Se non uai i tag code per la formattazione il codice non ai capisce. Vai nell'editor completo e usa il button </>
  • Re: Alberi red and black

    oregon ha scritto:


    Se non uai i tag code per la formattazione il codice non ai capisce. Vai nell'editor completo e usa il button </>
    fatto
  • Re: Alberi red and black

    L'implementazione di un RBTree non e' banalissima.

    Quindi analizzare il codice non e' una cosa da 5 minuti, ma bisogna mettersi li, passo/passo confrontando la TUA implementazione con un'implementazione di riferimento.

    Ma questo lo puoi fare anche tu

  • Re: Alberi red and black

    migliorabile ha scritto:


    L'implementazione di un RBTree non e' banalissima.

    Quindi analizzare il codice non e' una cosa da 5 minuti, ma bisogna mettersi li, passo/passo confrontando la TUA implementazione con un'implementazione di riferimento.

    Ma questo lo puoi fare anche tu

    ho gia confrontato ma non trovo l errore
Devi accedere o registrarti per scrivere nel forum
4 risposte