]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - otros/mtf/mtf.c
Fucking olvidada :-D
[z.facultad/75.06/jacu.git] / otros / mtf / mtf.c
1 #include "mtf.h"
2
3 /****privadas*****/
4 int no_pertenece(char *z, char c, int len);
5
6 void pop_front(char *z, int pos);
7
8 /*int get_pos(char *z, int len, char c);*/
9 /****fin privadas******/
10
11 void print_z(char *z, int len)
12 {
13         int i;
14         for(i=0; i<len; i++)
15                 fprintf(stderr, "%c", z[i]);
16         fprintf(stderr, "\n");
17 }
18
19 int comparar(const void *d1, const void *d2)
20 {
21         char *c1, *c2;
22
23         c1 = (char *)d1;
24         c2 = (char *)d2;
25
26         return (*c1) - (*c2);
27 }
28
29 int *jacu_mtf(char *datos, int len)
30 {
31         char *z;
32         int *pos;
33         int i, size;
34         
35         pos = (int*)malloc(len*sizeof(int));
36         z = jacu_buscar_z(datos, len, &size);
37         fprintf(stderr, "Z original = ");
38         print_z(z, size);
39         fprintf(stderr, "SIZE = %d\n", size);
40         /*z[0]='A';z[1]='B';z[2]='C';z[3]='D';z[4]='R';*/
41         /* Ordeno */
42         qsort(z, size, 1, comparar);
43         fprintf(stderr, "Z ordenado = ");
44         print_z(z, size);
45
46         for(i=0; i<len; i++){
47                 pos[i] = get_pos(z, size, datos[i]);
48                 fprintf(stderr, "vino %c emiti: %d\n",datos[i], pos[i]);
49                 if (pos[i] != 0) 
50                         pop_front(z,pos[i]);
51                 print_z(z, size);
52         }
53         return pos;
54 }
55
56
57 char *jacu_buscar_z(char* datos, int len, int *size)
58 {
59         char *z;
60         int i, j=0;
61         
62         z = NULL; /*(char*)malloc(1);*/
63         /*if (z==NULL) return NULL;*/
64         for(i=0; i<len; i++){
65                 if( no_pertenece(z, datos[i], j) == -1 ){
66                         j++;
67                         z = realloc(z, j*sizeof(char));
68                         z[j-1]=datos[i];
69                         *size = j;
70                 }
71         }
72         return z;
73 }
74         
75
76 int no_pertenece(char *z, char c, int len)
77 {
78         int i;
79         
80         /* XXX Z NO TIENE 255 POSICIONES XXX */
81         for(i=0; i<len; i++)
82                 if (z[i] == c)
83                         return 0;
84         return -1;
85 }
86                         
87 void pop_front(char *z, int pos)
88 {
89         char aux;
90         int i=0;
91         
92         aux = z[pos];
93         for(i=pos; i>0; i--)
94                 z[i]=z[i-1];
95         z[0]=aux;
96 }       
97         
98 int get_pos(char *z, int len, char c)
99 {
100         int pos;
101         if (z==NULL) return -1;
102
103         for(pos=0; pos<len; pos++)
104                 if ( z[pos] == c )
105                         return pos;
106         return -1;
107 }