home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
CataniaB
/
teach-act
/
testi-esami
/
labo-6.98
/
turno1
/
parte2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-11
|
2KB
|
111 lines
/* Esame 18 giugno '98 - turno 1 - parte 2 */
#include <stdio.h>
#include <stdlib.h>
#define MAX 30
typedef struct link *list;
struct link
{
int el;
list next;
};
void insert(int i, list *l)
{
list current, previous, new;
/* creazione nuova cella */
/* nota bene: posso farlo subito perche` voglio le ripetizioni */
new=(list) malloc(sizeof(struct link));
new->el=i;
/* new->next deve essere ancora determinato */
/* ricerca punto di inserimento */
current=*l;
previous=NULL; /* nessuna posizione precedente a quella di testa! */
while (current!=NULL && i>current->el) /* attenzione all'ordine dell'and! */
{
previous=current;
current=current->next;
}
/* inserimento tra previous e current */
if (previous==NULL) /* inserimento in testa */
*l=new;
else /* inserimento in mezzo od in coda */
previous->next=new;
new->next=current; /* stessa istruzione per entrambi i casi */
}
void print(list l)
{
for(;l!=NULL;l=l->next)
printf("%d ",l->el);
printf("\n");
}
/* dispose: versione ricorsiva */
void dispose(list *l)
{
if (*l!=NULL)
{
dispose(&((*l)->next));
*l=NULL;
}
}
/* dispose: versione iterativa
void dispose(list *l)
{
list temp,current;
current=*l;
while (current!=NULL)
{
temp=current;
current=current->next;
free(temp);
}
*l=NULL;
}
fine versione iterativa */
int main(void)
{
char fname[MAX];
list l=NULL;
FILE *fd=NULL;
int i;
printf("Enter file name: ");
scanf("%s",fname);
if (fd=fopen(fname,"r"))
{
while (fscanf(fd,"%d",&i)==1 && i!=-1)
insert(i,&l);
printf("List from file %s: ",fname);
print(l);
dispose(&l);
printf("List after the deallocation: ");
print(l);
}
else
printf("Error opening file %s\n",fname);
}