Ragazzi ecco il mio esercizio:
Realizzare in C le funzioni per la gestione, mediante menù, delle strutture dati C pila e coda mediante lista
lineare dinamica e generica con [rispettivamente senza] nodo sentinella
Per ora ho provato a farlo senza nodo sentinella e ho problemi con la coda...la pila sia eliminazione che inserimento riescono, ma nella coda non inserisce niente...vi passo il codice
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char nome[20];
int eta;
}INFO_FIELD;
void *crealista();
void print_lista(void *);
void inserisci_pila(short , INFO_FIELD , void **);
void inserisci_coda(short , INFO_FIELD , void **);
void elimina_nodo(void **);
void main ()
{
struct Persona
{
INFO_FIELD info;
struct Persona *p_next;
};
int op, op1, op2, menu1=100, menu2=100;
short len;
INFO_FIELD nuovo;
struct Persona *top, *punt;
top=(struct coda *)crealista();
printf("Selezionare cosa si intende gestire:\n\n");
printf("1=Pila\n");
printf("2=Coda");
scanf("%d",&op);
switch (op){
case 1: while (menu1 <= 100){
puts("\n\n\n======================================");
puts("GESTIONE DI UNA PILA (tramite lista lineare generica)");
puts("===========================================\n\n");
puts("Selezionare l'operazione:\n");
puts("1=Visualizzare la Pila");
puts("2=Inserire un elemento");
puts("3=Eliminare un elemento");
scanf("%d",&op1);
switch(op1){
case 1: print_lista(top); break;
case 2: printf("Inserisci nome:\t");
scanf("%s",nuovo.nome);
printf("inserisci eta\':\t");
scanf("%d",&nuovo.eta);
len=sizeof(nuovo);
inserisci_pila(len,nuovo,&top);
printf("Lista aggiornata:\n\n");
print_lista(top); break;
case 3: elimina_nodo(&top);
printf("Lista aggiornata:\n\n");
print_lista(top);break;
}
}
case 2:
while (menu2 <= 100){
puts("\n\n\n======================================");
puts("GESTIONE DI UNA CODA (tramite lista lineare generica)");
puts("===========================================\n\n");
puts("Selezionare l'operazione:\n");
puts("1=Visualizzare la Coda");
puts("2=Inserire un elemento");
puts("3=Eliminare un elemento");
scanf("%d",&op2);
switch(op2){
case 1: print_lista(top); break;
case 2: punt=top;
/*while(punt->p_next)
{
punt = punt->p_next;
}*/
printf("Inserisci nome:\t");
scanf("%s",nuovo.nome);
printf("inserisci eta\':\t");
scanf("%d",&nuovo.eta);
len=sizeof(nuovo);
inserisci_coda(len,nuovo,&punt);
printf("Lista aggiornata:\n\n");
print_lista(top);break;
case 3: elimina_nodo(&top);
printf("Lista aggiornata:\n\n");
print_lista(top); break;
}}
}
}
void *crealista()
{
struct coda {
INFO_FIELD info;
struct coda *p_next;
};
struct coda *testa;
testa=NULL;
return testa;
}
void print_lista(void *pl)
{
struct Persona
{
INFO_FIELD info;
struct Persona *p_next;
};
int i=0;
printf("\n\n");
printf("lista:\n");
while (((struct Persona *)pl)){
i++;
printf("%d=Nome:%s\tEta':%d\n", i , ((struct Persona *)pl)->info.nome, ((struct Persona *)pl)->info.eta);
pl = ((struct Persona *)pl)->p_next;
}
printf("\n\n");
}
void inserisci_pila(short len_info, INFO_FIELD p_dato, void **p_head)
{
struct lista
{
INFO_FIELD info;
struct lista *p_next;
}*ptr;
ptr=calloc(1, sizeof(struct lista));
ptr->info = p_dato;
ptr->p_next=(struct lista *)*p_head;
*p_head= ptr;
}
void inserisci_coda(short len_info, INFO_FIELD p_dato, void **p_punt)
{
struct lista
{
INFO_FIELD info;
struct lista *p_next;
}*ptr;
ptr=calloc(1, sizeof(struct lista));
ptr= (struct lista *)calloc(1,sizeof(struct lista));
ptr->info = p_dato;
(ptr->p_next) = ((struct lista *)p_punt)->p_next;
((struct lista *)p_punt)->p_next=ptr;
}
void elimina_nodo(void **p_head)
{
struct lista
{
INFO_FIELD info;
struct lista *p_next;
} *ptr;
ptr=((struct lista *)*p_head)->p_next;
free((struct lista *)*p_head);
*p_head=ptr;
}