Buonasera a tutti!!!!
Sono un nuovo provetto programmatore, se almeno così posso dire..., visto che inizio a programmare da poco o addirittura pochissimo.
Vi espongo brevemente il mio quesito.
Stò implementando una lista allocata in maniera dinamica, con l'utilizzo del doppio puntatore, perchè voglio mettere alla prova i miei studi teorici.
In sostanza la teoria dice: che se passo ad una funzione un puntatore doppio, non è necessario aggiornare il puntatore alla testa lista, come nel caso i cui passi alla funzione un semplice puntatore.
Quindi con il doppio puntatore non ho bisogno del valore di ritorno e dovrei avere un'ottimizzaione del codice.
Vi metto qua sotto il codice che ho provato a far girare su codeblocks:
Premetto che secondo me l'errore è nel parametro che passa alla funzione, anzi sicuramente l'errore è là, ma la mia poca esperienza non mi fà capire esattamente dove sbaglio e soprattutto perchè.
#include<stdio.h>
#include<malloc.h>
struct lista{
int val;
struct ele *next;
};
typedef int boolean; //con ciò definisco un nuovo tipo
void visit (struct lista *);
boolean ricerca (struct list *,int,struct list**);
void ins_testa(struct list **ptrptr,int valore);
void ins_coda(struct list**,int);
void ins_ord(struct list**,int);
void main(){
struct list *ptr_lista,**pptr; //puntatore alla lista
boolean false,true,ritorno;
int scelta,elemento;
true=1; //dovrebbe essere opzionale fare questa assegnazione dato che poi potrei gestire io il valore di ritorno
false=0;
ptr_lista=NULL; // puntatore alla testa della lista
pptr=&ptr_lista; // inizializzo il mio doppio puntatore
printf("Seleziona opzione desiderata: \n");
printf("1.Inserimento in testa alla lista\n");
printf("2.Inserimento in coda alla lista\n");
printf("3.Inserimento in ordine nella lista\n");
printf("4.Cancellazione elemento di testa della lista\n");
printf("5.Ricerca di un elemento nella lista\n");
printf("6.Stampa dell'intera lista\n");
printf("0.Per finire\n");
do{
printf("effettua la tua scelta:");
scanf("%d",&scelta);
switch(scelta){
case 1:
printf("INSERIMENTO IN TESTA ALLA LISTA\n\n");
printf("Inserisci valore: ");
scanf("%d",&elemento);
ins_testa(pptr,elemento);
break;
case 2:
printf("INSERIMENTO IN CODA ALLA LISTA\n\n");
printf("Inserisci valore: ");
scanf("%d",&elemento);
ins_coda(pptr,elemento);
break;
case 3:
printf("INSERIMENTO ORDINATO\n\n");
printf("Inserisci valore: ");
scanf("%d",&elemento);
ins_ord(pptr,elemento);
break;
case 4:
printf("CANCELLAZIONE ELEMENTO TESTA DELLA LISTA\n\n\n");
// qua ancora non ho definito la funzione, spero di arrivarci presto!
case 5:
printf("RICERCA ELEMENTO ALL'INTERNO DELLA LISTA \n\n");
printf("Inserisci elemento da ricercare: ");
scanf("%d",&elemento);
ritorno=ricerca(ptr_lista,elemento,pptr);
if(ritorno==true)
printf("Elemento trovato!");
else
printf("Elemento non presente");
break;
case 6:
printf("STAMPA DELLA LISTA\n\n");
visit(ptr_lista);
break;
case 0:
printf("Uscita dal ciclo!");
break;
}while(scelta!=0);
}
void ins_testa(struct list **ptrptr,int valore){
struct list *tmp;
tmp=*ptrptr;
*ptrptr=(struct list*)malloc(sizeof(struct list));
(*ptrptr)->val=valore;
(*ptrptr)->next=tmp;
}
void ins_coda(struct list**ptrptr,int valore){
while(*ptrptr!=NULL)
ptrptr=&((*ptrptr)->next);
ins_testa(ptrptr,valore);
}
void ins_ord(struct list**ptrptr,int valore){
while(*ptrptr!=NULL && (*ptrptr)->val<valore)
ptrptr=&((*ptrptr)->next);
ins_testa(ptrptr,valore);
}
boolean ricerca (struct list *ptr,int valore,struct list**ptrptr){
boolean found;
found=false;
while(ptr!=NULL&&found==false)
{
if(ptr->val==valore)
{
found=true;
*ptrptr=ptr;
}
else
ptr=ptr->next;
}
}
void visit (struct lista *ptr){
while(ptr!=NULL){
printf("%d",ptr->val);
ptr=ptr->next;
}
}