ciao ho fatto una piccola libreria per creare pile e code. A me sembra che vada bene, l' unica cosa che non sembra funzionare è il fatto che nella funzione primo, tmp punta all' struttura da eliminare e con free(tmp) dovrebbe deallocare la struttura e restituirla all' heap. Ma stampando il tmp prima e dopo la free ha lo stesso valore. Allora ho pensato che tmp punta ancora all' indirizzo dove era allocata la struttura, però ora li non c' è più la struttura. Per essere sicuro dopo la free ho provato a stampare il valore int della struttura che prima era puntata da tmp, ma non mi ha stampato niente. Questo vuol dire che la struttura è stata deallocato bene?
Poi secondo voi e corretta la mia implementazione? si può migliorare la complessità?
#include <stdio.h>
#include <malloc.h>
//#include <stdlib.h>
/* Con questa libreria si puo' creare una lista dinamica di base, che puo essere
utilizzata da pila o da coda a seconda delle funzioni che vengono invocate */
/* struttura elemento lista bidirazionale circolare con doppia sentinella */
struct elemento{
struct elemento *prec;
int n;
struct elemento *succ;
};
typedef struct elemento elem;
/* prototipi di funzione */
/* crea lista vuota */
elem * crea_lista();
/* verifica se la lista e' vuota: 1 vuota 0 piena */
int vuota(elem *l);
/* stampa la lista dall' inizio alla fine */
void stampa(elem *l);
/* aggiunge elemento in coda */
void in_coda(elem *);
/* aggiunge elemento in cima */
void in_pila(elem *l);
/* restituisce il primo elemento e dealloca la cella corrispondente */
int primo(elem *l);
/************************************************** ******************/
/* implementazione delle funzioni */
/* crea una lista e restiruisce l' indirizzo della prima sentinella */
elem * crea_lista(){
elem *sent1;
elem *sent2;
sent1=(elem *)malloc(sizeof(elem));
sent2=(elem *)malloc(sizeof(elem));
sent1->succ=sent2;
sent1->prec=sent2;
sent2->succ=sent1;
sent2->prec=sent1;
return sent1;
}
/* verifiva se la lista e' vuota */
int vuota(elem *l){
if (l->prec->succ==l)
return 1;
else
return 0;
}
/* stampa la lista dall' inizio alla fine */
void stampa(elem *l){
elem *t;
t=l->succ;
while (t!=l->prec){
printf("elemanto: %d\n", t->n);
t=t->succ;
}
}
/* aggiunge elemento in coda */
void in_coda(elem *l){
elem *tmp;
tmp=(elem *)malloc(sizeof(elem));
printf("inserisci elemento da aggiungere in coda: ");
scanf("%d",&tmp->n);
tmp->prec=l->prec->prec;
l->prec->prec->succ=tmp;
tmp->succ=l->prec;
l->prec->prec=tmp;
}
/* aggiunge elemento in cima */
void in_pila(elem *l){
elem *tmp;
tmp=(elem *)malloc(sizeof(elem));
printf("inserisci elemento da aggiungere in cima: ");
scanf("%d",&tmp->n);
tmp->prec=l;
tmp->succ=l->succ;
l->succ->prec=tmp;
l->succ=tmp;
}
int primo(elem *l){
elem *tmp;
int e;
tmp=l->succ;
l->succ=tmp->succ;
tmp->succ->prec=l;
e=tmp->n;
free(tmp);
printf("%d", tmp->n);
printf("elemento in testa: %d\n", e);
return e;
}