Vettore di liste

di il
3 risposte

Vettore di liste

Salve raga ho creato un vettore di liste a puntatori ma il programma si comporta in modo "anomalo" es non mi fa eseguire operazioni come la scanf etc vengono saltate proprio vi posto tutto il sorgente grazie


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

struct nodo{
    
    char info;
    struct nodo *next;
    
};
void stampa(struct nodo *inizio[]);  // stampa vettore
void stampa_lista(struct nodo *inizio[],int i); // stampa lista addiacente
void inizializza(struct nodo*inizio[]);  // inizializza il mio vettore con tutte le lettere dell'alfabeto e mette i puntatori a next a NULL
int ricerca_bin(struct nodo*inizio[],int primo,int fine,int x); // ricerca carattere nel vettore
void inserisci(struct nodo*inizio[],char dato,int i);    // inserisce un nuovo nodo nella lista addiacente 
struct nodo*creanodo(char dato);

int main(int argc, const char * argv[])
{
    
    struct nodo *inizio[26];    // vettore di liste 26 elementi(lettere dell'alfabeto inglese)
    int size,ris_bin,scelta;  // size grandezza del vettore, ris_bin =ris della ricerca binaria scelta decide l'operazione da fare
    char el,var;  // var  carattere da insere nella lista el lettera dell'alfabeto identificatore del vett
    inizializza(inizio);
    size=26;
    
    
    do{
        printf("1:inserisci\n");
        printf("2:stampa\n");
        scanf("%d",&scelta);
        
        
        switch(scelta)
        {
                
            case 1:
                
                printf("inserisci l'elemento chiave del vettore\n");
                scanf("%c ",&var);
                ris_bin=ricerca_bin(inizio,0,size,el);
                if(ris_bin<0)
                    printf("elemento non trovato\n");
                else{
                    printf("elemento trovato si comincia !");
                    printf("inserisci la lettera da mettere\n");
                    scanf("%c",&el);
                    inserisci(inizio,el,size);
                }
                break;
                
            case 2:
                stampa(inizio);
                break;
                
        }
    }while(1);
    
    return 0;
}




void stampa(struct nodo *inizio[])
{
    int posizone;
    posizone=0;
    
    while(posizone<26){ // scorro il vettore e lo stampo se un indice del vettore ha il next !=NULL vuol dire che genera anche una lista 
        printf("%c\n",inizio[posizone]->info);
        if(inizio[posizone]->next!=NULL)
        {
            
            stampa_lista(&inizio[posizone],posizone);// da vedere
            
        }
        posizone++;
    }
    
}

void stampa_lista(struct nodo *inizio[],int indice)
{
    // nella funzione stampa mi stampo gli elementi se è collegata ad una lista questa funzione mi deve stapare la lista
    while(inizio[indice]!=NULL)
    {
        printf("     %c",inizio[indice]->info);  // stampa contenuto lista addiacente al vettore
        inizio[indice]=inizio[indice]->next;// avanti al prossimo nodo
    }
    
}



// da provare l'inizializzazione se davvero funziona
void inizializza(struct nodo *inizio[])
{
    char a;
    int i=0;
    
    a=65;
    
    // alloco spazio per tutti metto i puntatori nulli e nel campo info la lettera  dell'alfabeto  corrispondente A B...
    
    while(i<26)
    {
        inizio[i]=(struct nodo*)malloc(sizeof(struct nodo));
        inizio[i]->next=NULL;//
     
    
        
        inizio[i]->info=a;
        a++;
        i++;
    }
    
}
    

//   ricerca binaria avendo ogni locazione dell'array che punta ad una lista sfrutto la ricerca per capire qual'è la cella di posizione che da inizio alla lista es. c è in posizione 3 quindi volgio inserire nella terza lista


int ricerca_bin(struct nodo *inizio[],int primo,int fine,int misterx)
{
    int med;
    
    if(primo>fine)    // primo maggiore di fine?? il carattere non è tra quelli del vettore
        return -1;
    //else
    med=(primo+fine)/2; // spacco il vettore a metà
    if(inizio[med]->info==misterx) // se nella metà trovo il valore è fatta!
        return med;
    
    // else
    if(misterx>inizio[med]->info) // essendo ordinato posso controllare se devo vedere a sinistra o a destra
        return ricerca_bin(inizio,med+1,fine,misterx);   // guardo alla destra del vettore
    else
        return ricerca_bin(inizio,primo,med-1,misterx);// guardo alla sinistra del vettore
    
}


// insrrisce un nodo nella lista addiacente 

void inserisci(struct nodo*inizio[],char dato,int i)
{
    struct nodo*app;
    
    app=creanodo(dato);
    
    while(inizio[i]->next!=NULL)
        inizio[i]=inizio[i]->next;
    
    
    inizio[i]=app->next;// aggancio i puntatori
    
    
    
}






struct nodo *creanodo(char dato)
{
    
    struct nodo*app;
    app=(struct nodo*)malloc(sizeof(struct nodo));
    app->info=dato;
    app->next=NULL;
    return app;
}


3 Risposte

  • Re: Vettore di liste

    Se "ti salta" le scanf forse è solo un problema di buffer di input.

    Prova ad inserire subito dopo la scanf la linea

    while(getchar() != '\n') ;
  • Re: Vettore di liste

    Non ho risolto nulla :-0 il mio debugger indica uno \n nel contenuto della variabile
  • Re: Vettore di liste

    Come hai modificato il codice ?
Devi accedere o registrarti per scrivere nel forum
3 risposte