Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C]Albero Binario di stringhe

    ciao a tutti, ho appena letto un post su un albero binario di interi su questo forum e ho preso il codice e lo ho adattato per lavorare su chiavi stringhe.
    il mio problema è il seguente:
    -leggo in un ciclo un certo numero di stringhe(nel mio esempio 7)
    -se la stringa non è presente la inserisco nell albero
    -uscito dal ciclo stampo le stringhe del mio albero
    vi posto il codice sperando che mi possiate dare una mano
    codice:
    #include<malloc.h>
    #include<string.h>
    #include<stdlib.h>
    #include<stdio.h>
    
    //FUNZIONA
    struct Nodo{
    
    char * key;
    struct Nodo* left;
    struct Nodo* right;
    
    };
    
    typedef struct Nodo* Tree;
    
    void insert(Tree *t, char * k){
    
    // crea il nodo foglia da inserire contenente la chiave
    struct Nodo* e = malloc(sizeof(struct Nodo));
    e->key = k;
    e->left = e->right = NULL;
    
    struct Nodo* p;
    struct Nodo* x = *t;
    
    // se l'albero è vuoto imposta e come radice dell'albero
    if (x == NULL) {
    *t = e;
    return;
    }
    
    // altrimenti cerca la posizione della foglia nell'albero
    while (x != NULL){
    
    p = x;
    if (strcmp(x->key,k) < 0) x = x->right;
    else x = x->left;
    }
    
    // ora p punta al padre del nuovo elemento da inserire in t
    // quindi si procede a linkare p ed e
    
    if (strcmp(p->key,k) < 0) p->right = e;
    else p->left = e;
    
    }
    
    
    // cerca una chiave k nell'albero t e restituisce la profondità alla quale si trova
    // oppure 0 se la chiave non è presente in t
    
    int search(Tree t, char* k){
    
    struct Nodo* n= t;
    int depth = 0;
    
    while (n != NULL){
    depth++;
    if (strcmp(n->key,k) >0) n = n->left;
    else if (strcmp(n->key,k) == 0) return depth;
    else n = n->right;
    }
    
    return 0;
    }
    
    int stampaa(Tree T) {
    
    struct Nodo* n = T;
    
    if (n == NULL)
    return -1;
    //caso ricorsivo (albero non vuoto)
    else {
    // esamina radice
    printf("%s\n", n->key);
    // visita sottoalbero sinistro
    stampaa(n->left);
    // visita sottoalbero destro
    stampaa(n->right);
    }
    return 1;
    
    }
    int main() {
    
    int a;
    int k,i;
    Tree t= NULL;
    char *buf1, *buf2;
    	buf1 = malloc(30 * sizeof(char));
    printf("inserisci chiave\n");
    scanf("%s", buf1);
    for(i=0;i<5;i++)
    {insert(&t,buf1);
    scanf("%s", buf1);
    }
    printf("stampa\n");
    stampaa(t);
    
    }

    baci giulia

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma il problema qual e'?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    non funziona come dovrebbe esempio di input
    -----
    inserisci chiave
    ciao
    o
    come
    ciao
    stai
    io
    OUTPUT:
    stampa
    io
    io
    io
    io
    io

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nella insert non puoi fare semplicemente

    e->key = k;

    ma devi allocare lo spazio per la stringa.

    Devi sostituire quella riga con

    e->key = (char *)malloc(strlen(k)+1);
    e->key = strcpy(e->key, k);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    ho modificato come mi hai detto te ma continua a darmi degli output scorretti :-(
    scusatemi ma sono alle prime armi e devo consegnare l esercizio entro breve XD

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da canino88
    ho modificato come mi hai detto te ma continua a darmi degli output scorretti :-(
    Quella modifica era necessaria. Cio' non vuol dire che sarebbe stata sufficiente ad eliminare tutti i problemi del codice.

    Che intendi adesso con "output scorretti"?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.