Il problema che ho si era già ripresentato quando volevo stampare a video il nome della struttura nodo (cioè un char *nome)
quando facevo una printf("%s\n", n->nome) mi si bloccava il programma in esecuzione. l'avevo risolto usando una funzione che creava un buffer per la stringa che riceveva.
però non saprei se mi funzionerebbe con tutti questi puntatori a puntatori.
qui c'è una parte del codice: se ti serve altro dimmelo:
struct lista
{
char *nome;
struct lista *coppia;
struct lista *next;
struct lista *prev;
};
typedef struct lista lista;
struct rbnode
{
int x1;
int y1;
int x2;
int y2;
char *nome;
lista *adiacenze;
struct rbnode *left, *right, *up;
};
questi sono la struttura della lista e del nodo
lista *listadiac(rbnode *n){
lista *q = malloc(sizeof(lista));
if(!q) {
fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
exit(-1);
};
printf("lista di %s creata!\n", n->nome);
return q;
}
qui creo la lista. nella printf non mi da nessun problema
void coppiadiac(lista *la, lista *lb, rbnode *a, rbnode *b)
{
lista *ap = malloc(sizeof(lista));
if(!ap) {
fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
exit(-1);
};
lista *bp = malloc(sizeof(lista));
if(!bp) {
fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
exit(-1);
};
ap->nome = b->nome;
ap->next = la;
bp->nome = a->nome;
bp->next = lb;
printf("%s inserito nella lista di adiacenza di %s\n",b->nome,a->nome);
printf("%s inserito nella lista di adiacenza di %s\n",a->nome,b->nome);
ap->coppia = bp->coppia;
}
questa è una funzione che, nel caso due nodi (fai A e B) siano adiacenti, inserisce A nella lista delle adiacenze di B, B nella lista delle adiacenze di A, e fa puntare questi due elementi fra loro (in caso di cancellazione è più comodo che non ricercare tutte le varie occorrenze nelle liste di ogni nodo dell'albero)
void adiac(rbnode *p, rbnode *nil, rbnode *b, lista *la, lista *lb)
{
if(p != nil)
{
adiac(p->left,nil, b, la, lb);
if(adiacente(p, b) == 0)
coppiadiac(la, lb, p, b);
adiac(p->right,nil, b, la, lb);
}
}
void findadiac(rbtree *p, rbnode *b, lista *la, lista *lb)
{
adiac(p->root, p->nil, b, la, lb);
}
qui è dove c'è un errore secondo me: praticamente ho pensato che, per vedere se un nodo è adiacente o no a uno o più nodi dell'albero, servisse una visita in ordine dell'albero, e a ogni nodo mi fa il controllo con la funzione adiacente (dove b è il nodo appena inserito e p è un nodo dell'albero. mi restituisce 0 se è adiacente e 1 se non lo è). l' if controlla se b è adiacente al nodo p considerato in quel momento e se lo è fa partire coppiadiac (la funzione listadiac viene già chiamata all'inserimento del nodo). il punto è che se inserisco due nodi adiacenti intervallati fra loro da uno che non è adiacente a nessuno di loro, all'inserimento del terzo nodo mi viene risposto che non è adiacente a nessun nodo!
void inord(rbnode *p, rbnode *nil)
{
if(p != nil)
{
inord(p->left,nil);
printf("%s: %d %d %d %d\n", p->nome, p->x1, p->y1, p->x2, p->y2);
/* if(p->adiacenze == NULL)
printf("lista vuota\n");
else
while(p->adiacenze->next == NULL)
printf("%s\n", p->adiacenze->nome); */
inord(p->right,nil);
}
}
void inorder(rbtree *p)
{
inord(p->root, p->nil);
}
questo infine è la stampa dell'albero in ordine. tra i commenti c'è la parte che mi da l'errore.