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;
}