Ciao , la funzione delete() funzionava bene , eri tu che usavi la variabile intera i al posto di Lista
mentre per la funzione cerca , effettivamente era sbagliata , perchè se non trovava il valore , eseguiva
if(list_head->valore==n) su NULL
ecco le correzioni , se vuoi modifica la funzione inserisci , in modo che non solo puoi creare la lista , ma ne puoi aggiungere elementi .
codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //Ho messo la libreria percè il true nel while mi da problemi.. Strano, perchè anche senza libreria funzionava..
struct elemento{
int valore;
struct elemento *next;
};
void menu();
struct elemento *insElemento(struct elemento *);
struct elemento *ordLista(struct elemento *);
void printElemento(struct elemento *);
struct elemento *searchlist(struct elemento *, int n);
struct elemento *Delete (struct elemento *, int DaEliminare);
int main(){
struct elemento *Lista=NULL ;
int comando, x, i;
do{
menu();
printf("\nComando:\t");
scanf("%d", &comando);
switch(comando){
case 1:{
Lista=insElemento(Lista);
break;
}
case 2:{
Lista=ordLista(Lista);
break;
}
case 3:{
printElemento(Lista);
break;
}
case 4:{
printf("\n\nInserisci il valore da cercare:\n\n");
scanf("%d",&x);
if(searchlist(Lista,x)!=NULL)
printf("\n\nIl valore e' nella lista.\n\n");
else
printf("\n\nIl valore non e' nella lista.\n\n");
break;
}
case 5:{
printf("\n\nInserisci il valore da eliminare:\n\n");
scanf("%d",&x);
if(Lista!=NULL)//mancava lista al posto della variabile i
Lista=Delete(Lista,x);//i è un intero non devi assegnarli un puntatore e non serve
else printf("\n\nErrore. Lista vuota.\n\n");
break;
}
}
}while(true);
return 0;
}
void menu(){
printf("\n--------------------------");
printf("\n1 - Inserisci Elemento\n");
printf("2 - Ordinamento Lista\n");
printf("3 - Visualizza Lista\n");
printf("4 - Cerca elememto Lista\n");
printf("5 - Elimina elemento Lista\n");
printf("--------------------------\n");
}
//INSERIMENTO LISTA
struct elemento *insElemento(struct elemento *list_head){
/*QUESTA FUNZIONE VA BENE NEL CASO LA LISTA SIA NULL
MA SE LA LISTA è GIA' STATA CREATA , BISOGNEREBBE MODIFICARE
LA FUNZIONE IN MODO CHE AGGIUNGA ELEMENTI , CIOE SCORRERE LA
LISTA FINO A NULL , E DA LI AGGIUNGERE I NUOVI NODI*/
struct elemento *list_pointer, *list_record;
int i=2, n=0, val, newval;
list_record = (struct elemento *)malloc(sizeof(struct elemento));
printf("\nInserisci il 1 elemento: ");
scanf("%d", &val);
list_record->valore = val;
list_head=list_record;
list_pointer = list_head;
do{
list_record->next = (struct elemento *)malloc(sizeof(struct elemento));
list_record = list_record->next;
printf("\nInserisci il %d elemento: ", i++);
scanf("%d", &newval);
list_record->valore = newval;
printf("Inserire nuovo valore?");
scanf("%d",&n);
}while(n==1);
list_record->next = NULL;
list_pointer = list_head;
printElemento(list_head);
return (list_head);
}
//ORDINAMENTO LISTA
struct elemento *ordLista(struct elemento *list_head) {
struct elemento *list_pointer;
int flag, temp;
flag = 1;
while (flag == 1) {
list_pointer = list_head;
flag = 0;
while (list_pointer->next != NULL) {
if (list_pointer->valore > (list_pointer->next)->valore) {
temp = list_pointer->valore;
list_pointer->valore = (list_pointer->next)->valore;
(list_pointer->next)->valore = temp;
flag = 1;
}
list_pointer = list_pointer->next;
}
}
printElemento(list_head);
return list_head;}
//CERCA ELEMENTO
struct elemento *searchlist(struct elemento *list_head,int n){
while(list_head!=NULL )
{
if(list_head->valore==n)
return list_head;
list_head=list_head->next;
}
return NULL;//modifica alla funzione
}
//ELIMINA ELEMENTO
struct elemento *Delete(struct elemento *list_head, int DaEliminare){
struct elemento *list_pointer, *list_record;
for(list_pointer=list_head, list_record=list_head; list_record!=NULL && list_record->valore!=DaEliminare; list_pointer=list_record, list_record=list_record->next);
if(list_record->valore==DaEliminare) {
if(list_record!=list_head)
{
list_pointer->next=list_record->next;
free(list_record);
return list_head;
}
else
{
list_pointer=list_record->next;
free(list_record);
return list_pointer;
}
}
return list_head;
}
//STAMPA LISTA
void printElemento(struct elemento *Lista){
struct elemento *list_pointer = Lista;
printf("\nlista -> ");
while(list_pointer != NULL){
printf("%d", list_pointer->valore);
printf(" -> ");
list_pointer = list_pointer->next;
}
printf(" NULL");
}