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 | } |