]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - otros/mtf/mtf.c
* Agrego bs_restore para rehacer el array original.
[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);
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                 printf("%c", z[i]);
16         printf("\n");
17 }
18
19
20 int *jacu_mtf(char *datos, int len)
21 {
22         char *z;
23         int *pos;
24         int i, size;
25         
26         pos = (int*)malloc(len);
27         z = jacu_buscar_z(datos, len, &size);
28         printf("Z original = ");
29         print_z(z, size);
30         printf("SIZE = %d\n", size);
31         z[0]='A';z[1]='B';z[2]='C';z[3]='D';z[4]='R';
32         for(i=0; i<len; i++){
33                 pos[i] = get_pos(z, size, datos[i]);
34                 printf("vino %c emiti: %d\n",datos[i], pos[i]);
35                 if (pos[i] != 0) 
36                         pop_front(z,pos[i]);
37                 print_z(z, size);
38         }
39         return pos;
40 }
41
42
43 char *jacu_buscar_z(char* datos, int len, int *size)
44 {
45         char *z;
46         int i, j=0;
47         
48         z = (char*)malloc(1);
49         if (z==NULL) return NULL;
50         for(i=0; i<len; i++){
51                 if( no_pertenece(z, datos[i]) ){
52                         realloc(z, j*sizeof(char));
53                         z[j]=datos[i];
54                         j++;
55                         *size = j;
56                 }
57         }
58         return z;
59 }
60         
61
62 int no_pertenece(char *z, char c)
63 {
64         int i;
65         
66         for(i=0; i<255; i++)
67                 if ( z[i] == c )
68                         return 0;
69         return -1;
70 }
71                         
72 void pop_front(char *z, int pos)
73 {
74         char aux;
75         int i=0;
76         
77         aux = z[pos];
78         for(i=pos; i>0; i--)
79                 z[i]=z[i-1];
80         z[0]=aux;
81 }       
82         
83 int get_pos(char *z, int len, char c)
84 {
85         int pos;
86         for(pos=0; pos<len; pos++)
87                 if ( z[pos] == c )
88                         return pos;
89         return -1;
90 }