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
/
parte3.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-11
|
3KB
|
132 lines
/* Esame 18 giugno '98 - turno 1 - parte 3 */
#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");
}
/* merge: fonde le due liste *l1 e *l2 */
list merge(list *l1, list *l2)
{
list res=NULL, p1=*l1, p2=*l2, p3=NULL;
/* res = risultato della funzione
p1 = posizione corrente nella lista *l1
p2 = posizione corrente nella lista *l2
p3 = posizione corrente nella lista res
*/
/* *l1 e *l2 non devono contenere piu` nulla (per sicurezza) */
*l1=NULL;
*l2=NULL;
/* determinazione primo elemeno di res */
if (p1==NULL)
return p2;
else if (p2==NULL)
return p1;
else
if (p1->el<p2->el)
{
res=p1;
p1=p1->next;
}
else
{
res=p2;
p2=p2->next;
}
p3=res;
while (p1!=NULL && p2!=NULL)
{
if (p1->el<p2->el)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
if (p1==NULL) /* pezzo avanzato da *l2 */
p3->next=p2;
else /* pezzo avanzato da *l1 */
p3->next=p1;
return res;
}
int main(void)
{
char fname[MAX];
list l1=NULL,l2=NULL,l3=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,&l1);
printf("List l1 from file %s: ",fname);
print(l1);
while (fscanf(fd,"%d",&i)==1)
insert(i,&l2);
printf("List l2 from file %s: ",fname);
print(l2);
printf("Merge: ");
l3=(merge(&l1,&l2));
print(l3);
}
else
printf("Error opening file %s\n",fname);
}