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