현재 위치 - 중국 분류 정보 발표 플랫폼 - 남자 헤어스타일 - 하프만 트리 알고리즘을 이용하여 파일을 압축하고 압축을 푸는 프로그램을 설계하다.

하프만 트리 알고리즘을 이용하여 파일을 압축하고 압축을 푸는 프로그램을 설계하다.

# include & ltstdio.h & gt

# include & ltstring.h & gt

# include & ltstdlib.h & gt

# include & ltconio.h & gt

구조 헤드

{

부호 없는 문자 b; /* 문자 */

긴 카운트 /* 주파수 */

Long parent, lch, rch/* 나무 만들기 */

문자 비트 [256]; /* 허프만 코드 */

}

헤더 [5 12], tmp

잘못된 압축 ()

{

Char 파일 이름 [255], 출력 파일 [255], buf [512];

부호 없는 문자 c;

롱 I, j, m, n, f;

드래곤 맨1,pt 1, flength

파일 * ifp, * ofp

Printf ("소스 파일 이름:");

가져오기 (파일 이름);

Ifp=fopen (파일 이름, "Rb");

If(ifp==NULL)

{

Printf ("소스 파일 열기 오류! \ n ");

반환;

}

Printf ("대상 파일 이름:");

가져오기 (output file);

Ofp = fopen (출력 파일, "WB");

If(ofp==NULL)

{

Printf ("대상 파일 열기 오류! \ n ");

반환;

}

F length = 0;;

그리고 (! 외국인 투자자 협회

{

프레드 (& ampc, 1, 1, ifp);

제목 [c]. Count++;+;

Flength++;

}

F length-;

제목 [c]. Count-;

For(I = 0;; 나<5 12; I++)

{

If (헤더 [I]. 세어! =0) 머리 [i]. B= (부호 없는 문자) I;

Else 헤더 [i]. B = 0;;

제목 [i]. Parent =-1;

제목 [i]. Lch = 헤더 [I] 입니다. Rch =-1;

}

For(I = 0;; 나 & lt256; I++)

{

For (j = I+1; J & lt256; J++)

{

If (헤더 [I]. 수< 제목 [j]. 수)

{

Tmp = 헤더 [I];

머리 [I]= 머리 [j];

헤더 [j] = tmp;

}

}

}

For(I = 0;; 나 & lt256; I++) if (헤더 [I]. Count = = 0)break;;

N = I;;

M = 2 * n-1;

For(I = n;; 나 & ltm;; I++)

{

Min1= 99999999;

For(j = 0;; J< 나; J++)

{

If (머리 [j]. 부모! =- 1) 계속;

If (min1> 제목 [j]. 수)

{

Pt1= j;

Min1= 헤드 [j]. 셀 수 있습니다.

계속;

}

}

제목 [i]. Count=header[pt 1]. 셀 수 있습니다.

제목 [pt 1]. Parent = I;;

제목 [i]. Lch = pt1;

Min1= 99999999;

For(j = 0;; J< 나; J++)

{

If (머리 [j]. 부모! =- 1) 계속;

If (min1> 제목 [j]. 수)

{

Pt1= j;

Min1= 헤드 [j]. 셀 수 있습니다.

계속;

}

}

제목 [i]. Count+=header[pt 1]. 셀 수 있습니다.

제목 [i]. Rch = pt1;

제목 [pt 1]. Parent = I;;

}

For(I = 0;; 나 & ltn;; I++)

{

F = I;;

제목 [i]. 비트 [0] = 0;

While (제목 [f]. 부모! =- 1)

{

J = f;;

F = 제목 [f]. 부모;

If (제목 [f].lch==j)

{

J = strlen (헤더 [I]. 비트);

Memmove (헤더 [i]. 비트+1, 제목 [I]. 비트, j+1);

제목 [i]. 비트 [0] = "0";

}

기타

{

J = strlen (헤더 [I]. 비트);

Memmove (헤더 [i]. 비트+1, 제목 [I]. 비트, j+1);

제목 [i]. 비트 [0] ='1';

}

}

}

Fseek(ifp, 0, seek _ set);

Fwrite(& amp;; Flength, sizeof(int), 1, ofp);

Fseek(ofp, 8, seek _ set);

Buf [0] = 0;

F = 0;;

Pt1= 8;

그리고 (! 외국인 투자자 협회

{

C = fgetc (ifp);

F++;+;

For(I = 0;; 나 & ltn;; I++)

{

If(c==header[i]. B) 파괴

}

Strcat(buf, header[i]. 비트);

J = 스트렌 (buf);

C = 0;;

While(j & gt;; =8)

{

For(I = 0;; 나<8; I++)

{

If (buf [I] = ='1') c = (c < & lt 1)| 1;

Else c = c<& lt 1;

}

Fwrite(& amp;; C, 1, 1, ofp);

Pt1++;

Strcpy(buf, buf+8);

J = 스트렌 (buf);

}

If (f = = f length) break;

}

If(j & gt;; 0)

{

Strcat(buf, "00000000");

For(I = 0;; 나<8; I++)

{

If (buf [I] = ='1') c = (c < & lt 1)| 1;

Else c = c<& lt 1;

}

Fwrite(& amp;; C, 1, 1, ofp);

Pt1++;

}

Fseek(ofp, 4, seek _ set);

Fwrite(& amp;; Pt 1, sizeof(long), 1, ofp);

Fseek(ofp, pt 1, seek _ set);

Fwrite(& amp;; N, sizeof(long), 1, ofp);

For(I = 0;; 나 & ltn;; I++)

{

Fwrite(& amp;; (제목 [i]. B), 1, 1, ofp);

C = strlen (헤더 [I]. 비트);

Fwrite(& amp;; C, 1, 1, ofp);

J = strlen (헤더 [I]. 비트);

If(j%8! =0)

{

For(f = j% 8;; F<8; F++)

Strcat (헤드 [I]. 비트, "0");

}

While (헤더 [I]. 비트 [0]! =0)

{

C = 0;;

For(j = 0;; J<8; J++)

{

If (헤더 [I]. Bits [j] = ='1') c = (c < & lt 1)| 1;

Else c = c<& lt 1;

}

Strcpy (헤더 [i]. 비트, 제목 [I]. 비트+8);

Fwrite(& amp;; C, 1, 1, ofp);

}

}

Fclose (ifp);

Fclose (ofp);

Printf ("압축 성공! \ n ");

반환;

}

Void 압축 해제 ()

{

Char 파일 이름 [255], 출력 파일 [255], buf[255], bx [255];

부호 없는 문자 c;

롱 I, j, m, n, f, p, l;

긴 섬유 길이

파일 * ifp, * ofp

Printf ("소스 파일 이름:");

가져오기 (파일 이름);

Ifp=fopen (파일 이름, "Rb");

If(ifp==NULL)

{

Printf ("소스 파일 열기 오류! \ n ");

반환;

}

Printf ("대상 파일 이름:");

가져오기 (output file);

Ofp = fopen (출력 파일, "WB");

If(ofp==NULL)

{

Printf ("대상 파일 열기 오류! \ n ");

반환;

}

프레드 (& ampflength, sizeof(long), 1, ifp);

프레드 (& ampf, sizeof(long), 1, ifp);

Fseek(ifp, f, seek _ set);

프레드 (& ampn, sizeof(long), 1, ifp);

For(I = 0;; 나 & ltn;; I++)

{

프레드 (& 제목 [i]. B, 1, 1, ifp);

프레드 (& ampc, 1, 1, ifp);

P = (long) c;

제목 [i]. Count = p;;

제목 [i]. 비트 [0] = 0;

If(p% 8>;; 0) m = p/8+1;

Else m = p/8;

For(j = 0;; J & ltm;; J++)

{

프레드 (& ampc, 1, 1, ifp);

F = c;;

이타 (f, 부, 2);

F = strlen (buf);

For(l = 8;; L & gtf;; L-)

{

Strcat (헤드 [I]. 비트, "0");

}

Strcat (헤더 [I]. bits, buf);

}

제목 [i]. 비트 [p] = 0;

}

For(I = 0;; 나 & ltn;; I++)

{

For (j = I+1; J & ltn;; J++)

{

If (strlen (헤더 [I]. 비트) >; Strlen (헤더 [j]. 비트))

{

Tmp = 헤더 [I];

머리 [I]= 머리 [j];

헤더 [j] = tmp;

}

}

}

P = strlen (헤더 [n-1]). 비트);

Fseek(ifp, 8, seek _ set);

M = 0;;

Bx [0] = 0;

While( 1)

{

While (strlen (bx) < (부호 없는 정수) p)

{

프레드 (& ampc, 1, 1, ifp);

F = c;;

이타 (f, 부, 2);

F = strlen (buf);

For(l = 8;; L & gtf;; L-)

{

Strcat(bx, "0");

}

Strcat(bx, buf);

}

For(I = 0;; 나 & ltn;; I++)

{

If (memcmp (헤더 [i]. 비트, bx, 제목 [I]. Count) = = 0) break;

}

Strcpy(bx, bx+header[i]. 개수);

C = 제목 [i]. B;

Fwrite(& amp;; C, 1, 1, ofp);

M++;+;

If (m = = f length) break;

}

Fclose (ifp);

Fclose (ofp);

Printf ("압축을 풀었습니다! \ n ");

반환;

}

Int main ()

{

Int c;;

Printf(" 1-압축 파일 \ n ");

Printf("2-파일 압축 해제 \ n ");

Printf("Select 1 또는 2: ");

C = getch ();

Printf("%c\n ",c);

If (c = ='1') compress ();

Else if(c = =' 2 ')uncompress(); ();

0 을 반환합니다

}