fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define t 5
  6.  
  7. /* Defining the node structure */
  8.  
  9. struct nodes
  10. {
  11. double m; // metric//
  12. int s,l; // symbol and level //
  13. struct nodes *ptI, *ptI_plus1, *ptI_minus1;
  14. };
  15.  
  16. typedef struct nodes* node;
  17.  
  18. node create_node (int symbol, double weight, int level){
  19.  
  20. node temp = (node) malloc(sizeof(struct nodes));
  21. if (temp == NULL) {
  22. exit(0);
  23. } else {
  24. temp->s=symbol;
  25. temp->m=weight;
  26. temp->l=level;
  27. temp->ptI = NULL;
  28. temp->ptI_plus1 = NULL;
  29. temp->ptI_minus1 = NULL;
  30.  
  31. /*while (prev->next != NULL) {
  32.   prev = prev->next;
  33.   }*/
  34. }
  35. return temp;
  36. }
  37.  
  38. node add_node_i( node hd, int symbol, double weight, int level) {
  39.  
  40. node temp;
  41. level=level+1;
  42. temp = create_node(symbol, weight, level);
  43.  
  44. hd->ptI = temp;
  45.  
  46. return temp;
  47. }
  48.  
  49. node add_node_i_plus1( node hd, int symbol, double weight, int level) {
  50. node temp;
  51. level=level+1;
  52. temp = create_node(symbol, weight, level);
  53.  
  54. hd->ptI_plus1 = temp;
  55.  
  56. return temp;
  57. }
  58.  
  59. node add_node_i_minus1( node hd, int symbol, double weight, int level) {
  60. node temp;
  61. level=level+1;
  62. temp = create_node(symbol, weight, level);
  63.  
  64. hd->ptI_minus1 = temp;
  65.  
  66. return temp;
  67. }
  68.  
  69.  
  70. /* Defining the stack structure */
  71.  
  72. struct stack_node
  73. {
  74. int e;
  75. struct stack_node* nxt;
  76. };
  77.  
  78. typedef struct stack_node* st_nd;
  79.  
  80.  
  81. // Initializing the stack
  82. void init_st(st_nd stack_head)
  83. {
  84. printf("el co de su madre\n");
  85.  
  86. stack_head = NULL;
  87. }
  88.  
  89. // Entering the elements into stack
  90.  
  91. st_nd push_st(st_nd stack_head,int data){
  92.  
  93. st_nd tmp = (st_nd)malloc(sizeof(struct stack_node));
  94.  
  95. if(tmp == NULL) {exit(0);}
  96.  
  97. tmp->e=data;
  98. printf("%d\n",tmp->e);
  99. tmp->nxt = stack_head;
  100.  
  101. printf("tmp->nxt = stack_head %d\n",&stack_head->e);
  102. stack_head = tmp;
  103. printf(" stack_head=temp %d\n",&stack_head->e);
  104. return stack_head;
  105. }
  106.  
  107. //Deleting an element from the stack.
  108.  
  109. st_nd pop_st(st_nd stack_head,int *elemento)
  110. {
  111. st_nd tmp = stack_head;
  112. *elemento = stack_head->e;
  113. stack_head = stack_head->nxt;
  114. free(tmp);
  115. return stack_head;
  116. }
  117.  
  118. void display(st_nd stack_head)
  119. {
  120. st_nd current;
  121.  
  122. current = stack_head;
  123. if(current!= NULL)
  124. {
  125. printf("Stack: ");
  126. do
  127. {
  128. printf(" TOPE DEL STACK symbol:%d \n",current->e);
  129. current = current->nxt;
  130. }
  131. while (current!= NULL);
  132. printf("\n");
  133. }
  134. else
  135. {
  136. printf("The Stack is empty\n");
  137. }
  138.  
  139. }
  140.  
  141.  
  142.  
  143. //sort elements of the stack
  144.  
  145. void sort_stack(st_nd stack_head, node node1, node node2, node node3){
  146.  
  147. //printf("oaaaaaaaaaaaaaaa\n");
  148.  
  149. if(node1->m <= node2->m && node1->m <= node3->m){
  150.  
  151. if(node2->m <= node3->m){
  152. push_st(stack_head,node3->s);
  153. //printf ("simbolotope: %d\n",stack_head->e);
  154. push_st(stack_head,node2->s);
  155. //printf ("simbolotope: %d\n",stack_head->e);
  156. push_st(stack_head,node1->s);
  157. printf ("up to down 123\n");
  158. //printf("oaaaaaaaaaaaaaaa\n");
  159. //printf ("simbolotope: %d\n",stack_head->e);
  160. }
  161. else
  162. {push_st(stack_head,node2->s);
  163. push_st(stack_head,node3->s);
  164. push_st(stack_head,node1->s);
  165. printf ("up to down 132\n");
  166. }
  167. }
  168. else if(node2->m < node1->m && node2->m <= node3->m){
  169.  
  170. if(node1->m <= node3->m){
  171. push_st(stack_head,node3->s);
  172. push_st(stack_head,node1->s);
  173. push_st(stack_head,node2->s);
  174. printf ("up to down 213\n");
  175. }
  176. else{
  177. push_st(stack_head,node1->s);
  178. push_st(stack_head,node3->s);
  179. push_st(stack_head,node2->s);
  180. printf ("up to down 231\n");
  181. }
  182. }
  183. else{
  184. if(node1->m <= node2->m){
  185. push_st(stack_head,node2->s);
  186. push_st(stack_head,node1->s);
  187. push_st(stack_head,node3->s);
  188. printf ("up to down 312\n");
  189. printf("oaaaaaaaaaaaaaaa\n");
  190. //printf ("simbolotope: %d\n",&stack_head->e);
  191. }else{
  192. push_st(stack_head,node1->s);
  193. push_st(stack_head,node2->s);
  194. push_st(stack_head,node3->s);
  195. printf ("up to down 321\n");
  196. printf("oaaaaaaaaaaaaaaa\n");
  197. //printf ("simbolotope: %d\n",&stack_head->e);
  198. }
  199.  
  200. }
  201.  
  202. // printf ("simbolotope: %d\n",&stack_head->e);
  203.  
  204. }
  205.  
  206.  
  207. double min_distance(double a, double b, double c){
  208. double dmin;
  209. if(a <= b && a <= c){
  210. dmin=a;
  211. }
  212. else if(b < a && b <= c){
  213. dmin=b;
  214. }
  215. else{
  216. dmin=c;
  217. }
  218. return dmin;
  219. }
  220.  
  221. /*int symbol_min_dist(node node1, node node2, node node3){
  222.   int smin;
  223.  
  224.   if(node1->m < node2->m && node1->m < node3->m){
  225.   smin=node1->s;
  226.   }
  227.   else if(node2->m < node1->m && node2->m < node3->m){
  228.   smin=node2->s;
  229.   }
  230.   else{
  231.   smin=node3->s;
  232.   }
  233.  
  234.   return smin;
  235. }
  236.  */
  237.  
  238. node head_node(node node1,node node2,node node3){
  239. node temp;
  240. temp = (node) malloc(sizeof(struct nodes));
  241. if (temp == NULL) {
  242. exit(0);
  243. }
  244. else {
  245. if(node1->m <= node2->m && node1->m <= node3->m){
  246. temp=node1;
  247. }
  248. else if(node2->m < node1->m && node2->m <= node3->m){
  249. temp=node2;
  250. }
  251. else{
  252. temp=node3;
  253. }
  254.  
  255. printf("New head: m = %lf, s = %d, l = %d\n",temp->m, temp->s, temp->l);
  256. return temp;
  257. }
  258. }
  259.  
  260. int in(double u1,int cmin,int cmax){
  261. int u0;
  262. u0=rint(u1);
  263. if (u0>cmax)
  264. return cmax;
  265. else
  266. {if(u0<cmin)
  267. return cmin;
  268. else
  269. return u0;
  270. }
  271. }
  272.  
  273. void display_tree (node head){
  274. if (head != NULL)
  275. {
  276. printf("m = %lf, s = %d, l = %d\n", head->m, head->s,head->l);
  277. display_tree(head->ptI);
  278. display_tree(head->ptI_plus1);
  279. display_tree(head->ptI_minus1);
  280. }
  281. }
  282.  
  283. //Zig Zag decoder algorithm
  284. void ZZ(double *y,double R[t][t],int lg,int col, int tr, int k, int* sf){
  285.  
  286. //local variables
  287. int i,j;
  288. tr=tr-1; //Matrix index
  289. node root,node1,node2,node3,head;
  290. st_nd st_hd;
  291. double s[tr];
  292. int si[tr],si_plus1[tr],si_minus1[tr];
  293. double weighti[tr],weighti_plus1[tr],weighti_minus1[tr];
  294. double aux,d=0;
  295.  
  296.  
  297. /*definition cmin and cmax*/
  298. double cmin=0,cmax;
  299. switch (k){
  300. case 2:
  301. cmax=1;
  302. break;
  303. case 3:
  304. cmax=3;
  305. break;
  306. case 4:
  307. cmax=3;
  308. break;
  309. case 6:
  310. cmax=7;
  311. break;
  312. case 8:
  313. cmax=15;
  314. break;
  315. default:
  316. printf("incorrect k\n");
  317. }
  318.  
  319.  
  320. /* root node and initializing stack */
  321. root = create_node (0,0,0);
  322. head = root;
  323. init_st(st_hd);
  324. printf("Root head: m = %lf, s = %d, l = %d\n\n",head->m, head->s, head->l);
  325.  
  326. //Initializing the cycle
  327. for(i = tr;i >=0 ;i--){
  328. int level=i+1;
  329. printf("Level = %d \n",level);
  330. aux=0;
  331.  
  332. for(j=i+1;j<=tr;j++){
  333. printf("R[%i][%i] = %lf s[%i] = %lf\n", i,j,R[i][j], j,s[j]);
  334. aux=R[i][j]*s[j]+aux;
  335. }
  336. //Calculation of the symbols for each level Si, Si+1 and Si-1
  337. printf("aux = %lf\n", aux);
  338. s[i]=(y[i]-aux)/R[i][i];
  339. si[i]=in(s[i],cmin,cmax);
  340. si_plus1[i]=si[i]+1;
  341. si_minus1[i]=si[i]-1;
  342.  
  343. printf("s[%d] = %lf, si[%d] = %d, si_plus1[%d] = %d, si_minus1[%d] = %d\n", i, s[i], i, si[i], i,si_plus1[i],i,si_minus1[i]);
  344.  
  345. //Calculation of the accumulated weights for each level Si, Si+1 and Si-1
  346. weighti[i]=fabs(y[i]-(R[i][i]*si[i]+aux))+d;
  347. weighti_plus1[i]=fabs(y[i]-(R[i][i]*si_plus1[i]+aux))+d;
  348. weighti_minus1[i]=fabs(y[i]-(R[i][i]*si_minus1[i]+aux))+d;
  349.  
  350. printf("wi[%d] = %lf, wi_plus1[%d] = %lf, wi_minus[%d] = %lf\n",i,weighti[i], i , weighti_plus1[i], i, weighti_minus1[i]);
  351. //Mimimum weight
  352. d=min_distance(weighti[i], weighti_plus1[i], weighti_minus1[i]);
  353.  
  354. printf("d min = %lf\n",d);
  355.  
  356. //Adding nodes to the tree
  357. node1= add_node_i (head, si[i],weighti[i],i);
  358. node2=add_node_i_plus1 (head,si_plus1[i],weighti_plus1[i],i);
  359. node3=add_node_i_minus1 (head,si_minus1[i],weighti_minus1[i],i);
  360.  
  361. printf("Node 1: m = %lf, s = %d, l = %d\n", node1->m, node1->s, node1->l);
  362. printf("Node 2: m = %lf, s = %d, l = %d\n", node2->m, node2->s, node2->l);
  363. printf("Node 3: m = %lf, s = %d, l = %d\n", node3->m, node3->s, node3->l);
  364.  
  365. printf ("TREE:\n");
  366. display_tree(root);
  367.  
  368. //push_st(st_hd,node3);
  369.  
  370. //display(st_hd);
  371. sort_stack(st_hd,node1, node2, node3);
  372. head=head_node(node1,node2,node3);
  373.  
  374. sf[i] = head->s;
  375. // if(i>0) {pop_st(st_hd,&head);}
  376.  
  377. printf("\n\n");
  378. }
  379. }
  380.  
  381. int main (){
  382.  
  383. int l=5, a=5,k=6, h=t, symbol;
  384. int pt[t],i;
  385. double r[t][t]={{0.15,0.9,0.25,0.25,0.3},{0,0.25,0.125,0.75,0.21},{0,0,0.2,0.5,0.4},{0,0,0,0.2,0.88},{0,0,0,0,0.7}};
  386. double y[t]={0.8,0.7,0.9,0.1,0.2};
  387.  
  388.  
  389. ZZ(y,r,l,a, h, k,pt);
  390.  
  391. for ( i = t-1; i >= 0; i-- ) {
  392. symbol=i+1;
  393. printf( "simbolo %d=%d\n",symbol,pt[i]);
  394. }
  395.  
  396. return 0;
  397. }
  398.  
Success #stdin #stdout 0s 9432KB
stdin
Standard input is empty
stdout
el co de su madre
Root head: m = 0.000000, s = 0, l = 0

Level = 5 
aux = 0.000000
s[4] = 0.285714, si[4] = 0, si_plus1[4] = 1, si_minus1[4] = -1
wi[4] = 0.200000, wi_plus1[4] = 0.500000, wi_minus[4] = 0.900000
d min = 0.200000
Node 1: m = 0.200000, s = 0, l = 5
Node 2: m = 0.500000, s = 1, l = 5
Node 3: m = 0.900000, s = -1, l = 5
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
-1
tmp->nxt = stack_head 0
 stack_head=temp 1044476128
1
tmp->nxt = stack_head 0
 stack_head=temp 1044476160
0
tmp->nxt = stack_head 0
 stack_head=temp 1044476192
up to down 123
New head: m = 0.200000, s = 0, l = 5


Level = 4 
R[3][4] = 0.880000  s[4] = 0.285714
aux = 0.251429
s[3] = -0.757143, si[3] = 0, si_plus1[3] = 1, si_minus1[3] = -1
wi[3] = 0.351429, wi_plus1[3] = 0.551429, wi_minus[3] = 0.248571
d min = 0.248571
Node 1: m = 0.351429, s = 0, l = 4
Node 2: m = 0.551429, s = 1, l = 4
Node 3: m = 0.248571, s = -1, l = 4
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
1
tmp->nxt = stack_head 0
 stack_head=temp 1044476416
0
tmp->nxt = stack_head 0
 stack_head=temp 1044476448
-1
tmp->nxt = stack_head 0
 stack_head=temp 1044476480
up to down 312
oaaaaaaaaaaaaaaa
New head: m = 0.248571, s = -1, l = 4


Level = 3 
R[2][3] = 0.500000  s[3] = -0.757143
R[2][4] = 0.400000  s[4] = 0.285714
aux = -0.264286
s[2] = 5.821429, si[2] = 6, si_plus1[2] = 7, si_minus1[2] = 5
wi[2] = 0.284286, wi_plus1[2] = 0.484286, wi_minus[2] = 0.412857
d min = 0.284286
Node 1: m = 0.284286, s = 6, l = 3
Node 2: m = 0.484286, s = 7, l = 3
Node 3: m = 0.412857, s = 5, l = 3
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.284286, s = 6, l = 3
m = 0.484286, s = 7, l = 3
m = 0.412857, s = 5, l = 3
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
7
tmp->nxt = stack_head 0
 stack_head=temp 1044476704
5
tmp->nxt = stack_head 0
 stack_head=temp 1044476736
6
tmp->nxt = stack_head 0
 stack_head=temp 1044476768
up to down 132
New head: m = 0.284286, s = 6, l = 3


Level = 2 
R[1][2] = 0.125000  s[2] = 5.821429
R[1][3] = 0.750000  s[3] = -0.757143
R[1][4] = 0.210000  s[4] = 0.285714
aux = 0.219821
s[1] = 1.920714, si[1] = 2, si_plus1[1] = 3, si_minus1[1] = 1
wi[1] = 0.304107, wi_plus1[1] = 0.554107, wi_minus[1] = 0.514464
d min = 0.304107
Node 1: m = 0.304107, s = 2, l = 2
Node 2: m = 0.554107, s = 3, l = 2
Node 3: m = 0.514464, s = 1, l = 2
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.284286, s = 6, l = 3
m = 0.304107, s = 2, l = 2
m = 0.554107, s = 3, l = 2
m = 0.514464, s = 1, l = 2
m = 0.484286, s = 7, l = 3
m = 0.412857, s = 5, l = 3
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
3
tmp->nxt = stack_head 0
 stack_head=temp 1044476992
1
tmp->nxt = stack_head 0
 stack_head=temp 1044477024
2
tmp->nxt = stack_head 0
 stack_head=temp 1044477056
up to down 132
New head: m = 0.304107, s = 2, l = 2


Level = 1 
R[0][1] = 0.900000  s[1] = 1.920714
R[0][2] = 0.250000  s[2] = 5.821429
R[0][3] = 0.250000  s[3] = -0.757143
R[0][4] = 0.300000  s[4] = 0.285714
aux = 3.080429
s[0] = -15.202857, si[0] = 0, si_plus1[0] = 1, si_minus1[0] = -1
wi[0] = 2.584536, wi_plus1[0] = 2.734536, wi_minus[0] = 2.434536
d min = 2.434536
Node 1: m = 2.584536, s = 0, l = 1
Node 2: m = 2.734536, s = 1, l = 1
Node 3: m = 2.434536, s = -1, l = 1
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.284286, s = 6, l = 3
m = 0.304107, s = 2, l = 2
m = 2.584536, s = 0, l = 1
m = 2.734536, s = 1, l = 1
m = 2.434536, s = -1, l = 1
m = 0.554107, s = 3, l = 2
m = 0.514464, s = 1, l = 2
m = 0.484286, s = 7, l = 3
m = 0.412857, s = 5, l = 3
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
1
tmp->nxt = stack_head 0
 stack_head=temp 1044477280
0
tmp->nxt = stack_head 0
 stack_head=temp 1044477312
-1
tmp->nxt = stack_head 0
 stack_head=temp 1044477344
up to down 312
oaaaaaaaaaaaaaaa
New head: m = 2.434536, s = -1, l = 1


simbolo 5=0
simbolo 4=-1
simbolo 3=6
simbolo 2=2
simbolo 1=-1