이산수학 c1 프로젝트 7

Download 이산수학 C1 프로젝트 7

If you can't read please download the document

Upload: pkok15

Post on 12-Jun-2015

288 views

Category:

Documents


9 download

TRANSCRIPT

  • 1. C1 : 09 : 08 09 09

2. C1 , Group codes 2012 6 13 , : : , : . . : , , 0, 1 : L,R, S, N, T 3. 0.5, 0.3, 0.15, 0.05 4 x1, ..., x4 x1, ..., x4 00, 01, 10, 11 X 2 x1 0, x2 10, x3 110,x4 111 , 0.5*1 + 0.3*2 + 0.15*3 + 0.05 * 3 =1.7 : (weight) - ( ) (leaf) (path) ( 0 , 1 ) - 2 - 4. CharacterCode Frequency Total Bits a 000 1030 e 001 1545 i 010 1236 s 0113 9 t 100412 space 101 1339new line 1101 3 Total3 Bits 58 174 Bits - 3 - 5. 2012 6 19 Group Code .- 4 - 6. #include #include #include typedef struct Node {char ch;int freq;}Node;typedef struct Code {int num;char ch;int freq;struct Code *right;struct Code *reft;}Code;Node **arr;int a_size;Node **a_temp;Code **h_code;int c_size = 0;Code **c_temp; void InitArr();void ReInitArr();void SortingArr(Node **Target);void InitCode();void Coding(Code **Target,int n);void SortingCode(Code **Target);int MakeCode(Code *Target,Node **k,int i,int n);int main( int argc , char* argv[] ) {FILE*input;char tmp_c;int i,j;Node **result;char c[32];char temp[32];if ( argc != 2 || strlen(argv[1]) == 0) {printf("Usage : %s filenamen" , argv[0]);getch();return 0;}- 5 - 7. input = fopen(argv[1],"r");if (!input) {fprintf(stderr,"Can not open a file. : %s n",argv[1]);getch();exit(1);}InitArr();while ( !feof(input) ) {tmp_c = fgetc(input);printf("%c",tmp_c);if( tmp_c >= 65 && tmp_c ch != -1 )ReInitArr();if( arr[i]->ch == tmp_c ) {arr[i]->freq++;break}else if( arr[i]->ch == -1 ) {arr[i]->ch = tmp_c;arr[i]->freq++;c_size++;break}}}printf("n");SortingArr(arr);for( i = 0 ; i < c_size ; i++ )*arr[i] = *a_temp[i];InitCode();Coding(h_code,1);result = (Node **)malloc(c_size*sizeof(Node *));for( i = 0 ; i < c_size ; i++ ) {result[i] = (Node *)malloc(c_size*sizeof(Node));result[i]->freq = 0;result[i]->ch = -1;}MakeCode(h_code[0],result,0,1freq != 1 ) {if( result[i]->freq & 1 ) {result[i]->freq >>= 1;- 6 - 8. temp[0] = 1temp[1] = 0;}else {result[i]->freq >>= 1;temp[0] = 0temp[1] = 0;}strcat(temp,c);strcpy(c,temp);}printf(" %sn",c);for( j = 0 ; j < 32 ; j++ )c[j] = 0;}printf("eOCIAAe A a......");getch();}void InitArr() {int i;a_size = 40;arr = (Node **)malloc(a_size*sizeof(Node *));a_temp = (Node **)malloc(a_size*sizeof(Node *));for( i = 0 ; i < a_size ; i++ ) {arr[i] = (Node *)malloc(sizeof(Node));arr[i]->ch = -1;arr[i]->freq = 0;a_temp[i] = (Node *)malloc(a_size*sizeof(Node));a_temp[i]->ch = -1;a_temp[i]->freq = 0;}}void ReInitArr() {int i = a_size;a_size += 5;arr = (Node **)realloc(arr,a_size*sizeof(Node *));for( ; i < a_size ; i++ ) {arr[i] = (Node *)malloc(sizeof(Node));arr[i]->ch = -1;arr[i]->freq = 0;}}void SortingArr(Node **Target) {- 7 - 9. int x,i;Node *min;min = (Node *)malloc(sizeof(Node));for( x = 0 ; x < a_size ; x++ ) {min->freq = 60000;for( i = 0 ; i < a_size ; i++ ) {if( Target[i]->ch == -1 )breakif( Target[i]->ch == -2 )continueif( ( min->freq > Target[i]->freq ) ) {min->ch = Target[i]->ch;min->freq = Target[i]->freq;}}if( min->freq != 60000 ) {a_temp[x]->ch = min->ch;a_temp[x]->freq = min->freq;}for( i = 0 ; i < a_size ; i++ ) {if( min->ch == Target[i]->ch ) {Target[i]->ch = -2;Target[i]->freq = 60000;}}}}void InitCode() {int i;h_code = (Code **)malloc(sizeof(Code *));c_temp = (Code **)malloc(sizeof(Code *));for( i = 0 ;i < c_size ; i++ ) {h_code[i] = (Code *)malloc(sizeof(Code));h_code[i]->ch = arr[i]->ch;h_code[i]->num = -1;h_code[i]->freq = arr[i]->freq;h_code[i]->right = (Code *)malloc(sizeof(Code));h_code[i]->reft = (Code *)malloc(sizeof(Code));h_code[i]->right = NULL;h_code[i]->reft = NULL;c_temp[i] = (Code *)malloc(sizeof(Code));c_temp[i]->num = -1;c_temp[i]->ch = -1;c_temp[i]->freq = 0;c_temp[i]->reft = (Code *)malloc(sizeof(Code));c_temp[i]->right = (Code *)malloc(sizeof(Code));c_temp[i]->reft = NULL;c_temp[i]->right = NULL;}- 8 - 10. }void Coding(Code **Target,int n) {Code *tmp;int i;if( n >= c_size )returntmp = (Code *)malloc(sizeof(Code));tmp->reft = (Code *)malloc(sizeof(Code));tmp->right = (Code *)malloc(sizeof(Code));tmp->num = n;tmp->ch = -3;tmp->freq = Target[0]->freq + Target[1]->freq;tmp->reft->ch = Target[0]->ch;tmp->reft->freq = Target[0]->freq;tmp->reft->num = Target[0]->num;tmp->reft->reft = Target[0]->reft;tmp->reft->right = Target[0]->right;tmp->right->ch = Target[1]->ch;tmp->right->freq = Target[1]->freq;tmp->right->num = Target[1]->num;tmp->right->reft = Target[1]->reft;tmp->right->right = Target[1]->right;*Target[0] = *tmp;Target[1]->num = -2;Target[1]->ch = -2;Target[1]->freq = 60000;Target[1]->reft = NULL;Target[1]->right = NULL;SortingCode(Target);for( i = 0 ; i < c_size ; i++ ) {*Target[i] = *c_temp[i];c_temp[i]->num = -1;c_temp[i]->ch = -1;c_temp[i]->freq = 0;c_temp[i]->reft = NULL;c_temp[i]->right = NULL;}free(tmp);Coding(Target,++n);}void SortingCode(Code **Target) {int x,i;Code *min;min = (Code *)malloc(sizeof(Code));for( x = 0 ; x < c_size ; x++ ) {min->freq = 60000;for( i = 0 ; i < c_size ; i++ ) {- 9 - 11. if( Target[i]->ch == -1 )breakif( Target[i]->ch == -2 && Target[i]->num == -2 )continueif( ( min->freq > Target[i]->freq ) ) {min->num = Target[i]->num;min->ch = Target[i]->ch;min->freq = Target[i]->freq;min->reft = Target[i]->reft;min->right = Target[i]->right;}}if( min->freq != 60000 ) {c_temp[x]->num = min->num;c_temp[x]->ch = min->ch;c_temp[x]->freq = min->freq;c_temp[x]->reft = min->reft;c_temp[x]->right = min->right;}for( i = 0 ; i < c_size ; i++ ) {if( min->ch == Target[i]->ch && min->num == Target[i]->num ) {Target[i]->num = -2;Target[i]->ch = -2;Target[i]->freq = 60000;Target[i]->reft = NULL;Target[i]->right = NULL;}}}}int MakeCode(Code *Target,Node **k,int i,int n) {if( Target->reft == NULL && Target->right == NULL ) {k[i]->ch = Target->ch;k[i]->freq = (n>>1);i++;n = 1;n