View Full Version : [C] Inizializzare una lista
Allora, devo fare un programma che data una lista con elementi presi da input chiami una funzione che togla un determinato elemento k dalla lista, anch'esso preso da input. cioè elimini dalla lista la prima occorrenza di k
se ad esempio l'input è 3 5 2 7 3
la lista sarà cosi 3->7->2->5->3
cioè il primo elemento inserito sarà l'ultimo della lista e il secondo il penultimo e cosi via
ho fatto la funzione ma non capisco come si inizializza la lista, cioè come si inseriscono gli elementi. mi date una mano?
#include <stdio.h>
struct nodo
{
int elem;
struct nodo *next;
};
typedef struct nodo listaElem;
typedef struct nodo *listaPtr;
listaPtr eliminaPrimo(listaPtr l, int k){
listaPtr prev, curr, tempPtr;
if(k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;}
else{
prev=l;
curr=l->next;
while((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;}
if(curr!=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;}
}
int main(){
int n=0;
int k=0;
int i=0;
scanf("%d", &n); numero di elementi della lista
scanf("%d", &k); elemento da eliminare
}
supermario
24-12-2007, 16:35
non vedo malloc nel tuo codice, sostanzialmente gli elementi della lista si creano così e poi si aggiornano i link
vuoi fare un inserimento in testa quindi basta aggiornare i link per ogni malloc senza scorrere la lista
la malloc dovrebbe essere una cosa del tipo
elemento = (struct *)malloc(sizeof(struct));
sisi questo piu o meno lo sapevo, ma non so proprio come scrivere tutto il codice per l'inserimento degli elementi, compreso la scanf. puoi darmi una mano?
grazie mille
ho riscritto tutto piu semplice per capire bene due cose
1-è giusta la dichiarazione della struttura/lista?
2-mi aiutate a scrivere il codice per inserire gli elementi in testa?
#include <stdio.h>
struct nodo
{
int elem;
struct nodo *next;};
typedef struct nodo *listaPtr;
typedef struct nodo *listaElem;
listaPtr eliminaPrimo(listaPtr l, int k){
}
int main(){
int n=0;
int k=0;
scanf("%d", &n); /*INSERISCO IL NUMERO DI ELEMENTI DELLA LISTA*/
elem = (struct *)malloc(sizeof(struct));
/*INSERIRE ELEMENTI LISTA SEMPRE IN TESTA*/
scanf("%d", &k); /*INSERISCO IL NUMERO DA ELIMINARE*/
}
1-è giusta la dichiarazione della struttura/lista?
2-mi aiutate a scrivere il codice per inserire gli elementi in testa?Mi sfugge qualcosa .... non avevo già fatto un esempio in <questa> (http://www.hwupgrade.it/forum/showthread.php?t=1526774) discussione? (beh, avevo fatto l'esempio solo di un "append" .... l'inserimento in testa però è ancora più semplice).
Ok ... faccio un esempio più completo:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} NODE, *PNODE, **PPNODE;
int List_AddFirst (PPNODE pproot, int data)
{
PNODE pnode;
if (pproot == NULL)
return 0;
if ((pnode = (PNODE) malloc (sizeof (NODE))) == NULL)
return 0;
pnode->data = data;
pnode->next = *pproot;
*pproot = pnode;
return 1;
}
int List_AddLast (PPNODE pproot, int data)
{
PNODE pnode;
if (pproot == NULL)
return 0;
if ((pnode = (PNODE) malloc (sizeof (NODE))) == NULL)
return 0;
pnode->data = data;
pnode->next = NULL;
while (*pproot != NULL)
pproot = &(*pproot)->next;
*pproot = pnode;
return 1;
}
int List_Free (PPNODE pproot)
{
PNODE pnode, pnode_t;
if (pproot == NULL)
return 0;
pnode = *pproot;
while (pnode != NULL)
{
pnode_t = pnode->next;
free (pnode);
pnode = pnode_t;
}
*pproot = NULL;
return 1;
}
int main (void)
{
PNODE proot = NULL, pnode;
List_AddLast (&proot, 27);
List_AddLast (&proot, 7);
List_AddLast (&proot, 87);
List_AddFirst (&proot, 5);
List_AddFirst (&proot, 2);
pnode = proot;
while (pnode != NULL)
{
printf ("%d\n", pnode->data);
pnode = pnode->next;
}
List_Free (&proot);
return 0;
}
si in effetti gia mi avevi aiutato ma ora ho dimenticato come si fa:D
ora do un'occhiata a quello che hai scritto
grazie
nell'esempio che hai postato in questa discussione cosa mi serve a me?
cioè perchè hai fatto delle funzioni? le devo usare per inserire gli elementi?
marko.fatto
26-12-2007, 17:18
le funzioni non sono necessarie ma molto utili... quelle che ti servono a te sono un po' tutte :fagiano:
allora, ho fatto tutto il programma aiutandomi con i vari post del forum, il programma deve eliminare la prima occorrenza di un elemento k dalla lista. non so perchè mi da errore però
#include <stdio.h>
#include <stdlib.h>
/*STRUTTURA*/
struct list
{
int value;
struct list *nextPtr;};
/*INIZIALIZZAZIONE*/
void init(struct list **ptrPtr){
ptrPtr==NULL;}
/*INSERIMENTO IN TESTA*/
void preinsert(struct list **ptrPtr, int value)
{
struct list *tmpPtr;
tmpPtr= *ptrPtr;
*ptrPtr=(struct list*) malloc(sizeof(struct list));
(*ptrPtr)->nextPtr=tmpPtr;
(*ptrPtr)->value=value;}
listaPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if(k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;}
else{
prev=l;
curr=l->next;
while((curr!=NULL)&&(curr->elem!=k)){
prev=curr;
curr=curr->next;}
if(curr!=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;}
return l;}
int main(){
struct list *ptr;
int n=0;
int valore=0;
int k=0;
int i=0;
init(&ptr);
scanf("%d", &n); /*INSERISCO IL NUMERO DI ELEMENTI DELLA LISTA*/
for(i=0;i<n;i++){
scanf("%d", &valore);
preinsert(&ptr,valore);}
scanf("%d", &k); /*INSERISCO IL NUMERO DA ELIMINARE*/
}
mi aiutate a trovare l'errore?
marko.fatto
28-12-2007, 09:41
dov'è dichiarato listaPtr come tipo?
perché non richiami la funzione per eliminare nel main?
che errori e dove te li da?
DanieleC88
29-12-2007, 14:37
Bastava cambiare così il ciclo for nel main (e comunque bastava un while :D):
for (i = 0; i < n; i++) {
listaPtr t = malloc(sizeof(struct list));
scanf("%d", &valore);
t->value = valore;
t->nextPtr = ptr;
ptr = t;
}
Buoni homework. :p
ho provato a riscrivere tutto ma mi da qualche errore nel main
#include <stdio.h>
struct nodo{
int elem;
struct nodo *next;
};
typedef struct nodo L_ELEM;
typedef struct nodo *listaPtr;
listaPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}
int main(){
struct nodo *l;
int i=0;
int n=0;
int valore=0;
int k=0;
scanf("%d", &n);
for(i=0;i<n;i++){
listaPtr l=malloc(sizeof(struct nodo));
scanf("%d", &valore);
l->elem=valore;
l->next=listaPtr;
listaPtr=l;}
scanf("%d", &k);
}
supermario
02-01-2008, 12:52
quando fai l'allocazione della struttura ti conviene fare il casta puntatore
marko.fatto
02-01-2008, 12:58
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));
non va, secondo me ho sbagliato qualcosa nelle dichiarazioni
#include <stdio.h>
struct nodo{
int elem;
struct nodo *next;
};
typedef struct nodo L_ELEM;
typedef struct nodo *listaPtr;
listaPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}
int main(){
struct nodo *l;
int i=0;
int n=0;
int valore=0;
int k=0;
scanf("%d", &n);
for(i=0;i<n;i++){
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));
scanf("%d", &valore);
l->elem=valore;
l->next=listaPtr;
listaPtr=l;}
scanf("%d", &k);
}
qualcuno mi da una mano a controllare la parte sull'inserimento degli elementi?
non capisco dove sbaglio
supermario
02-01-2008, 13:30
sto scrivendo una cosa io sul allocazione e inserimento di una lista
dammi 2 minuti
cerca di usare i nomi delle variabili che ho usato nel altrimenti devo riscrivere tutto o impazzire per adattarlo:D :D
grazie mille comq
p.s. ti ricordo che l'inserimento deve essere sempre in testa alla lista, cioè primo elemtno inserito sarà l'ultimo, secondo inserito penultimo ecc..
Tanto per iniziare, dove è la variabile che tiene la "root" della lista?? Non la vedo .... vedo che fai un listaPtr=l; ma non ha senso (listaPtr è un tipo).
P.S. ma allora tutti gli esempi che ho fatto io sulle liste non sono serviti a nulla .. :( :cry:
si sono serviti però io sono una frana in programmazione, basta che mi cambi i nomi di tutte le variabili e non ci capisco piu niente...comq da quando hai fatto gli esempi tu non ho avuto tempo per mettermi a programmare, mi sono dimenticato tutto:D :D :D
supermario
02-01-2008, 13:53
mi era sfuggito l'esempio di andbin, stavo scrivendo le stesse cose :D
non c'è bisogno che ti scriva nulla allora...studiati bene quel codice
e inoltre nel tuo aggiungi la stdlib che serve per le malloc;)
sincerament enon capisco gli esempi di andbin con tutti quei ppnode ecc,, non è che potete correggere il mio con i nomi che ho usato? cosi da imparare dai miei errori anziche riscrivere e ricapire tutto da capo?
grazie
tanto penso di aver sbagliato qualche stupidaggine
dovrei solo aggiungere qualcosa nel main dove ho inserito commenti ma non capiscono come scriverle quelle parti
#include <stdio.h>
#include <stdlib.h>
struct nodo{
int elem;
struct nodo *next;
};
typedef struct nodo L_ELEM;
typedef struct nodo *listaPtr;
listaPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}
int main(){
/*DICHIARARE LISTA*/
int *temp;
int i=0;
int n=0;
int valore=0;
int k=0;
scanf("%d", &n);
for(i=0;i<n;i++){
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));
scanf("%d", &valore);
/*AGGIUNGERE*/}
scanf("%d", &k);
}
supermario
02-01-2008, 14:50
è che stai scrivendo male il programma
a cominciare dall'utilizzo di quelle struct senza nemmeno un typedef, si genera solo casino
se poi ti stai confondendo tra strutture, puntatori e doppi puntatori, ti consiglio di ripassarti un pò il tutto...scrivere la pappa pronta non servirebbe a nulla
quanto c'è da sapere come codice te l'ha scritto andbin, manca solo un pò di "teoria" da parte tua :D
comq la funzione sembra correttissima, le typedef le ho usate se guardi in alto:D
non capisco come si inserisce un elemento, poi come si sposta avanti e si reinserisce un elemento dietro di esso
non capisco proprio come farlo, come utilizzare le liste per farlp
supermario
02-01-2008, 15:07
int List_AddFirst (PPNODE pproot, int data)
{
PNODE pnode;
if (pproot == NULL)
return 0;
if ((pnode = (PNODE) malloc (sizeof (NODE))) == NULL)
return 0;
pnode->data = data;
pnode->next = *pproot;
*pproot = pnode;
return 1;
}
la funzione che serve è questa
PPNODE è un puntatore alla radice o testa della lista, si ha bisogno di questo puntatore per sapere da dove "cominciare" a fare le operazioni
i due if controllano se la testa/radice esiste e se è c'è memoria per allocare il nuovo blocco rispettivamente
il resto è il codice per l'inserimento in testa
non la capisco proprio, se volete aiutarmi mi farebbe piacere sennò grazie lo stesso
supermario
02-01-2008, 15:36
questa è la mia soluzione della prima parte, sulla base delle funzioni di andbin
è scritta in maniera barbara ma la puoi migliorare
spero tu riesca a fare anche la seconda parte
ps. la funzione che hai usato è abbastanza inutile, inoltre a quanto ho capito l'hai solo copiata visto che usa liste doppiamente linkate e altro, del tutto inutili per quello che serve a te
ps ho usato programmazione modulare con adt, spero tu sappia di che si parla
non so cosa sia adt, vabbè mi arrangio da solo, non capisco perchè mi si debba complicare la vita, devo solo aggiusta 2 righe nel mio main, bah...
è scritta in maniera barbaraConcordo.
ps ho usato programmazione modulare con adt, spero tu sappia di che si parlaSperando che lo sappia anche tu. ;)
Per ADT si può intendere, in generale, "Abstract Data Type":
http://en.wikipedia.org/wiki/Abstract_data_type
http://it.wikipedia.org/wiki/Tipo_di_dato_astratto
E ciò che ho scritto nel mio esempio, di ADT non ha proprio nulla.
supermario
02-01-2008, 15:57
si lo so che nn è un vero adt :D
supermario
02-01-2008, 15:59
non so cosa sia adt, vabbè mi arrangio da solo, non capisco perchè mi si debba complicare la vita, devo solo aggiusta 2 righe nel mio main, bah...
le righe da cambiare nel main non sono proprio 2
vabbè 3-4 cioè solo il for, anche se la funzione è scritta male funziona e io ci capisco quello è l'importante.
se mi fate funzioni voi per iserire gli elemtni non le capisco, è meglio che lo fate sul mio codice, ma siccome voi pensate che uno ne approfitti solo per copiare il codice e basta vi sbagliate, le cercherei di capire...ma se mi scrivere cose con doppi puntatori o adt è inutile
ho rifatto il programma ma l'inserimento l'ho fatto normalmente, non inserendoli in testa ma normale. però non va lo stesso come mai?
#include <stdio.h>
#include <stdlib.h>
struct nodo{
int elem;
struct nodo *next;
};
typedef struct nodo L_ELEM;
typedef struct nodo *listaPtr;
listaPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}}
int main(){
listaPtr l;
int n=0;
int i=0;
int k=0;
int valore=0;
scanf("%d", &n);
for(i=0;i<n;i++){
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));
scanf("%d", valore);
l->elem=valore;
l=l->next;
}
scanf("%d", &k);
}
corretto
#include <stdio.h>
#include <stdlib.h>
struct nodo{
int elem;
struct nodo *next;
};
typedef struct nodo L_ELEM;
typedef struct nodo *listaPtr;
listaPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}}
int main(){
listaPtr l;
int n=0;
int i=0;
int k=0;
int valore=0;
scanf("%d", &n);
for(i=0;i<n;i++){
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));
scanf("%d", &valore);
l->elem=valore;
l=l->next;
}
scanf("%d", &k);
}
è completo con tanto di stmapa della lista ma mi da errore dopo che ho inserito tutti gli elementi
#include <stdio.h>
#include <stdlib.h>
struct nodo{
int elem;
struct nodo *next;
};
typedef struct nodo L_ELEM;
typedef struct nodo *listaPtr;
listaPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}}
void stampalista(listaPtr l)
{
if (l!=NULL)
{
printf("%d ",l->elem);
stampalista(l->next);
}}
int main(){
listaPtr l;
int n=0;
int i=0;
int k=0;
int valore=0;
scanf("%d", &n);
for(i=0;i<n;i++){
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));
scanf("%d", &valore);
l->elem=valore;
l=l->next;
}
scanf("%d", &k);
stampalista(l);
}
supermario
02-01-2008, 18:18
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo{
int elem;
struct nodo *next;
}nodo_t;
//nodo_t listaPtr;
//typedef struct nodo L_ELEM;
//listaPtr eliminaPrimo(listaPtr l, int k)
//{
// listaPtr prev,curr,tempPtr;
// if (k==l->elem){
// tempPtr=l;
// l=l->next;
// free(tempPtr);
// return l;
// }
// else{
// prev=l;
// curr=l->next;
// while ((curr!=NULL) && (curr->elem != k)){
// prev=curr;
// curr=curr->next;
// }
// if (curr !=NULL){
// tempPtr=curr;
// prev->next=curr->next;
// free(tempPtr);
// return l;
// }
// return l;
//
// }}
void stampalista(nodo_t *l)
{
while (l != NULL)
{
printf("%d ",l->elem);
l=l->next;
//stampalista(l->next);
}
}
int main(){
nodo_t *listaPtr=NULL;
nodo_t *tmp;
int n=0;
int i=0;
int k=0;
int valore=0;
printf("Num elem \n");
scanf("%d", &n);
printf("elem sono %d\n", n);
for(i=0;i<n;i++){
tmp=(nodo_t*)malloc(sizeof(nodo_t));
printf("Elemento %d \n", i+1);
scanf("%d", &valore);
tmp->elem=valore;
tmp->next=listaPtr;
listaPtr=tmp;
}
//listaPtr->next=NULL;
//scanf("%d", &k);
stampalista(listaPtr);
return 0;
}
non dire che non ti voglio bene :D
l'inserimento l'ho messo in testa
hai notato i cambiamenti che ho fatto?
la cosa fondamentale è l'inserimento del benedetto nodo temp, è lui che va allocato, non il puntatore alla testa
poi ti ho cambiato la funziona stampalista, completamente sbagliata(sbagliando avevi fatto una sorta di ricorsione senza fine...e ricorsione sulle liste è sadomaso :asd: )
nota come ti ho modificato la struttura e eliminato i tuoi typedef, la sintassi così è + corretta
se hai domande e hai msn ne riparliamo li
ps la funzione per l'elemento k riscrivila in base alla funzione stampa lista, modificando opportunamente il while e le operazioni della funzione
ti ringrazio ora me lo vedo per bene...
cosa sono tutti quegli //// che hai messo?
ho provato a toglierli ma non funziona il programma
supermario
02-01-2008, 18:59
:stordita: :stordita:
se c'è un // all'inizio di una riga, vuol dire che è commentata
è lo stesso di /* */ solo che non è ANSI c
se togli i commenti il programma non funzia xk le righe lo mandano in crash(è codice che non funziona/fa altre cose)
parti dal programma che ti ho postato e cancella tutte le righe commentate, sono cazzate(un pò tue un pò mie :stordita: )
li ho tolti ora sto modificando quello che dicevi spero sia solo quello:D
mi sembra corretto tutto, dov'è l'errore?:D
p.s.ho tolto i printf non servono
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo{
int elem;
struct nodo *next;
}nodo_t;
nodo_t listaPtr;
typedef struct nodo L_ELEM;
listPtr eliminaPrimo(listaPtr l, int k)
{
listaPtr prev,curr,tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}}
void stampalista(nodo_t *l)
{
while (l != NULL)
{
printf("%d ",l->elem);
l=l->next;
stampalista(l->next);
}
}
int main(){
nodo_t *listaPtr=NULL;
nodo_t *tmp;
int n=0;
int i=0;
int k=0;
int valore=0;
scanf("%d", &n);
for(i=0;i<n;i++){
tmp=(nodo_t*)malloc(sizeof(nodo_t));
scanf("%d", &valore);
tmp->elem=valore;
tmp->next=listaPtr;
listaPtr=tmp;
}
listaPtr->next=NULL;
scanf("%d", &k);
stampalista(listaPtr);
system("PAUSE");
return 0;
}
supermario
02-01-2008, 19:11
@ andbin
che non sia detto che non so fare un adt di primo livello :stordita:
questo programmillo che ho fatto come esercizio dell'uni ha tra le sue funzioni le 2 che servono a xbubbax, anche se sono con un FIFO e l'estrazione è solo del primo elemento
era per la gloria, scusate :D
@ xbubbax
nodo_t listaPtr;
typedef struct nodo L_ELEM;
listaPtr->next=NULL;
sti tre non servono, cancellali
listPtr eliminaPrimo(listaPtr l, int k) // NO! ci va nodo_t *l, int k
{
listaPtr prev,curr,tempPtr; // NO! ci va nodo_t *prev,*curr,*tempPtr
a occhio è solo questo, magari c'è altro prova un pò
ariedit....
stampalista(l->next);
questo non ci va assolutamente :muro:
non funziona ancora mi dice sintax error before elminaPrimo
e altre cosette
supermario
02-01-2008, 19:25
tagliamo la testa al toro
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo{
int elem;
struct nodo *next;
}nodo_t;
nodo_t *eliminaElem(nodo_t *l, int k)
{
nodo_t *prev,*curr,*tempPtr;
if (k==l->elem){
tempPtr=l;
l=l->next;
free(tempPtr);
return l;
}
else{
prev=l;
curr=l->next;
while ((curr!=NULL) && (curr->elem != k)){
prev=curr;
curr=curr->next;
}
if (curr !=NULL){
tempPtr=curr;
prev->next=curr->next;
free(tempPtr);
return l;
}
return l;
}}
void stampalista(nodo_t *l)
{
while (l != NULL)
{
printf("%d -> ",l->elem);
l=l->next;
}
}
int main(){
nodo_t *listaPtr=NULL;
nodo_t *tmp;
int n=0;
int i=0;
int k=0;
int valore=0;
scanf("%d", &n);
for(i=0;i<n;i++){
tmp=(nodo_t*)malloc(sizeof(nodo_t));
scanf("%d", &valore);
tmp->elem=valore;
tmp->next=listaPtr;
listaPtr=tmp;
}
scanf("%d", &k);
eliminaElem(listaPtr,k);
stampalista(listaPtr);
system("PAUSE");
return 0;
}
supermario
02-01-2008, 19:30
10 eurozzi su postepay:stordita:
ahahaha
comq ho fatto un esercizio simile però che deve eliminare tutte le occorrenze di un numero all'interno di una lista, ma invece di stampare i numeri che deve elminare stampa o 0, o il numero stesso o numeri enormi tipo 40232324.penso di non aver sbagliato niente visto che ho fatto quasi copia incolla per non stare a riscrivere tutto, al massimo c'è qualcosina all'interno della funzione però sembra ok
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo{
int elem;
struct nodo *next;
}listaPtr;
listaPtr *eliminaTutti(listaPtr *l, int k){
listaPtr *prev,*curr,*tempPtr;
prev=l;
curr=l->next;
while(curr!=NULL){
if(curr->elem!=k){
curr=curr->next;}else{
tempPtr=curr;
curr=curr->next;
free(tempPtr);}}
return l;}
void stampalista(listaPtr *l)
{
while (l != NULL)
{
printf("%d ",l->elem);
l=l->next;
}
}
int main(){
listaPtr *listaPtrdue=NULL;
listaPtr *tmp;
int n=0;
int i=0;
int k=0;
int valore=0;
scanf("%d", &n);
for(i=0;i<n;i++){
tmp=(listaPtr*)malloc(sizeof(listaPtr));
scanf("%d", &valore);
tmp->elem=valore;
tmp->next=listaPtrdue;
listaPtrdue=tmp;
}
scanf("%d", &k);
eliminaTutti(listaPtrdue,k);
printf("\n");
stampalista(listaPtrdue);
system("PAUSE");
return 0;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.