View difference between Paste ID: Jznn60Wi and P1n1x4Ru
SHOW: | | - or go back to the newest paste.
1-
#include <stdio.h>
1+
#include <stdio.h>
2-
#include <stdlib.h>
2+
#include <stdlib.h>
3-
//#include <time.h>
3+
//#include <time.h>
4-
#define DIM 100
4+
#define DIM 100
5-
#include "list.h"
5+
#include "list.h"
6-
6+
7-
7+
8-
/*Rappresentazione di liste con array */
8+
/*Rappresentazione di liste con array */
9-
typedef struct{ 
9+
typedef struct{ 
10-
  int key[DIM];
10+
  int key[DIM];
11-
  int next[DIM];
11+
  int next[DIM];
12-
  int prev[DIM];
12+
  int prev[DIM];
13-
} Spazio;
13+
} Spazio;
14-
14+
15-
/* Variabili globali*/
15+
/* Variabili globali*/
16-
List freeList;  /*Testa della free List che e' una lista DOPPIAMENTE concatenata*/
16+
List freeList;  /*Testa della free List che e' una lista DOPPIAMENTE concatenata*/
17-
Spazio space; /*Spazio utilizzato per memorizzare le liste*/
17+
Spazio space; /*Spazio utilizzato per memorizzare le liste*/
18-
18+
19-
19+
20-
/*Post: inizializza space in modo che tutti gli elementi siano nella lista libera. La testa della lista libera sara' 0 */
20+
/*Post: inizializza space in modo che tutti gli elementi siano nella lista libera. La testa della lista libera sara' 0 */
21-
void initFreelist(){
21+
void initFreelist(){
22-
	int i;
22+
	int i;
23-
	for(i=0;i<DIM;i++)space.prev[i]=(i-1);
23+
	for(i=0;i<DIM;i++){space.prev[i]=(i-1); space.key[i]=0; space.next[i]=(i+1);}
24-
	for(i=0;i<DIM;i++)space.next[i]=(i+1);
24+
	space.next[DIM-1]=-1; //indico ultimo elem.
25-
	space.next[DIM-1]=-1; //indico ultimo elem.
25+
	freeList=0;
26-
	freeList=0;
26+
}
27
28-
28+
/*Post: restituisce un oggetto libero. Se lo spazio e' esaurito stampa un messaggio di errore  */
29-
/*Post: restituisce un oggetto libero. Se lo spazio e' esaurito stampa un messaggio di errore  */
29+
List allocateObject(){
30-
List allocateObject(){
30+
if(freeList>=0)
31-
	if(freeList<0){printf("Errore: spazio esaurito!"); return -2;}
31+
{
32-
	else return freeList;
32+
	int aux=freeList;
33
	/*Ho ancora posizioni libere*/
34-
34+
	if(space.next[freeList]!=-1)
35-
/* Post: restituisce il numero di elementi contenuti nella lista */
35+
		{
36-
int lunghezza(List l){
36+
			freeList=space.next[freeList];
37-
	int counter=0;
37+
			space.prev[freeList]=-1;
38-
	if(l<0)return 0;
38+
			space.next[aux]=-1;
39-
	if(space.next[l]<0)return 1;
39+
		}
40-
	else return 1+lunghezza(space.next[l]);
40+
	else
41
		{
42-
42+
		/*Sono sull'ultima posizione libera*/
43-
43+
			freeList=-1;
44-
/*Post: stampa il contenuto della lista. Deve essere una funzione RICORSIVA */
44+
	}
45-
void stampa(List l){
45+
	return aux;
46-
	if(l<0){printf("LISTA VUOTA."); return;}
46+
}
47-
	printf("%d ",space.key[l]);
47+
else
48-
	if(space.next[l]<0)printf(".");
48+
	{
49-
	else stampa(space.next[l]);
49+
		printf("\nSpazio esaurito\n");
50
		return freeList;
51-
51+
	}
52-
52+
}
53-
53+
54-
/*Post: legge una sequenza di interi inseriti dall'utente e restituisce una lista contenente tale sequenza*/
54+
55-
List caricamento(){
55+
56-
56+
/* Post: restituisce il numero di elementi contenuti nella lista */
57-
	int i,n,temp;
57+
int lunghezza(List l){
58-
	List l,pointer;
58+
	int counter=0;
59-
	l=allocateObject();
59+
	if(l<0)return 0;
60-
	pointer=l;
60+
	if(space.next[l]<0)return 1;
61-
	printf("Lunghezza Lista: ");
61+
	else return 1+lunghezza(space.next[l]);
62-
	scanf("%d",&i);
62+
}
63-
	
63+
64-
	if(i>=lunghezza(l)){printf("Non c'e' spazio a sufficienza! ERRORE!\n"); return -2;}
64+
65-
	if(i==0)return -1; //lista vuota
65+
/*Post: stampa il contenuto della lista. Deve essere una funzione RICORSIVA */
66-
	if(i<0){printf("Valore ERRATO!\n"); return -2;}
66+
void stampa(List l){
67-
	
67+
	if(l<0){printf("LISTA VUOTA."); return;}
68-
	space.prev[l]=-1;
68+
	printf("%d ",space.key[l]);
69-
	
69+
	if(space.next[l]<0)printf(".");
70-
	//inserimento valori
70+
	else stampa(space.next[l]);
71-
	for (n=0;n<i;n++)
71+
}
72-
  {
72+
73-
    printf ("Inserisci il valore #%d: ",n+1);
73+
/*Post: rende libero l'oggetto x  */
74-
    scanf ("%d",&(space.key[l]));
74+
void freeObject(List x){
75-
    temp=l;
75+
	int temp=x;
76-
    l=space.next[l];//l++
76+
	space.prev[x]=-1;
77-
  }
77+
	space.key[x]=0;
78-
  space.next[temp]=-1;
78+
	space.next[x]=freeList; /* lo butto in testa alla freelist */
79-
  
79+
	space.prev[freeList]=x;
80-
  space.prev[l]=-1;
80+
	freeList=temp;
81-
  freeList=l;
81+
}
82-
  
82+
83-
return pointer;
83+
/*Post: dealloca gli elementi contenuti nella lista */
84
void rimuovi(List l){
85-
85+
	int temp;
86-
/* Stampa la situazione globale */
86+
	while(l>=0)
87-
void debug(){
87+
	{
88-
	int i,j;
88+
		temp=space.next[l];
89-
	int charperrow=8;
89+
		freeObject(l);
90-
	printf("freeList: %d\n",freeList);
90+
		l=temp;
91-
	for(i=0;i<DIM/charperrow;i++){
91+
	}
92-
		printf("N:\t");
92+
	l=-1;
93-
		for(j=0;j<charperrow;j++)printf("%d\t",space.next[i*charperrow+j]);
93+
	return;
94-
		printf("\nK:\t");
94+
}
95-
		for(j=0;j<charperrow;j++)printf("%d\t",space.key[i*charperrow+j]);
95+
96-
		printf("\nP:\t");
96+
/*Post: legge una sequenza di interi inseriti dall'utente e restituisce una lista contenente tale sequenza*/
97-
		for(j=0;j<charperrow;j++)printf("%d\t",space.prev[i*charperrow+j]);
97+
List caricamento(){
98-
		printf("\n\n");
98+
99-
	}
99+
	int temp,value,first,next;
100-
	
100+
	List l, pointer;
101
	
102-
102+
	temp=-1; first=1; value=1;/*valore positivo insignificante solo x entrare nel ciclo*/
103-
103+
	printf("Caricamento nuova lista, inserisci 0 per terminare.\n");
104-
/*Post: rende libero l'oggetto x  */
104+
	
105-
void freeObject(List x){
105+
	while(value){
106-
	int temp=x;
106+
		l=allocateObject();
107-
	space.prev[x]=-1;
107+
		printf("l vale %d\n",l);
108-
	while(space.next[x]>0)x=space.next[x];//scorro a fine lista x per attaccarci la freeList
108+
		printf("Inserisci valore: ");
109-
	space.next[x]=freeList;
109+
   	scanf("%d",&value);
110-
	space.prev[freeList]=x;
110+
		if(first){pointer=l;/* puntatore alla testa, NON AGGIORNARE */ first=0;
111-
	freeList=temp;
111+
			if(!value){freeObject(l); return -1; }
112
		}
113-
113+
		
114-
114+
   	space.next[l]=-1;
115-
/*Post: dealloca gli elementi contenuti nella lista */
115+
   	space.key[l]=value;
116-
void rimuovi(List l){
116+
   	space.prev[l]=temp;
117-
return;
117+
   	temp=l;
118
   }
119-
119+
   temp=space.prev[l];//ultimo elemento
120-
120+
   printf("temp vale=%d\n",temp);
121-
121+
   freeObject(l);
122-
122+
   value=-1;
123-
123+
   //scorro all'indietro lista e assegno i next
124-
124+
   while(temp>=0){
125-
/*Pre: Si assuma che space abbia m elementi, l sia una lista di n elementi e i rimanenti elementi di space (m -n) siano nella lista libera.
125+
   	space.next[temp]=value;
126-
  Post: sposta gli elementi in l in modo che occupino le posizioni 0, 1, ..., n-1 di space e aggiusta la lista libera in modo che essa resti corretta, occupando le posizioni di space n, n+1, ...., m - 1. La funzione restituisce la lista l con gli elementi nelle posizioni specificate.
126+
   	value=temp;
127-
  Il tempo di esecuzione della funzione e' theta(n) e deve utilizzare SOLO una quantita' costante di spazio extra. */
127+
   	temp=space.prev[temp];
128-
List compatifyList(List l){
128+
   }
129-
	//BOOOOOOH
129+
return pointer;
130-
	return -7;
130+
}
131
132-
132+
/* Stampa la situazione globale */
133-
133+
void debug(){
134-
134+
	int i,j;
135-
135+
	int charperrow=10;
136-
List caricaListaStronza(){
136+
	printf("Spazio Libero: %d (da %d in poi).\n",lunghezza(freeList),freeList);
137-
137+
	for(i=0;i<DIM/charperrow;i++){
138-
	space.next[8]=17;
138+
		printf("N:\t");
139-
	space.key[8]=1;
139+
		for(j=0;j<charperrow;j++)printf("%d\t",space.next[i*charperrow+j]);
140-
	space.prev[8]=-1;
140+
		printf("\nK:\t");
141-
	
141+
		for(j=0;j<charperrow;j++)printf("%d\t",space.key[i*charperrow+j]);
142-
	space.next[17]=1;
142+
		printf("\nP:\t");
143-
	space.key[17]=2;
143+
		for(j=0;j<charperrow;j++)printf("%d\t",space.prev[i*charperrow+j]);
144-
	space.prev[17]=8;
144+
		printf("\n\n");
145-
145+
	}
146-
	space.next[1]=73;
146+
	
147-
	space.key[1]=3;
147+
}
148-
	space.prev[1]=17;
148+
149-
149+
150-
	space.next[73]=51;
150+
void auxcompat(List l, int pointerList, int pointerFree,int lunghezza){
151-
	space.key[73]=4;
151+
	int temp;
152-
	space.prev[73]=1;
152+
	if((pointerList<0)||(pointerFree<0))return;
153-
153+
	else{
154-
	space.next[51]=50;
154+
		if(pointerFree>lunghezza){
155-
	space.key[51]=5;
155+
			auxcompat(l,pointerList,space.next[pointerFree],lunghezza);
156-
	space.prev[51]=73;
156+
			return;
157-
157+
		}
158-
	space.next[50]=63;
158+
		if(pointerList<=lunghezza){
159-
	space.key[50]=6;
159+
			auxcompat(l,space.next[pointerList],pointerFree,lunghezza);
160-
	space.prev[50]=51;
160+
			return;
161-
161+
		}
162-
	space.next[63]=7;
162+
		
163-
	space.key[63]=7;
163+
		temp=space.next[pointerFree];
164-
	space.prev[63]=50;
164+
		space.next[pointerFree]=space.next[pointerList];
165-
165+
		space.next[pointerList]=temp;
166-
	space.next[7]=-1;
166+
		temp=space.prev[pointerFree];
167-
	space.key[7]=8;
167+
		space.prev[pointerFree]=space.prev[pointerList];
168-
	space.prev[7]=63;
168+
		space.prev[pointerList]=temp;
169-
169+
		temp=space.key[pointerFree];
170-
space.next[0]=2;
170+
		space.key[pointerFree]=space.key[pointerList];
171-
space.prev[2]=0;
171+
		space.key[pointerList]=temp;
172-
172+
173-
space.next[6]=9;
173+
		if(freeList==pointerFree)freeList=pointerList;
174-
space.prev[9]=6;
174+
		if(l==pointerList)l=pointerFree;
175-
175+
176-
space.next[16]=18;
176+
		if(space.prev[pointerList]>=0)space.next[space.prev[pointerList]] = pointerList;
177-
space.prev[18]=16;
177+
		if(space.next[pointerList]>=0)space.prev[space.next[pointerList]] = pointerList;
178-
178+
		if(space.prev[pointerFree]>=0)space.next[space.prev[pointerFree]] = pointerFree;
179-
space.next[49]=52;
179+
		if(space.next[pointerFree]>=0)space.prev[space.next[pointerFree]] = pointerFree;
180-
space.prev[52]=49;
180+
	
181-
181+
		auxcompat(l,space.next[pointerFree],space.next[pointerList],lunghezza);
182-
space.next[62]=64;
182+
		return;
183-
space.prev[64]=62;
183+
	}
184-
184+
}
185-
space.next[72]=74;
185+
186-
space.prev[74]=72;
186+
187-
187+
/*Pre: Si assuma che space abbia m elementi, l sia una lista di n elementi e i rimanenti elementi di space (m -n) siano nella lista libera.
188-
return 8;
188+
189
  Post: sposta gli elementi in l in modo che occupino le posizioni 0, 1, ..., n-1 di space e aggiusta la lista libera in modo che essa resti corretta, occupando le posizioni di space n, n+1, ...., m - 1. La funzione restituisce la lista l con gli elementi nelle posizioni specificate.
190
  Il tempo di esecuzione della funzione e' theta(n) e deve utilizzare SOLO una quantita' costante di spazio extra. */
191
192
List compatifyList(List l){
193
	int lunghez;
194
	lunghez=lunghezza(l)-1;
195
	auxcompat(l,l,freeList,lunghez);
196
	return l;
197
}