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
/
parte4.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-11
|
2KB
|
122 lines
/* Esame 18 giugno '98 - turno 1 - parte 4 */
#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");
}
/* split: divide la lista *l1 in *l2 e *l3 */
void split(list *l1, list *l2, list *l3, int k)
{
list p1 = *l1, p2=NULL, p3=NULL;
int i;
/* p1 = posizione corrente nella lista *l1
p2 = posizione corrente nella lista *l2
p3 = posizione corrente nella lista *l3
*/
*l1=NULL; /* *l1 non deve contenere piu` nulla (per precauzione) */
*l2=NULL;
*l3=NULL;
if (k>0) /* non ha senso per k<=0 */
{
while (p1!=NULL)
{
if (p2==NULL) /* inserimento primo elemento di *l2 */
{
*l2=p1;
p2=p1;
}
else
p2->next=p1;
for(i=1;i<=k && p1!=NULL;i++)
{
p2=p1;
p1=p1->next;
}
p2->next=NULL;
if (p3==NULL) /* inserimento primo elemento di *l3 */
{
*l3=p1;
p3=p1;
}
else
p3->next=p1;
for(i=1;i<=k && p1!=NULL;i++)
{
p3=p1;
p1=p1->next;
}
}
}
}
int main(void)
{
char fname[MAX];
list l1=NULL,l2=NULL,l3=NULL;
FILE *fd=NULL;
int i,k;
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 from file %s: ",fname);
print(l1);
fscanf(fd,"%d",&k);
split(&l1,&l2,&l3,k);
printf("Split 1: ");
print(l2);
printf("Split 2: ");
print(l3);
}
else
printf("Error opening file %s\n",fname);
}