[C]lista che non tiene in memoria gli elementi già inseriti

di il
1 risposte

[C]lista che non tiene in memoria gli elementi già inseriti


#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'è un caxxo 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' niente 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 quando invoco la funzione di inserzione in coda, ovvero se ho già creato una lista con un numero predeterminato di elementi, e successivamente invoco la funzione suddetta, mi sovrascrive a ciò che aveva già inserito, a differenza della funzione di inserimento in testa.

Cosa potrebbe essere?
potrebbe essere legato al valore di ritorno, cioè al puntatore alla lista?


P.S. sono nuova del forum, spero di aver inserito il codice in maniera corretta, ed aver usato un linguaggio adeguato.

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte