PDA

Visualizza la versione completa : [C] Ricerca ed Elimina elemento di una Lista


Ronald940
30-07-2014, 01:09
Saaalve. Vi scrivo per chiedervi una mano riguardo per risolvere il problema del mio codice..
Praticamente ho provato di tutto.. ma non riesco proprio a far funzionare la RICERCA e l'ELIMINAZIONE degli elementi.. Qualche consiglio?

Ecco il mio codice:



#include <stdio.h>
#include <stdlib.h>
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(i,x)!=NULL)
printf("\n\nIl valore e' nella lista.\n\n");
break;
}
case 5:{
printf("\n\nInserisci il valore da eliminare:\n\n");
scanf("%d",&x);
if(i!=NULL)
i=Delete(i,x);
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){
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 && list_head->valore!=n)
list_head=list_head->next;
return list_head;
}
//ELIMINA ELEMENTO
struct entry *Delete (struct entry *list_head, int DaEliminare)
{
struct entry *list_record,*list_pointer;
for(list_pointer=NULL, list_record=list_head; list_record!=NULL && list_record->valore!=DaEliminare; list_pointer=list_record, list_record=list_record->next)

if(list_record==NULL)
return list_head;

if(list_pointer==NULL)
list_head=list_head->next;
else
list_pointer->next=list_record->next;

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

torn24
30-07-2014, 07:52
Ciao , visto che nella funzione delete , non usi la funzione free() , mi pare che non si possa considerare corretta , ti metto un esempio di come implementerei io la funzione , POSSONO esserci errori :)





struct entry *Delete (struct entry *list_head, int DaEliminare)
{
struct entry *list_record,*list_pointer;

/*
list_pointer e list_record , partono puntando entrambi alla testa della lista
quando il ciclo for incrementa , troviamo che list_record punta al nodo sucessivo , e
list_pointer al nodo che precede
il ciclo termina quando list_record è NULL o quando ha trovato valore
con un if , non dipendente dal for controllo se ha trovato valore




*/
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)//se il nodo da eliminare non è la testa
{
list_pointer->next=list_record->next //List pointer next ,puntava a record, adesso punta al nodo sucessivo
free(list_record);//elimino il nodo in memoria
return list_head;
}
else //il nodo da eliminare è il primo
{
list_pointer=list_record->next
free(list_record);//elimino il nodo in memoria
return list_pointer;

}
}

return list_head;

}

Ronald940
30-07-2014, 08:07
Mhh, penso di aver capito.. Appena posso provo il codice e ti faccio sapere!
Invece per quanto riguarda la RICERCA.. (forse anche l'eliminazione) perché nel case mi segna come errore la x?
if(searchlist(i,x)!=NULL)

torn24
30-07-2014, 08:16
Ricerca , restituisce sempre head in qualunque caso ..
alla funzione searchlist() non devi passare int i ,come primo parametro , ma la testa della lista .
VEDO CHE HAI FATTO LO STESSO ERRORE CON DELETE ! non i come parametro , ma lista ....





struct elemento *searchlist(struct elemento *list_head,int n)
{
while(list_head!=NULL && list_head->valore!=n)
list_head=list_head->next;
if(list_head->valore==n)//il ciclo while termina o head==NULL o valore==n
return list_head;
else
return NULL;//se ritorna NULL n non è presente nella lista


}

Ronald940
30-07-2014, 08:40
Si ma i problema me lo da nel case del main()
Mi dice "invalid conversion from 'int' to 'elemento' [-fpermessive]
io x l'ho dichiarata int.. o.O

torn24
30-07-2014, 08:50
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)// se lista è NULL la funzione restituirà NULL
printf("\n\nIl valore e' nella lista.\n\n");
break;
}
case 5:{
printf("\n\nInserisci il valore da eliminare:\n\n");
scanf("%d",&x);
if(i!=NULL)
i=Delete(Lista,x);// se lista è NULL la funzione restituirà NULL
else printf("\n\nErrore. Lista vuota.\n\n");
break;
}
}while(true);
return 0;
}

Ronald940
30-07-2014, 09:11
Eh be torn ci siamo quasi..

RICERCA: Mi trova i valori presenti, ma quando digito un valore non presente mi chiude il programma..
Ho inserito un else printf("Valore non presente"); ma lo stesso...

ELIMINAZIONE: Praticamente qualsiasi valore io digiti mi manda il printf dell'else.. "Errore. Lista vuota."

torn24
30-07-2014, 09:35
Ciao , non è che potresti postare il programma come è ora , tra tag code, cosi lo compilo e lo provo , altrimenti mi resta di immaginare il codice che hai modificato ... ;)

Prima di eliminare un nodo , hai pensato di creare la lista con l'apposita funzione , immagino di si ma non si sa mai ....

Ronald940
30-07-2014, 09:42
#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(i!=NULL)
i=Delete(Lista,x);
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){
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 && list_head->valore!=n)
list_head=list_head->next;
if(list_head->valore==n)
return list_head;
else
return NULL;
}

//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");
}


Sisi, ho anche utilizzato la funzione stampa.. e poi le altre..

torn24
30-07-2014, 10:37
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 .




#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");
}

Loading