Huffman
2015-09-16 21:11
363 查看
#include < stdio.h > #include < stdlib.h > #include < math.h > #define OK 1 #define ERROR 0 #define OVERFLOW - 2 typedef int Status; typedef char SElemType; #define N 5 #define R 2 #define FMT "%-10.5g" #define STACK_INIT_SIZE 10 #define STACKINCREMENT 10 typedef struct { SElemType * base; SElemType * top; int stacksize; } SqStack; const int M = (N - R) / (R - 1) + 1 + !!((N - R) % (R - 1)); Status InitStack(SqStack & S) { S.base = (SElemType * ) malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status Push(SqStack & S, SElemType e) { if (S.top - S.base >= S.stacksize) { S.base = (SElemType * ) realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } * S.top++=e; return OK; } Status ClearStack(SqStack & S) { if (!S.base) exit(OVERFLOW); S.top = S.base; return OK; } Status DestroyStack(SqStack & S) { if (S.base) free(S.base); return OK; } Status CopyStack(SqStack & S, SqStack T) { int i; if (T.stacksize > S.stacksize) { S.base = (SElemType * ) realloc(S.base, T.stacksize * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = T.stacksize; } else ClearStack(S); for (i = 0; i < T.top - T.base; i++) S.base = T.base; S.top = S.base + (T.top - T.base); return OK; } Status ConStack(SqStack & S, SqStack T) { int i = S.top - S.base; int j = T.top - T.base; if (i + j > S.stacksize) { S.base = (SElemType * ) realloc(S.base, (S.stacksize + T.stacksize) * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base + i; S.stacksize += T.stacksize; } for (i = 0; i < j; i++) S.top = T.base; S.top += j; return OK; } Status PrintStack(SqStack S) { int i; char ch; for (i = S.top - S.base - 1; i >= 0; i--) { ch = S.base; if (ch < 10) printf("%d", ch); else printf("%c", ch - 10 + 'A'); } return OK; } Status Huffman() { int i, j, k, s, b[m]; float p , t; SqStack x, a ; printf("\n"); if (N <= R) { printf("Huffman:\n"); for (i = 0; i < N; i++) printf("%d ", i); exit(0); } for (i = 0; i < N; i++) { printf("p[%d]=", i + 1); scanf("%f", &p); } for (i = 0; i < N - 1; i++) { k = i; for (j = i + 1; j < N; j++) if (p[j] > p[k]) k = j; if (k != i) { t = p; p = p[k]; p[k] = t; } } printf("\np:\n"); for (i = 0; i < N; i++) printf(FMT, p); for (j = 1; j < M; j++) { t = 0.0; if (j == 1) { s = N % (R - 1); if (s < 2) s += R - 1; if (s < 2) s += R - 1; } else s += R - 1; for (i = N - s; i < N - s + R && i < N; i++) t += p; for (i = 0; i < N - s; i++) if (t > p || fabs(t - p) < 1e-5) break; b[j] = i; for (k = N - s; k > i; k--) p[k] = p[k - 1]; p = t; } for (i = 0; i < N; i++) InitStack(a); for (i = 0; i < R; i++) Push(a, i); s = R - 1; for (j = M - 1; j > 0; j--) { CopyStack(x, a]); for (i = b[j]; i < s; i++) CopyStack(a, a); ClearStack(a[s]); for (i = 0; i < R && i + s < N; i++) { Push(a, i); ConStack(a, x); } s += R - 1; } printf("\nHuffman:\n"); for (j = 0; j < N; j++) { PrintStack(a[j]); printf(" "); if ((j + 1) % 5 == 0) printf("\n"); } for (j = 0; j < N; j++) DestroyStack(a[j]); return OK; } void main() { Huffman(); }
相关文章推荐
- 傅里叶变换 【完整版】
- Java文件操作大全
- 程序员发展路径
- 2015区域赛长春网络赛 Travel
- 笔试题:C语言中的字符串问题
- hdu 5444 Elven Postman
- MFC中多个子菜单对应同一个消息响应函数
- Leetcode: 第四题 Median of Two Sorted Arrays
- ios开发-新浪微博10-(下拉菜单的二次封装 完整版)
- poj 3087 Shuffle'm Up (kuangbin带你飞--简单搜索)
- 设计模式初学者笔记:Factory Method模式
- PHP中文乱码的常见解决方法总结
- RILD QCRIL的关系
- ImageDownLoaderAndKVO
- SSH-Struts(两)—调节器(ActionServlet)
- 【待】1.4 Write a method to replace all spaces in a string with'%20'.
- hdu 4540 威威猫系列故事——打地鼠
- Java中的“别名现象”
- 域名那些事儿
- Oracle学习之常见问题处理