|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[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? Codice HTML:
#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
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 7906
|
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)); |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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? Codice HTML:
#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*/
}
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ok ... faccio un esempio più completo: Codice:
#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;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
si in effetti gia mi avevi aiutato ma ora ho dimenticato come si fa
ora do un'occhiata a quello che hai scritto grazie |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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? |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
le funzioni non sono necessarie ma molto utili... quelle che ti servono a te sono un po' tutte
__________________
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
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ò
Codice HTML:
#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*/ } |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
mi aiutate a trovare l'errore?
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
dov'è dichiarato listaPtr come tipo?
perché non richiami la funzione per eliminare nel main? che errori e dove te li da?
__________________
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Bastava cambiare così il ciclo for nel main (e comunque bastava un while
Codice:
for (i = 0; i < n; i++) {
listaPtr t = malloc(sizeof(struct list));
scanf("%d", &valore);
t->value = valore;
t->nextPtr = ptr;
ptr = t;
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ho provato a riscrivere tutto ma mi da qualche errore nel main
Ultima modifica di xbubbax : 02-01-2008 alle 13:42. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Codice HTML:
#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); } |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 7906
|
quando fai l'allocazione della struttura ti conviene fare il casta puntatore
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
cioè?
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
Codice:
listaPtr l=(listaPtr)malloc(sizeof(struct nodo));
__________________
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
grazie ora provo
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
non va, secondo me ho sbagliato qualcosa nelle dichiarazioni
Codice HTML:
#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); } |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
qualcuno mi da una mano a controllare la parte sull'inserimento degli elementi?
non capisco dove sbaglio |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:57.




















