[C] Albero binario di ricerca

di il
4 risposte

[C] Albero binario di ricerca

Ciao a tutti. Sono nuovo del forum, e avrei gentilmente bisogno di una mano per un progetto dell'università... Non sono ancora molto pratico del C, quindi vi chiedo una mano.

Allora, il codice qui sotto rappresenta un albero binario di ricerca: ho definito una struttura nodo_ric (i nodi sono identificati da nomi, quindi stringhe), e poi delle funzioni (creazione di un nodo singolo, ricerca, e insermineto mantenendo l'ordine). Lo scopo del main è puramente di test: chiede l'inserimento di cinque nomi, dopo ognuno dei quali stampa "PRIMO" se è il primo nodo creato, "OK" se è stato fatto correttamente l'inserimento del nuovo nodo e "Già presente" se il nome inserito fa già parte dell'albero. Il primo nome inserito stampa sempre "PRIMO" correttamente, ma dal secondo nome stampa sempre "Già inserito". L'errore è nel while della funzione di ricerca: le due stringhe tra cui fa il confronto sono sempre entrambe l'ultima stringa inserita dall'utente, e non viene passati i nodi precedenti dell'albero. Dove sbaglio? (Ho notato che sostituendo le stringhe con gli interi funziona).
Poi un'altra domanda molto più stupida: perchè se inserisco stringhe troppo lunghe (es. 20 caratteri) mi dà errore di segmentazione?

Di seguito il codice, grazie mille in anticipo a chiunque possa aiutarmi.



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char *Stringa;


struct nodo_ric{
	Stringa nome;
	struct nodo_ric *l, *r;
};

typedef struct nodo_ric *Nodo_ric;



Nodo_ric bit_new(Stringa nome_ric){
	
	Nodo_ric new = malloc(sizeof(struct nodo_ric));
	
	if(new == NULL){
		printf("\nMemoria Esaurita\n");
		exit(-1);
	}
	
	new -> l = new -> r = NULL;
	new -> nome = nome_ric;
	return new;
}







int cerca_ric(Nodo_ric r, Stringa nome_ric, Nodo_ric *pf, Nodo_ric *p){
	
	int res;
	*pf = NULL;
	*p = r;
	
	if(!r)	/** equivale a if(r == NULL) **/
		return -1;
	
	
	while(*p && (res = strcmp(nome_ric, (*p)->nome ) != 0)) {
		*pf = *p;
		if(res < 0)
		 	(*p) = (*p) -> l; 
		 else
		 	(*p) = (*p) -> r;
	}

	if(*p == NULL)	/** non ci sono nodi con chiave k **/
		return -1;
	
	return 0;
}


int inserisci_ric(Nodo_ric *r, Stringa nome_ric){
	Nodo_ric qf, q = *r, new = bit_new(nome_ric);
		
	if(q == NULL) {
		/** inserisco nell'albero vuoto **/
		*r = new;
		return 1;
	}

	if(cerca_ric(*r, nome_ric, &qf, &q) == 0) {
		 /** la chiave c'è già, non inserisco niente **/
		 return -1;
	}

	/** qf è il padre del nuovo nodo **/
	if(strcmp(nome_ric, qf->nome < 0))
		qf -> l = new;
	else
		qf -> r = new;	
	
	return 0;
}




int main(){
	
	
	Stringa nome_ric = malloc(sizeof(Stringa));
	Nodo_ric albero = NULL;
	
	int temp;
	
	
	
	printf("\nInserisci un nome: ");
	scanf("%s",nome_ric);
	temp = inserisci_ric(&albero,nome_ric);
	if(temp == 0)
		printf("OK");
	if(temp == -1)
		printf("Già presente");
	if(temp == 1)
		printf("PRIMO");
	
	
	
	printf("\nInserisci un nome: ");
	scanf("%s",nome_ric);
	temp = inserisci_ric(&albero,nome_ric);
	if(temp == 0)
		printf("OK");
	if(temp == -1)
		printf("Già presente");
	if(temp == 1)
		printf("PRIMO");
	
	
	printf("\nInserisci un nome: ");
	scanf("%s",nome_ric);
	temp = inserisci_ric(&albero,nome_ric);
	if(temp == 0)
		printf("OK");
	if(temp == -1)
		printf("Già presente");
	if(temp == 1)
		printf("PRIMO");
		
	printf("\nInserisci un nome: ");
	scanf("%s",nome_ric);
	temp = inserisci_ric(&albero,nome_ric);
	if(temp == 0)
		printf("OK");
	if(temp == -1)
		printf("Già presente");
	if(temp == 1)
		printf("PRIMO");
		
	printf("\nInserisci un nome: ");
	scanf("%s",nome_ric);
	temp = inserisci_ric(&albero,nome_ric);
	if(temp == 0)
		printf("OK");
	if(temp == -1)
		printf("Già presente");
	if(temp == 1)
		printf("PRIMO");
	
	
	
	
	return 0;
	
}

4 Risposte

  • Re: [C] Albero binario di ricerca

    Houston abbiamo un problema.
    
    if(strcmp(nome_ric, qf->nome < 0))
    
  • Re: [C] Albero binario di ricerca

    Questo input mi sembra un po stretto...
    
    Stringa nome_ric = malloc(sizeof(Stringa))
    
    L'errore nasce da una probabile conversione del tuo src da interi a stringhe. Il tuo nodo punta sempre allo stesso input. X come è impostato il programma dovresti copiare la memoria dall 'input alla nuova allocazione.
    
    NA---|
    NB---|---> nodo_ric
    NC---|
    
  • Re: [C] Albero binario di ricerca

    Innanzitutto grazie. Per strcmp e Stringa mi ero accorto, poi ho sistemato. Il problema è proprio l'ultimo mi sa, ma non capisco come posso sistemarlo...
  • Re: [C] Albero binario di ricerca

    Prova a cambiare il main in modo da allocare la tua Stringa per ogni iterazione. Cosa è cambiato rispetto a prima?
    
    int main(){
       
       Stringa nome_ric;
       Nodo_ric albero = NULL;
       
       int temp,count;
        
       for (count=3;count;count--)
       {
        nome_ric = malloc(SPAZIO_SUFFICIENTE_GRANDE_PER_CONTENERE_LA_TUA_STRINGA);
        printf("\nInserisci un nome: ");
        scanf("%s",nome_ric);
        temp = inserisci_ric(&albero,nome_ric);
        if(temp == 0)
          printf("OK");
        else if(temp == -1)
          printf("Già presente");
        else if(temp == 1)
          printf("PRIMO");
       }
       
       return 0;
    
    }
    
    N.B. le free non sono un optional
Devi accedere o registrarti per scrivere nel forum
4 risposte