PDA

Visualizza la versione completa : [C] Eliminare un nodo


trashie
15-12-2005, 12:46
Salve a tutti.

Ho questo codice che crea una lista dinamica di int e la visualizza.

Volendo eliminare un numero dalla lista, come posso fare? Devo fare in modo da poter indirizzare il puntatore del nodo precedente a quello successivo al nodo da eliminare e poi facendo un free(puntatore).

Solo non riesco a far passare l'indirizzo a cui puntare al nodo precedente :(



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

void crealista();
void visualizzalista();

struct elenco {
int numero;
struct elenco *pun;
};

int i,n;
struct elenco *p,*paux;

main()
{
crealista();
visualizzalista();
}

void crealista()
{
printf("Quanti numeri vuoi inserire nella lista? ");
scanf("%i",&n);

if (n==0)
p = NULL;
else
{
p = (struct elenco *)malloc(sizeof(struct elenco));
printf("\nInserisci il valore: ");
scanf("%i",&p->numero);
paux = p;
for (i=1;i<=n-1;i++)
{
paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
paux = paux->pun;
printf("\nInserisci il valore: ");
scanf("%i",&paux->numero);
if (i==n-1)
paux->pun = NULL;
}
}
}

void visualizzalista()
{
system("cls");
paux = p;
while (paux != NULL)
{
printf("%i\n",paux->numero);
paux = paux->pun;
}
}


Grazie mille per eventuali consigli :)

{Bl4d3}
15-12-2005, 14:33
lista elimina(lista l, tipo_dato dato)
{
if (lista == NULL)
return NULL;
else if (lista->info == dato)
{
lista temp = lista;
lista = lista->next;
free(temp);
}
else
lista->next = elimina(lista->next, dato);
return lista;
}

trashie
15-12-2005, 14:41
praticamente tu usi un puntatore ausiliario che prende l'indirizzo del nodo contenente il dato da eliminare, poi il puntatore che scorre lo sposti al successivo e elimini il nodo puntato dal puntatore ausiliario?

Non ho provato ancora ma sei sicuro che funzioni?

trashie
15-12-2005, 14:49
#include <stdio.h>
#include <stdlib.h>

void crealista();
void visualizzalista();
void eliminanumero();

struct elenco {
int numero;
struct elenco *pun;
};

int i,n;
struct elenco *p,*paux, *paux2;

main()
{
crealista();
visualizzalista();
eliminanumero();
visualizzalista();
}

void crealista()
{
printf("Quanti numeri vuoi inserire nella lista? ");
scanf("%i",&n);

if (n==0)
p = NULL;
else
{
p = (struct elenco *)malloc(sizeof(struct elenco));
printf("\nInserisci il valore: ");
scanf("%i",&p->numero);
paux = p;
for (i=1;i<=n-1;i++)
{
paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
paux = paux->pun;
printf("\nInserisci il valore: ");
scanf("%i",&paux->numero);
if (i==n-1)
paux->pun = NULL;
}
}
}

void visualizzalista()
{
system("cls");
paux = p;
while (paux != NULL)
{
printf("%i\n",paux->numero);
paux = paux->pun;
}
}

void eliminanumero()
{
int dato;
printf("Che numero vuoi eliminare? ");
scanf("%i",&dato);
paux = p;
while (paux != NULL)
{
if (paux->numero == dato)
{
paux2 = paux;
paux = paux->pun;
free(paux2);
}
paux = paux->pun;
}
}


modificato il codice cos ma non funziona e in effetti dubito abbia molto senso :bh:

{Bl4d3}
15-12-2005, 16:05
non avevo fatto caso al fatto che usassi variabili globali... allora la versione che ho fatto io (ricorsiva) non va bene...



void eliminanumero()
{
int dato;
printf("Che numero vuoi eliminare? ");
scanf("%i",&dato);
paux = p;
if (paux)
while (paux->pun != NULL)
{
if (paux->pun->numero == dato)
{
paux2 = paux->pun;
paux->pun = paux->pun->pun;
free(paux2);
break;
}
paux = paux->pun;
}
}


dovrebbe funzionare...

trashie
16-12-2005, 12:08
#include <stdio.h>
#include <stdlib.h>

void crealista();
void visualizzalista();
void eliminanumero();

struct elenco {
int numero;
struct elenco *pun;
};

int i,n;
struct elenco *p,*paux, *paux2;

main()
{
char risp;

crealista();
visualizzalista();
}

void crealista()
{
printf("Quanti numeri vuoi inserire nella lista? ");
scanf("%i",&n);

if (n==0)
p = NULL;
else
{
p = (struct elenco *)malloc(sizeof(struct elenco));
printf("\nInserisci il valore: ");
scanf("%i",&p->numero);
paux = p;
for (i=1;i<=n-1;i++)
{
paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
paux = paux->pun;
printf("\nInserisci il valore: ");
scanf("%i",&paux->numero);
if (i==n-1)
paux->pun = NULL;
}
}
}

void visualizzalista()
{
char risp;

system("cls");
paux = p;
while (paux != NULL)
{
printf("%i\n",paux->numero);
paux = paux->pun;
}
printf("\n\nVuoi eliminare un numero? (s/n): ");
scanf("%1s",&risp);
switch (risp) {
case 's': eliminanumero();
break;
case 'n': exit(0);
break;
default:
printf("\n%i",risp);
printf("\n\nIl tasto scelto non permette azioni! Il programma viene terminato");
exit(0);
}
}

void eliminanumero()
{
int dato;
printf("Che numero vuoi eliminare? ");
scanf("%i",&dato);
paux = p;
while (paux->pun != NULL)
{
if (paux->pun->numero == dato || paux->numero == dato)
{
paux2 = paux->pun;
paux->pun = paux->pun->pun;
free(paux2);
break;
}
paux = paux->pun;
}
visualizzalista();
}


questo il codice completo, elimina eventuali numeri e tutto ok.

Il problema pero', come avevo giustamente pensato vedendo il codice sopra, che il primo numero della lista non viene eliminato :bh:

trashie
16-12-2005, 14:58
allora, ho riscritto daccapo la routine di cancellazione di un numero dalla lista e funziona bene, c' solo un problema: perch se inserisco un numero da cancellare che non in elenco il programma crasha?



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

void crealista();
void visualizzalista();
void eliminanumero();

struct elenco {
int numero;
struct elenco *pun;
};

int i,n;
struct elenco *p,*paux, *paux2;

main()
{
char risp;

crealista();
visualizzalista();
}

void crealista()
{
printf("Quanti numeri vuoi inserire nella lista? ");
scanf("%i",&n);

if (n==0)
p = NULL;
else
{
p = (struct elenco *)malloc(sizeof(struct elenco));
printf("\nInserisci il valore: ");
scanf("%i",&p->numero);
paux = p;
for (i=1;i<=n-1;i++)
{
paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
paux = paux->pun;
printf("\nInserisci il valore: ");
scanf("%i",&paux->numero);
if (i==n-1)
paux->pun = NULL;
}
}
}

void visualizzalista()
{
char risp;

system("cls");
paux = p;
while (paux != NULL)
{
printf("%i\n",paux->numero);
paux = paux->pun;
}
printf("\n\nVuoi eliminare un numero? (s/n): ");
scanf("%1s",&risp);
switch (risp) {
case 's': eliminanumero();
break;
case 'n': exit(0);
break;
default:
printf("\n%i",risp);
printf("\n\nIl tasto scelto non permette azioni! Il programma viene terminato");
exit(0);
}
}

void eliminanumero()
{
int dato;
printf("Che numero vuoi eliminare? ");
scanf("%i",&dato);
paux = p;
while (paux != NULL)
{
if (paux == p && paux->numero == dato)
{
p = paux->pun;
free(paux);
break;
}
else if (paux->pun->numero == dato)
{
paux->pun = paux->pun->pun;
paux2 = paux->pun;
free(paux2);
break;
}
paux = paux->pun;
}
visualizzalista();
}

{Bl4d3}
16-12-2005, 20:21
void eliminanumero()
{
int dato;
printf("Che numero vuoi eliminare? ");
scanf("%i",&dato);
paux = p;
while (paux != NULL)
{
if (paux == p && paux->numero == dato)
{
p = paux->pun;
free(paux);
break;
}
else if (paux->pun->numero == dato)
{
paux2 = paux->pun; /* Ho invertito queste due linee */
paux->pun = paux->pun->pun;
free(paux2);
break;
}
paux = paux->pun;
}
visualizzalista();
}


il problema che vedevo era nell'eliminazione...

Loading