PDA

Visualizza la versione completa : [C]lista che non tiene in memoria gli elementi già inseriti


333luca333
06-02-2013, 12:58
#include<stdio.h>
#include<malloc.h>




struct ele{
int val;
struct ele *next;

};
int menu (void);
struct ele *crea_lista(void);
void stampa_lista(struct ele *punt_lista);
struct ele * canc_testa(struct ele *a);
void canc_coda(struct ele *a);
struct ele* ins_testa(struct ele *a,int val);
struct ele* ins_coda(struct ele*a,int val);

int main(){
struct ele *punt_lista;
punt_lista=NULL; // è bene inizializzare altrimenti non riconosce che se la lista è vuota non c'è nulla da cancellare!
int valore; //PUNTATORE ALLA LISTA


int scelta;
while(scelta=menu()){

switch(scelta){

case 1:

system("CLS");
printf("***INSERIMENTO DATI***\n");
punt_lista=crea_lista();
break;

case 2:

system("CLS");
printf("***CANCELLAZIONE ELEMENTO IN TESTA***\n");
punt_lista=canc_testa(punt_lista);
break;


case 3:

system("CLS");
printf("***STAMPA LISTA***\n");
stampa_lista(punt_lista);

break;


case 4:

system("CLS");
printf("***RICERCA DATI***\n");
break;

case 5:

system("CLS");
printf("***INSERIMENTO ELEMENTO IN TESTA***\n");
printf("Inserisci ora l'elemento nuovo: ");
scanf("%d",&valore);
punt_lista=ins_testa(punt_lista,valore);

break;
case 6:

system("CLS");
printf("***INSERIMENTO ELEMENTO CODA***\n");
printf("Inserisci ora l'elemento nuovo: ");
scanf("%d",&valore);
punt_lista=ins_coda(punt_lista,valore);
break;

case 7:

system("CLS");
printf("***CANCELLAZIONE ELEMENTO IN CODA***\n");
canc_coda(punt_lista);
break;


case 0:

return 0;






}



}





return 0;
}



int menu (void){
int x;
printf("\nSELEZIONA LA TUA SCELTA\n");
printf("1.Per inserire \n");
printf("2.Per cancellare elemento in testa \n");
printf("3.Per stampare la lista \n");
printf("4.Per cercare un elemento \n");
printf("5.Per inserire elemento in testa \n");
printf("6.Per inserire elemento in coda\n ");
printf("7.Per cancellare elemento in coda\n ");
printf("0.Per uscire \n\n");
printf("Digita ora la scelta: ");
scanf("%d",&x);
while(x<0 || x>7){
printf("Hai sbagliato a digitare!\n\n");
printf("Fai la scelta giusta!: ");
scanf("%d",&x);

}

return x;
}

struct ele * crea_lista (void){
struct ele *p,*paus;
int x,i;
printf("quanti valori vuoi inserire nella lista? \n\n");
scanf("%d",&x);
if(x==0)
p=NULL;
else{
p=(struct ele*)malloc(sizeof(struct ele)); //INIZIALIZZO IL PUNTATORE
printf("Inserisci il primo elemento della lista: ");
scanf("%d",&p->val);
paus=p;
for(i=2;i<=x;i++){
paus->next=(struct ele*)malloc(sizeof(struct ele));
paus=paus->next;
printf("Inserisci l'elemento numero %d : ",i);
scanf("%d",&paus->val);
}
paus->next=NULL; //marca di fine lista,è importante perchè in fase di compilazione
// non da errore ma se compili va avanti fino ad esaurimento memoria,penso.
}
return p;
}

void stampa_lista(struct ele *punt_lista){

printf("punt_lista---->");
while(punt_lista!=NULL){
printf(" %d ",punt_lista->val);
printf("---->");
punt_lista=punt_lista->next;


}
printf("NULL\n");


}

struct ele* canc_testa(struct ele *a){

struct ele *tmp;
if(a==NULL)
printf("Non c'e' NULLA da cancellare\n");
else{
tmp=a;
a=tmp->next;
free(tmp);


}
return a;
}

void canc_coda(struct ele *a){
struct ele*tmp;

if (a==NULL)
printf("Non c'e' niente da cancellare!\n");
else{
while(a!=NULL)
a=a->next;
}

tmp=a;


free(tmp);






}
struct ele* ins_testa(struct ele *a,int val){
struct ele *tmp;
tmp=a;
a=(struct ele *)malloc(sizeof(struct ele));
a->val=val;
a->next=tmp;
return a;



}
struct ele* ins_coda(struct ele*a,int val){
if(a==NULL){
a=(struct ele *)malloc(sizeof(struct ele));
a->val=val;
a->next=NULL;
}
else{

a=ins_coda(a->next,val);

}

return a;
}



Il problema lo trovo proprio nell'inserimento in coda; mi spiego meglio, se nello switch scelgo di inserire in coda, dopo aver effettuato l'inserimento, visualizzo correttamente la mia mia inserzione richiamando la funzione stampa. Se vado a richiedere di inserire in coda il nuovo valore che passo da tastiera si sovrascrive al valore che precedentemente avevo inserito, pertanto non ha memoria.
Inoltre se nello switch invoco prima la funzione crea lista con una un numero predeterminato di elementi, e successivamente a ciò chiedo di inserire in coda, il valore che passo da tastiera non viene attaccato alla lista, anzi, si sovrascrive ai dati già inseriti, mentre se invoco la funzione di inserimento in testa, questa ha memoria, quindi funziona.

Ora, io credo che l'errore sia nel valore di ritorno della funzione "ins_coda" e "crea_lista", però non sono così sicuro, vorrei una dritta per capire l'errore.
Oppure potrebbe essre un problema di collegamento fra loro? Cioè fra le due funzioni in questione.

Grazie, Luca

oregon
06-02-2013, 14:07
Non si scrive in maiuscolo ...!

333luca333
08-02-2013, 11:34
Non si scrive in maiuscolo ...!




Tutta qui la risposta?????


Boh, non mi pare di aver letto di scrivere in minuscolo! :old:

Alex'87
08-02-2013, 12:05
Originariamente inviato da 333luca333
Boh, non mi pare di aver letto di scrivere in minuscolo! :old:

Sicuro? Regolamento di sezione, punto 10 :D

In generale, evita abbreviazioni da SMS e abusi della formattazione (es. testi completamente in grassetto o in maiuscolo) per migliorare la leggibilità dei quesiti.


Ricorda che scrivere in maiscolo equivale ad urlare...

333luca333
08-02-2013, 13:57
Ok, okkey va bene ho sbagliato ammetto l'errore, ma ancora non ho risolto il problema, se per ottenere una risposta, debbo riscrivere il tutto in minuscolo, no problem, basta avere una semplice risposta, siamo o non siamo in un forum dove si parla di programmazione? :unz:

oregon
08-02-2013, 14:07
Originariamente inviato da 333luca333
siamo o non siamo in un forum dove si parla di programmazione? :unz:

Siamo *ospiti* in un forum. E come ospiti dobbiamo seguire e rispettare il regolamento.

Oltre al fatto che la netiquette su Internet indica che scrivere tutto maiuscolo è indice di maleducazione perché equivale ad urlare.

Potresti non conoscere queste "norme" o "non leggere" il regolamento e comunque "ignorarle" ma non puoi dire "siamo o non siamo in un forum di programmazione" come se gli altri ti dessero fastidio ...

Sempre rimanendo OT, in ogni caso, non è bello seguire e correggere un codice in cui ci si esprime così come ti esprimi tu usando certe frasi.

Quindi sì, questo tuo thread è tra i pochi veramente sgradevoli.

LeleFT
08-02-2013, 14:20
Ho volutamente modificato il codice da te postato, togliendo tutto ciò che va contro il buon senso nella scrittura delle frasi. In futuro, evita di postare frasi che non si addicono alla normale educazione (anche all'interno del codice).

Lascio aperta la discussione, che può quindi procedere come se nulla fosse accaduto. Non saranno tollerate, in futuro, cose simili.

Ciao. :ciauz:

333luca333
08-02-2013, 14:25
Ragazzi ma si usano certe frasi anche per rendere più simpatico il codice, ovviamente sono questioni puramente personali, mi scuso se ho pffeso qualcuno con le mie parole riportate nel codice.

MItaly
08-02-2013, 15:44
(Già che siamo in giro, ho tolto anche tutto il maiuscolo, che nun se po' vedé. :mem: )

oregon
08-02-2013, 16:06
Originariamente inviato da MItaly
(Già che siamo in giro, ho tolto anche tutto il maiuscolo, che nun se po' vedé. :mem: )

E per il problema, rivedrei la ins_coda così



struct ele *ins_coda(struct ele *a,int val)
{
struct ele *tmp, *nuo;

tmp=a;

nuo = (struct ele *)malloc(sizeof(struct ele));
nuo->val = val;
nuo->next = NULL;

if(!tmp) return nuo;

while(tmp->next)
tmp=tmp->next;

tmp->next=nuo;

return a;
}

Loading