Advertisement
Jerkiller

2.3 (esercitazione 2 esercizio 3 incompleto)

Nov 30th, 2014
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //#include <time.h>
  4. #define DIM 100
  5. #include "list.h"
  6.  
  7.  
  8. /*Rappresentazione di liste con array */
  9. typedef struct{
  10.   int key[DIM];
  11.   int next[DIM];
  12.   int prev[DIM];
  13. } Spazio;
  14.  
  15. /* Variabili globali*/
  16. List freeList;  /*Testa della free List che e' una lista DOPPIAMENTE concatenata*/
  17. Spazio space; /*Spazio utilizzato per memorizzare le liste*/
  18.  
  19.  
  20. /*Post: inizializza space in modo che tutti gli elementi siano nella lista libera. La testa della lista libera sara' 0 */
  21. void initFreelist(){
  22.     int i;
  23.     for(i=0;i<DIM;i++){space.prev[i]=(i-1); space.key[i]=0; space.next[i]=(i+1);}
  24.     space.next[DIM-1]=-1; //indico ultimo elem.
  25.     freeList=0;
  26. }
  27.  
  28. /*Post: restituisce un oggetto libero. Se lo spazio e' esaurito stampa un messaggio di errore  */
  29. List allocateObject(){
  30. if(freeList>=0)
  31. {
  32.     int aux=freeList;
  33.     /*Ho ancora posizioni libere*/
  34.     if(space.next[freeList]!=-1)
  35.         {
  36.             freeList=space.next[freeList];
  37.             space.prev[freeList]=-1;
  38.             space.next[aux]=-1;
  39.         }
  40.     else
  41.         {
  42.         /*Sono sull'ultima posizione libera*/
  43.             freeList=-1;
  44.     }
  45.     return aux;
  46. }
  47. else
  48.     {
  49.         printf("\nSpazio esaurito\n");
  50.         return freeList;
  51.     }
  52. }
  53.  
  54.  
  55.  
  56. /* Post: restituisce il numero di elementi contenuti nella lista */
  57. int lunghezza(List l){
  58.     int counter=0;
  59.     if(l<0)return 0;
  60.     if(space.next[l]<0)return 1;
  61.     else return 1+lunghezza(space.next[l]);
  62. }
  63.  
  64.  
  65. /*Post: stampa il contenuto della lista. Deve essere una funzione RICORSIVA */
  66. void stampa(List l){
  67.     if(l<0){printf("LISTA VUOTA."); return;}
  68.     printf("%d ",space.key[l]);
  69.     if(space.next[l]<0)printf(".");
  70.     else stampa(space.next[l]);
  71. }
  72.  
  73. /*Post: rende libero l'oggetto x  */
  74. void freeObject(List x){
  75.     int temp=x;
  76.     space.prev[x]=-1;
  77.     space.key[x]=0;
  78.     space.next[x]=freeList; /* lo butto in testa alla freelist */
  79.     space.prev[freeList]=x;
  80.     freeList=temp;
  81. }
  82.  
  83. /*Post: dealloca gli elementi contenuti nella lista */
  84. void rimuovi(List l){
  85.     int temp;
  86.     while(l>=0)
  87.     {
  88.         temp=space.next[l];
  89.         freeObject(l);
  90.         l=temp;
  91.     }
  92.     l=-1;
  93.     return;
  94. }
  95.  
  96. /*Post: legge una sequenza di interi inseriti dall'utente e restituisce una lista contenente tale sequenza*/
  97. List caricamento(){
  98.  
  99.     int temp,value,first,next;
  100.     List l, pointer;
  101.    
  102.     temp=-1; first=1; value=1;/*valore positivo insignificante solo x entrare nel ciclo*/
  103.     printf("Caricamento nuova lista, inserisci 0 per terminare.\n");
  104.    
  105.     while(value){
  106.         l=allocateObject();
  107.         printf("l vale %d\n",l);
  108.         printf("Inserisci valore: ");
  109.     scanf("%d",&value);
  110.         if(first){pointer=l;/* puntatore alla testa, NON AGGIORNARE */ first=0;
  111.             if(!value){freeObject(l); return -1; }
  112.         }
  113.        
  114.     space.next[l]=-1;
  115.     space.key[l]=value;
  116.     space.prev[l]=temp;
  117.     temp=l;
  118.    }
  119.    temp=space.prev[l];//ultimo elemento
  120.    printf("temp vale=%d\n",temp);
  121.    freeObject(l);
  122.    value=-1;
  123.    //scorro all'indietro lista e assegno i next
  124.    while(temp>=0){
  125.     space.next[temp]=value;
  126.     value=temp;
  127.     temp=space.prev[temp];
  128.    }
  129. return pointer;
  130. }
  131.  
  132. /* Stampa la situazione globale */
  133. void debug(){
  134.     int i,j;
  135.     int charperrow=10;
  136.     printf("Spazio Libero: %d (da %d in poi).\n",lunghezza(freeList),freeList);
  137.     for(i=0;i<DIM/charperrow;i++){
  138.         printf("N:\t");
  139.         for(j=0;j<charperrow;j++)printf("%d\t",space.next[i*charperrow+j]);
  140.         printf("\nK:\t");
  141.         for(j=0;j<charperrow;j++)printf("%d\t",space.key[i*charperrow+j]);
  142.         printf("\nP:\t");
  143.         for(j=0;j<charperrow;j++)printf("%d\t",space.prev[i*charperrow+j]);
  144.         printf("\n\n");
  145.     }
  146.    
  147. }
  148.  
  149.  
  150. void auxcompat(List l, int pointerList, int pointerFree,int lunghezza){
  151.     int temp;
  152.     if((pointerList<0)||(pointerFree<0))return;
  153.     else{
  154.         if(pointerFree>lunghezza){
  155.             auxcompat(l,pointerList,space.next[pointerFree],lunghezza);
  156.             return;
  157.         }
  158.         if(pointerList<=lunghezza){
  159.             auxcompat(l,space.next[pointerList],pointerFree,lunghezza);
  160.             return;
  161.         }
  162.        
  163.         temp=space.next[pointerFree];
  164.         space.next[pointerFree]=space.next[pointerList];
  165.         space.next[pointerList]=temp;
  166.         temp=space.prev[pointerFree];
  167.         space.prev[pointerFree]=space.prev[pointerList];
  168.         space.prev[pointerList]=temp;
  169.         temp=space.key[pointerFree];
  170.         space.key[pointerFree]=space.key[pointerList];
  171.         space.key[pointerList]=temp;
  172.  
  173.         if(freeList==pointerFree)freeList=pointerList;
  174.         if(l==pointerList)l=pointerFree;
  175.  
  176.         if(space.prev[pointerList]>=0)space.next[space.prev[pointerList]] = pointerList;
  177.         if(space.next[pointerList]>=0)space.prev[space.next[pointerList]] = pointerList;
  178.         if(space.prev[pointerFree]>=0)space.next[space.prev[pointerFree]] = pointerFree;
  179.         if(space.next[pointerFree]>=0)space.prev[space.next[pointerFree]] = pointerFree;
  180.    
  181.         auxcompat(l,space.next[pointerFree],space.next[pointerList],lunghezza);
  182.         return;
  183.     }
  184. }
  185.  
  186.  
  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.  
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement