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