]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - otros/mtf/mtf.c
3113161b6dad6aade21452fa9646800a4f61106b
[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 *jacu_mtf(char *datos, int len)
20 {
21         char *z;
22         int *pos;
23         int i, size;
24         
25         pos = (int*)malloc(len*sizeof(int));
26         z = jacu_buscar_z(datos, len, &size);
27         for(i=0; i<len; i++){
28                 pos[i] = get_pos(z, size, datos[i]);
29                 if (pos[i] != 0) 
30                         pop_front(z,pos[i]);
31         }
32         return pos;
33 }
34
35
36 char *jacu_buscar_z(char* datos, int len, int *size)
37 {
38         char *z;
39         int i, j=0;
40         
41         z = NULL; 
42         for(i=0; i<len; i++){
43                 if( no_pertenece(z, datos[i], j) == -1 ){
44                         j++;
45                         z = realloc(z, j*sizeof(char));
46                         z[j-1]=datos[i];
47                         *size = j;
48                 }
49         }
50         return z;
51 }
52         
53
54 int no_pertenece(char *z, char c, int len)
55 {
56         int i;
57         
58         /* XXX Z NO TIENE 255 POSICIONES XXX */
59         for(i=0; i<len; i++)
60                 if (z[i] == c)
61                         return 0;
62         return -1;
63 }
64                         
65 void pop_front(char *z, int pos)
66 {
67         char aux;
68         int i=0;
69         
70         aux = z[pos];
71         for(i=pos; i>0; i--)
72                 z[i]=z[i-1];
73         z[0]=aux;
74 }       
75         
76 int get_pos(char *z, int len, char c)
77 {
78         int pos;
79         if (z==NULL) return -1;
80
81         for(pos=0; pos<len; pos++)
82                 if ( z[pos] == c )
83                         return pos;
84         return -1;
85 }