PDA

View Full Version : [Linguaggio C] Aiuto interpretazione lista


ivan p
30-05-2009, 10:04
Salve, studio ingegneria informatica e ho qualche problema ad interpretare il codice di un esempio di lista del mio prof; Utilizzo il devc++. Sarò grato a tutti coloro che potranno aiutarmi.

Quello che non capisco è il funzionamento della funzione Full quando viene richiamata nel Main.

#include <stdio.h>
#include <malloc.h>
#define LISTAVUOTA NULL

typedef int tipobase;

typedef short boolean;

typedef struct nodo {
tipobase info;
struct nodo *next;
} *list;

typedef list position;

position End(list l)
{
if (l==LISTAVUOTA) return(LISTAVUOTA);
while (l->next!=LISTAVUOTA)
l=l->next;
return(l);
}

position First(list l)
{
return(LISTAVUOTA); /*se la lista è vuota torna END(l) */
}

void MakeNull(list *l)
{
*l=LISTAVUOTA;
}

boolean Empty(list l)
{
return(l==LISTAVUOTA);
}

boolean Full(list l)
{
return(0);
}

void Insert(list *l, position p, tipobase x)
{
struct nodo * temp;

temp=(struct nodo *) malloc(sizeof(struct nodo));
temp->info=x;
if (p==LISTAVUOTA) {
temp->next=*l;
*l=temp;
} else {
temp->next=p->next;
p->next=temp;
}
}

void Delete(list *l, position p)
{
struct nodo * tmp;

if (!Empty(*l) && p!=End(*l)) {
if (p==LISTAVUOTA) {
tmp=(*l)->next;
free (*l);
*l=tmp;
} else {
tmp=p->next;
p->next=tmp->next;
free (tmp);
}
}
}

position Locate(list l, tipobase x)
{

if (!Empty(l)) {
if (l->info==x) return(LISTAVUOTA);
while (l->next!=LISTAVUOTA) {
if (l->next->info==x) return(l);
l=l->next;
}
return(l);
}
}

tipobase Retrieve(list l, position p)
{
if (!Empty(l) && p!=End(l)) {
if (p==LISTAVUOTA) return(l->info);
else return(p->next->info);
}
}

position Next(list l, position p)
{
if (p!=End(l)) {
if (p==LISTAVUOTA) return(l);
else return(p->next);
}
}

void visita(list l)
{
position p,u;
tipobase x;
int i=0;

p=First(l);
u=End(l);
while (p!=u) {
x=Retrieve(l,p);
printf("L'elemento di posizione %d e' %d \n",++i,x);
p=Next(l,p);
}
}

void insord(list *l, tipobase x)
{
position p,u;
tipobase tmp;

if (Empty(*l)) Insert(l,First(*l),x);
else {
p=First(*l);
u=End(*l);
while (p!=u) {
tmp=Retrieve(*l,p);
if (tmp<x)
p=Next(*l,p);
else break;
}
Insert(l,p,x);
}
}

main()
{
list lt; //Variabile locale Lista
int s;
tipobase elem;
position pos;

MakeNull(&lt);

do {
printf("Menu di Operazioni \n");
printf("1-Inserimento Ordinato \n");
printf("2-Ricerca \n");
printf("3-Cancellazione \n");
printf("4-Visita Lista \n");
printf("5-Fine \n");
printf("Inserisci la scelta ---> ");
scanf("%d",&s);
fflush(stdin);
switch(s) {

case 1 : {
if (Full(lt)) printf("Lista piena \n");
else {
printf("Inserisci l'Elemento da Inserire ");
scanf("%d",&elem);
fflush(stdin);
insord(&lt,elem);
}
break;
}
case 2 : {
if (Empty(lt)) printf("Lista Vuota \n");
else {
printf("Inserisci l'Elemento da Ricercare \n");
scanf("%d",&elem);
fflush(stdin);
pos=Locate(lt,elem);
if (pos!=End(lt))
printf("Elemento Trovato \n");
else printf("Elemento non Trovato \n");
}
break;
}
case 3 : {
if (Empty(lt)) printf("Lista Vuota \n");
else {
printf("Inserisci l'Elemento da Cancellare \n");
scanf("%d",&elem);
fflush(stdin);
pos=Locate(lt,elem);
if (pos!=End(lt)) {
Delete(&lt,pos);
printf("Elemento Cancellato \n");
}
else printf("Elemento non Trovato \n");
}
break;
}
case 4 : {
if (Empty(lt)) printf("Lista Vuota \n");
else visita(lt);
break;
}
}
} while (s<5);
}

ivan p
30-05-2009, 10:08
Scusate mi sono accorto che incollando il codice la formattazione del testo è andata a farsi benedire, spero possiate aiutarmi comunque.

ndakota
30-05-2009, 12:14
Salve, studio ingegneria informatica e ho qualche problema ad interpretare il codice di un esempio di lista del mio prof; Utilizzo il devc++. Sarò grato a tutti coloro che potranno aiutarmi.

Quello che non capisco è il funzionamento della funzione Full quando viene richiamata nel Main.

#include <stdio.h>
#include <malloc.h>
#define LISTAVUOTA NULL

typedef int tipobase;

typedef short boolean;

typedef struct nodo {
tipobase info;
struct nodo *next;
} *list;

typedef list position;

position End(list l)
{
if (l==LISTAVUOTA) return(LISTAVUOTA);
while (l->next!=LISTAVUOTA)
l=l->next;
return(l);
}

position First(list l)
{
return(LISTAVUOTA); /*se la lista è vuota torna END(l) */
}

void MakeNull(list *l)
{
*l=LISTAVUOTA;
}

boolean Empty(list l)
{
return(l==LISTAVUOTA);
}

boolean Full(list l)
{
return(0);
}

void Insert(list *l, position p, tipobase x)
{
struct nodo * temp;

temp=(struct nodo *) malloc(sizeof(struct nodo));
temp->info=x;
if (p==LISTAVUOTA) {
temp->next=*l;
*l=temp;
} else {
temp->next=p->next;
p->next=temp;
}
}

void Delete(list *l, position p)
{
struct nodo * tmp;

if (!Empty(*l) && p!=End(*l)) {
if (p==LISTAVUOTA) {
tmp=(*l)->next;
free (*l);
*l=tmp;
} else {
tmp=p->next;
p->next=tmp->next;
free (tmp);
}
}
}

position Locate(list l, tipobase x)
{

if (!Empty(l)) {
if (l->info==x) return(LISTAVUOTA);
while (l->next!=LISTAVUOTA) {
if (l->next->info==x) return(l);
l=l->next;
}
return(l);
}
}

tipobase Retrieve(list l, position p)
{
if (!Empty(l) && p!=End(l)) {
if (p==LISTAVUOTA) return(l->info);
else return(p->next->info);
}
}

position Next(list l, position p)
{
if (p!=End(l)) {
if (p==LISTAVUOTA) return(l);
else return(p->next);
}
}

void visita(list l)
{
position p,u;
tipobase x;
int i=0;

p=First(l);
u=End(l);
while (p!=u) {
x=Retrieve(l,p);
printf("L'elemento di posizione %d e' %d \n",++i,x);
p=Next(l,p);
}
}

void insord(list *l, tipobase x)
{
position p,u;
tipobase tmp;

if (Empty(*l)) Insert(l,First(*l),x);
else {
p=First(*l);
u=End(*l);
while (p!=u) {
tmp=Retrieve(*l,p);
if (tmp<x)
p=Next(*l,p);
else break;
}
Insert(l,p,x);
}
}

main()
{
list lt; //Variabile locale Lista
int s;
tipobase elem;
position pos;

MakeNull(&lt);

do {
printf("Menu di Operazioni \n");
printf("1-Inserimento Ordinato \n");
printf("2-Ricerca \n");
printf("3-Cancellazione \n");
printf("4-Visita Lista \n");
printf("5-Fine \n");
printf("Inserisci la scelta ---> ");
scanf("%d",&s);
fflush(stdin);
switch(s) {

case 1 : {
if (Full(lt)) printf("Lista piena \n");
else {
printf("Inserisci l'Elemento da Inserire ");
scanf("%d",&elem);
fflush(stdin);
insord(&lt,elem);
}
break;
}
case 2 : {
if (Empty(lt)) printf("Lista Vuota \n");
else {
printf("Inserisci l'Elemento da Ricercare \n");
scanf("%d",&elem);
fflush(stdin);
pos=Locate(lt,elem);
if (pos!=End(lt))
printf("Elemento Trovato \n");
else printf("Elemento non Trovato \n");
}
break;
}
case 3 : {
if (Empty(lt)) printf("Lista Vuota \n");
else {
printf("Inserisci l'Elemento da Cancellare \n");
scanf("%d",&elem);
fflush(stdin);
pos=Locate(lt,elem);
if (pos!=End(lt)) {
Delete(&lt,pos);
printf("Elemento Cancellato \n");
}
else printf("Elemento non Trovato \n");
}
break;
}
case 4 : {
if (Empty(lt)) printf("Lista Vuota \n");
else visita(lt);
break;
}
}
} while (s<5);
}

usa il tag code la prossima volta :)
secondo me c'è qualcosa di sbagliato, li passa un argomento e non lo usa. inoltre non può ritornare sempre zero altrimenti quell'if-else è inutile.

ivan p
30-05-2009, 12:53
Quale argomento non usa? Per quello che ho capito quando il main esamina la condizione la funzione restituisce sempre che la lista non è mai piena e questo non sarebbe corretto perchè può riempirsi. Giusto?

||ElChE||88
30-05-2009, 12:56
Se la dimensione della lista non è limitata come fa a diventare piena? :fagiano:

ivan p
30-05-2009, 13:02
Giusto.

ivan p
30-05-2009, 13:03
Altro dubbio, perchè Firtst restituisce sempre NULL? Perchè anche Empty restituisce NULL?

wingman87
30-05-2009, 14:02
Perché ritorna LISTAVUOTA che hai definito all'inizio come NULL.

ndakota
30-05-2009, 15:40
Quale argomento non usa? Per quello che ho capito quando il main esamina la condizione la funzione restituisce sempre che la lista non è mai piena e questo non sarebbe corretto perchè può riempirsi. Giusto?

quello della funzione Full()