PDA

Visualizza la versione completa : [C] Esercizio con liste


-Yara-
23-10-2005, 19:19
Salve a tutti...
Devo fare un esercizio con le liste che consiste nel cancellare tutti i numeri pari della lista.
In pratica se ho una lista di questo genere:
6 3 2 1
Deve risultare:
3 1
Il secondo consiste nel, date due liste, vedere se un elemento della lista 1 appartiene alla lista 2.
Chi mi puo' aiutare?
Primo: (nn ho proprio idea di dove partire per cancellare un elemento)


#include <stdio.h>
#include <malloc.h>

using namespace std;

struct nodo
{
int info;
nodo* next;
};

nodo* Crea_lista();
void Visualizza_lista(nodo*);
void Elimina(nodo*);

int main()
{
nodo* lista=NULL; //creo la lista
lista=Crea_lista();
Visualizza_lista(lista);
Elimina(lista);
Visualizza_lista(lista);
fflush(stdin);
getchar();
return 0;
}

nodo* Crea_lista()
{
nodo *p,*punt;
int i,n;
printf("\nNumero elementi lista: ");
scanf("%d",&n);
if(n==0)
{
p=NULL;

}
else
{
//inserimento del primo valore
p=(nodo*)malloc(sizeof(nodo));
printf("\nInserisci il primo valore");
scanf("%d",&p->info);
punt=p;
}
for(i=2;i<=n;i++)
{
punt->next=(nodo*)malloc(sizeof(nodo));
punt=punt->next; //scorri
printf("\nInserisci il %d elemento: ",i);
scanf("%d",&punt->info);
}
punt->next=NULL;
return p;
}

void Visualizza_lista(nodo* lista)
{
printf(" Lista---> ");
while(lista!=NULL)
{
printf("%d",lista->info);
printf(" ---> ");
lista=lista->next;
}
printf("NULL\n\n");
getchar();
}

void Elimina(nodo* lista)
{
nodo* scorri=lista;
printf("LOL");
while(scorri!=NULL)
{
if(scorri->info%2==0)
{
printf("Trovato elemento pari, eliminazione in corso");
scorri=scorri->next;
free(scorri);
lista->next=scorri->next;
}
scorri=scorri->next;
}
}

L'altro l'ho risolto cosi' (metto solo la funzione che confronta)



int Confronta(nodo* lista,nodo* lista2)
{
nodo* scorri1;
nodo* scorri2;
scorri1=lista;
scorri2=lista2;
while(scorri1!=NULL)
{
while(scorri2!=NULL)
{
if(scorri2->info==scorri1->info)
return scorri1->info;
scorri2=scorri2->next;
}
scorri1=scorri1->next;
}
return -1;
}

Grazie a chi mi vorrà aiutare :)

-Yara-
23-10-2005, 21:06
up, plz mi serve per domani :(

XWolverineX
23-10-2005, 22:13
Per eliminare un numero prova cosi...



#include <stdio.h>
//Decidi quanti numeri devono essere inseriti
register int Numeri[10];

void main (void)
{
for (int i = 0; i < (sizeof(Numeri) / sizeof(int)) ;i++)
{
if (Numeri[i] % 2 != 0)
i = i + 1;
printf("%i",Numeri[i]);
}
return;
}

-Yara-
23-10-2005, 22:16
Originariamente inviato da XWolverineX
Per eliminare un numero prova cosi...



#include <stdio.h>
//Decidi quanti numeri devono essere inseriti
register int Numeri[10];

void main (void)
{
for (int i = 0; i < (sizeof(Numeri) / sizeof(int)) ;i++)
{
if (Numeri[i] % 2 != 0)
i = i + 1;
printf("%i",Numeri[i]);
}
return;
}


0_o scusa ma questo è con gli array..a me serve con le liste :D

-Yara-
24-10-2005, 12:17
up

byaur
24-10-2005, 15:36
Originariamente inviato da -Yara-
....


#include <stdio.h>
#include <malloc.h>

using namespace std;

struct nodo
{
int info;
nodo* next;
};

nodo* Crea_lista(); <----
void Visualizza_lista(nodo*);
void Elimina(nodo*);

int main()
{
nodo* lista=NULL; //creo la lista
lista=Crea_lista();
Visualizza_lista(lista);
Elimina(lista);
Visualizza_lista(lista);
fflush(stdin);
getchar();
return 0;
}

nodo* Crea_lista()
{
nodo *p,*punt;
int i,n;
printf("\nNumero elementi lista: ");
scanf("%d",&n);
if(n==0)
{
p=NULL;

}
else
{
//inserimento del primo valore
p=(nodo*)malloc(sizeof(nodo));
printf("\nInserisci il primo valore");
scanf("%d",&p->info);
punt=p;
}
for(i=2;i<=n;i++)
{
punt->next=(nodo*)malloc(sizeof(nodo));
punt=punt->next; //scorri
printf("\nInserisci il %d elemento: ",i);
scanf("%d",&punt->info);
}
punt->next=NULL;
return p;
}

void Visualizza_lista(nodo* lista)
{
printf(" Lista---> ");
while(lista!=NULL)
{
printf("%d",lista->info);
printf(" ---> ");
lista=lista->next;
}
printf("NULL\n\n");
getchar();
}

void Elimina(nodo* lista)
{
nodo* scorri=lista;
printf("LOL");
while(scorri!=NULL)
{
if(scorri->info%2==0)
{
printf("Trovato elemento pari, eliminazione in corso");
scorri=scorri->next;
free(scorri);
lista->next=scorri->next;
}
scorri=scorri->next;
}
}

L'altro l'ho risolto cosi' (metto solo la funzione che confronta)



int Confronta(nodo* lista,nodo* lista2)
{
nodo* scorri1;
nodo* scorri2;
scorri1=lista;
scorri2=lista2;
while(scorri1!=NULL)
{
while(scorri2!=NULL)
{
if(scorri2->info==scorri1->info)
return scorri1->info;
scorri2=scorri2->next;
}
scorri1=scorri1->next;
}
return -1;
}

Grazie a chi mi vorrà aiutare :)

mi sembra a prima vista sia sbagliato anche la dichiarazione del "nodo"...
cioè tu hai dichiarato un struct nodo{...}
poi ai dichiarato lista come nodo *lista...

così è sbagliato...:dhò: :dhò:
quindi puoi fare


struct nodo{...}
....

struct nodo *lista;

oppure usi la typedef per ridefinirti "il nome" di nodo


struct nodo{...}
typedef struct nodo elemNodo;
....
elemNodo *lista;


quando ho tempo mi vedo le funzioni che ai scritto...


:ciauz: :ciauz: :ciauz:

-Yara-
24-10-2005, 16:37
Grazie...cmq il compilatore compila lo stesso anche senza typedef..
Ho un nuovo esercizio:
Invertire il contenuto di una lista, per esempio
123456789 --> 987654321

Qualche idea? Io non so da dove cominciare-....:)

byaur
24-10-2005, 16:44
be...
io scorrerei la lista di partenza fino alla fine e ogni nodo lo passerei a una funzione che mi ricrea un'altra lista inserendo il nodo in testa... naturalmente devi gestire il fatto che il primo nodo che gli passi deve avere il campo next a null....


1 2 3 ....->>>>> ... 3 2 1


:ciauz: :ciauz:

X-sPiKe_iT
25-10-2005, 00:14
dato che sono in partenza per andare a nanna (sarebbe anche ora xD) non mi soffermo a leggere il codice se no non vado piu' a nanna..
cmq per cancellare un elemento dalla lista dichiari un po' di puntatori alla stuttura della lista e inizi a scorrerla, quando determini che un elemento va eliminato ovviamente significa che hai un puntatore alla stuttura che stai valutando, quindi a noi cosa interessa avere ? un puntatore aggiornato a ogni scorrimento che punti alla struttura precedente di quella che stiamo valutando, un puntatore per salvare l'indirizzo dell'elemento successivo della lista a quello che stiamo valutando, nel momento in cui devi cancellare un elemento non fai altro che:
1) determinarlo
2) "torni indietro" con il puntatore che punta alla struttura precedente
3) salvi in precedente.next il valore di attuale.next
4) esegui una free con attuale ed ecco eliminato un elemento dalla lista...

invertire il contenuto di una lista e' piu' complesso ok ma il trucco e' sempre quello :P
la seconda lista devi ovviamente concatenarla "al contrario" ovvero tu parti a scorrere la lista input e salvi il puntatore alla lista nella seconda lista, poi scorri avanti di 1 e salvi la struct letta che invece di essere la prima diventa l'ultima, quindi il campo next della struct lo inizializzi con il puntatore che utilizzi per gestire la prima lista :P
non so se sono stato chiaro ma come ha detto byaur basta scorrere la lista in input e creare una seconda lista dove invece che concatenare alla fine concateni all'inizio e' abbastanza facile :P

Loading