Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct casella{
- int proprietario;
- struct casella* next;
- };
- typedef struct casella Casella;
- /*Dichiarazione funzioni e procedure*/
- Casella* inserimentoTesta(Casella*,int);
- Casella* inserimentoCoda (Casella*,int);
- Casella* cancellaTesta (Casella*);
- Casella* cancellaCoda (Casella*);
- void stampaRicorsiva(Casella*);
- void stampaIterativa(Casella*);
- void cancellaTuttoIterativa(Casella*);
- Casella* cancellaTuttoRicorsiva(Casella*);
- void aggiungiOrdinato(Casella*, int);//Aggiunge l'intero inserito prima del suo successivo.
- int main()
- {
- int num, scelta=0;
- Casella *lista = NULL;
- do{
- printf("\nProgramma per gestire una lista concatenata di interi.\n");
- printf("\nCosa vuoi fare?\n1. Aggiungi in testa\n2. Aggiungi in coda\n3. Cancella testa\n4. Cancella coda"
- "\n5. Stampa ricorsiva\n6. Stampa iterativa\n7. Cancella tutto iterativamente "
- "\n8. Cancella tutto ricorsivamente\n9. Aggiungi ordinato\n0. Exit\n");
- scanf("%d", &scelta);
- switch(scelta){
- case 1:
- do{
- printf("\nInserisci numero: ");
- scanf("%d", &num);
- if(num)
- lista = inserimentoTesta(lista,num);
- }while (num);
- break;
- case 2:
- do{
- printf("\nInserisci numero: ");
- scanf("%d", &num);
- if(num)
- lista = inserimentoCoda(lista,num);
- }while (num);
- break;
- case 3:
- lista = cancellaTesta(lista);
- break;
- case 4:
- lista = cancellaCoda(lista);
- break;
- case 5:
- stampaRicorsiva(lista);
- break;
- case 6:
- stampaIterativa(lista);
- break;
- case 7:
- cancellaTuttoIterativa(lista);
- break;
- case 8:
- lista = cancellaTuttoRicorsiva(lista);
- break;
- case 9:
- do{
- printf("\nInserisci numero: ");
- scanf("%d", &num);
- if(num)
- aggiungiOrdinato(lista, num);
- }while (num);
- break;
- break;
- }
- }while(scelta);
- return 0;
- }
- Casella* inserimentoTesta(Casella *lista, int num){ ///Inserimento in testa
- Casella *nuovaCasella = NULL;
- nuovaCasella = (Casella*)malloc(sizeof(Casella));
- if (nuovaCasella==NULL){
- printf("memoria non allocata");
- exit(0);
- }
- nuovaCasella->proprietario=num;
- nuovaCasella->next=lista;
- return nuovaCasella;
- }
- void stampaRicorsiva(Casella *lista){
- if (lista!=NULL){
- printf("\n%d ", lista->proprietario);
- stampaRicorsiva(lista->next);
- }
- }
- void stampaIterativa(Casella *lista){
- while (lista!=NULL){
- printf("\n%d ", lista->proprietario);
- lista=lista->next;
- }
- }
- Casella* inserimentoCoda (Casella* lista,int num){
- Casella* aux = lista;
- if(lista==NULL){
- aux = inserimentoTesta(lista, num);
- }
- else{
- while (lista->next != NULL)
- lista = lista->next;
- lista->next=inserimentoTesta(lista->next, num);
- }
- return aux;
- }
- Casella* cancellaTesta(Casella* lista){
- if (lista==NULL)
- return lista;
- Casella* aux = lista;
- lista = aux->next;
- free(aux);
- return lista;
- }
- Casella* cancellaCoda(Casella* lista){
- Casella *aux = NULL;
- while (lista != NULL){
- aux=lista;
- lista = lista->next;
- }
- free(aux);
- return aux;
- }
- void cancellaTuttoIterativa(Casella* lista){///da sistemare
- Casella* aux=NULL;
- while (lista!=NULL){
- aux=lista;
- lista=lista->next;
- free(aux);
- }
- }
- Casella* cancellaTuttoRicorsiva(Casella* lista){
- Casella* aux = NULL;
- if (lista==NULL)
- return NULL;
- if (lista->next!=NULL){
- lista->next=cancellaTuttoRicorsiva(lista->next);
- }
- aux=lista->next;
- free(lista);
- return aux;
- }
- void aggiungiOrdinato(Casella* l, int num){
- //passo come parametri: il puntatore alla lista ed il valore da inserire
- Casella *prec, *corr, *nuovo;// dichiaro 3 puntatori per gli elementi precedente, corrente e nuovo.
- nuovo = (Casella*)malloc(sizeof(Casella)); //alloco la memoria al nuovo elemento
- if (nuovo!=NULL){//se l'allocazione va a buon fine...
- nuovo->proprietario = num;//assegno il valore al nuovo elemento
- nuovo->next = NULL;//e pongo a null il suo successore (superfluo?)
- prec = NULL; //inizializzo il puntatore di supporto (superfluo?)
- corr = l; //creo un alias del puntatore alla lista
- while (corr != NULL && num > corr->proprietario){
- //scorro la lista verificando se l'elemento è più grande
- prec = corr;//passo il valore dell'elemento corrente al supporto
- corr = corr->next;//e avanzo nella lista
- }
- if(prec==NULL){//se la lista e' vuota...
- nuovo->next = l;
- l = nuovo; //inserisco l'elemento in testa
- }
- else{//altrimenti inserisco l'elemento tra il precedente ed il successivo
- prec->next=nuovo;
- nuovo->next=corr;
- }
- }
- else
- printf("\nMemoria insufficiente!");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement