PDA

View Full Version : [C] Inizializzare una lista


xbubbax
24-12-2007, 14:54
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));

xbubbax
25-12-2007, 12:28
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

xbubbax
26-12-2007, 12:14
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*/






}

andbin
26-12-2007, 13:35
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;
}

xbubbax
26-12-2007, 16:59
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

xbubbax
26-12-2007, 17:02
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:

xbubbax
26-12-2007, 17:25
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*/






}

xbubbax
27-12-2007, 13:51
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

xbubbax
02-01-2008, 12:40
ho provato a riscrivere tutto ma mi da qualche errore nel main

xbubbax
02-01-2008, 12:43
#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

xbubbax
02-01-2008, 12:56
cioè?

marko.fatto
02-01-2008, 12:58
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));

xbubbax
02-01-2008, 13:00
grazie ora provo

xbubbax
02-01-2008, 13:01
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);

}

xbubbax
02-01-2008, 13:26
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

xbubbax
02-01-2008, 13:32
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..

andbin
02-01-2008, 13:33
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:

xbubbax
02-01-2008, 13:35
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;)

xbubbax
02-01-2008, 14:40
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

xbubbax
02-01-2008, 14:48
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

xbubbax
02-01-2008, 14:53
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

xbubbax
02-01-2008, 15:14
p

xbubbax
02-01-2008, 15:21
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

xbubbax
02-01-2008, 15:48
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...

andbin
02-01-2008, 15:53
è 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

xbubbax
02-01-2008, 16:18
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

xbubbax
02-01-2008, 17:07
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);

}

xbubbax
02-01-2008, 17:14
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);

}

xbubbax
02-01-2008, 17:21
è 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

xbubbax
02-01-2008, 18:48
ti ringrazio ora me lo vedo per bene...

xbubbax
02-01-2008, 18:51
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: )

xbubbax
02-01-2008, 18:59
li ho tolti ora sto modificando quello che dicevi spero sia solo quello:D

xbubbax
02-01-2008, 19:02
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:

xbubbax
02-01-2008, 19:17
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;
}

xbubbax
02-01-2008, 19:27
funziona grazieee

supermario
02-01-2008, 19:30
10 eurozzi su postepay:stordita:

xbubbax
02-01-2008, 20:58
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;
}