<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

Similar documents
<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Chapter 4. LISTS

chap7.key

untitled

歯9장.PDF

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

03_queue

슬라이드 1

11장 포인터

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

chap 5: Trees

금오공대 컴퓨터공학전공 강의자료


Microsoft PowerPoint - 08-Queue.ppt

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

슬라이드 1

Microsoft PowerPoint - chap11.ppt [호환 모드]

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

슬라이드 1

1장. 리스트

chap x: G입력

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Chapter 4. LISTS

Microsoft PowerPoint - 제11강 파일 처리

슬라이드 1

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Chapter 4. LISTS

Microsoft PowerPoint - 08-chap06-Queue.ppt

03장.스택.key

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

PowerPoint 프레젠테이션

Lab 3. 실습문제 (Single linked list)_해답.hwp

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

BMP 파일 처리

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100


K&R2 Reference Manual 번역본

Microsoft PowerPoint - 자료구조2008Chap06

슬라이드 1

untitled

Contents v 학습목표 자료구조큐에대한개념을스택과비교하여이해한다. 큐의특징과연산방법에대해알아본다. 순차표현방법을이용한큐와연결표현방법을이용한큐를구현해본다. 큐의응용방법을알아본다. v 내용 큐 큐의구현 큐의응용 2/74

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

untitled

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - 제4장-스택과큐.pptx

슬라이드 1

11장.그래프

Microsoft PowerPoint - IP11.pptx

본 강의에 들어가기 전

Index

Microsoft PowerPoint - ch08_큐 [호환 모드]

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

06장.리스트

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

o 스택 (stack) ~ 쌓아놓은더미 1. 스택의개요 - 2 -

5.스택(강의자료).key

PowerPoint 프레젠테이션

untitled

Microsoft PowerPoint - chap06-2pointer.ppt

Chapter #01 Subject

C++-¿Ïº®Çؼ³10Àå

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

2007_2_project4

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap4 [호환 모드]

PowerPoint 프레젠테이션

Chap 6: Graphs

PowerPoint 프레젠테이션

untitled

Microsoft PowerPoint - ch07 - 포인터 pm0415

1217 WebTrafMon II

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

1장. 유닉스 시스템 프로그래밍 개요

PowerPoint Presentation

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

04장.큐

Microsoft PowerPoint 웹 연동 기술.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - [2009] 02.pptx

03장.스택

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

Microsoft PowerPoint - 07-chap05-Stack.ppt

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - chap06-1Array.ppt

슬라이드 1

금오공대 컴퓨터공학전공 강의자료

C++ Programming

C 언어 강의노트

<BCBCB9CCB3AA20C0DAB7E1202D20BDBAC5C3C5A52E687770>

untitled

PowerPoint 프레젠테이션

Microsoft PowerPoint APUE(Intro).ppt

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>

Transcription:

/* */ /* LZWIN.C : Lempel-Ziv compression using Sliding Window */ /* */ #include "stdafx.h" #include "Lempel-Ziv.h" 1 /* 큐를초기화 */ void LZ::init_queue(void) front = rear = 0; /* 큐가꽉찼으면 1 을되돌림 */ int LZ::queue_full(void) return (rear + 1) % SIZE == front; /* 큐가비었으면 1 을되돌림 */ int LZ::queue_empty(void) return front == rear; /* 큐에문자를집어넣음 */ int LZ::put(int k) queue[rear] = k; rear = ++rear % SIZE; return k; /* 큐에서문자를꺼냄 */ int LZ::get(void) i = queue[front]; queue[front] = 0; front = ++front % SIZE; return i; /* k 를큐의첨자로변환, 범위에서벗어나는것을범위내로조정 */ int LZ::qx(int k) return (k + SIZE) % SIZE; /* srcname[] 에서확장자를 lzw 로바꿈 */ void LZ::make_dstname(char dstname[], char srcname[]) char temp[256]; int check=0; //fnsplit(srcname, temp, temp, dstname, temp); strcpy(temp,srcname); strcat(temp,".lzw"); strcpy(dstname,temp);

2 /* 파일의이름을받아그파일의길이를되돌림 */ long LZ::file_length(char filename[]) FILE *fp; long l; if ((fp = fopen(filename, "rb")) == NULL) return 0L; fseek(fp, 0, SEEK_END); l = ftell(fp); fclose(fp); return l; /* jump_table[] 의모든노드를제거 */ void LZ::delete_all_jump(void) jump *j, *d; for (i = 0; i < 256; i++) j = jump_table[i].next; while (j!= NULL) d = j; j = j->next; free(d); jump_table[i].next = NULL; /* jump_table[] 에새로운문자의위치를삽입 */ void LZ::put_jump(int c, int ptr) jump *j; if ((j = (jump*)malloc(sizeof(jump))) == NULL) printf(" nerror : Out of memory."); j->next = jump_table[c].next; /* 선두에삽입 */ jump_table[c].next = j; j->index = ptr; /* ptr 위치를가지는노드를삭제 */ void LZ::del_jump(int c, int ptr) jump *j, *p; p = jump_table + c; j = p->next; while (j && j->index!= ptr) /* 노드검색 */

p = j; j = j->next; 3 p->next = j->next; free(j); /* cp 와 length 로주어진패턴을해시법으로찾아서되돌림 */ int LZ::qmatch(int length) jump *t, *p; int cp, sp; cp = qx(rear - length); /* cp 의위치를얻음 */ p = jump_table + queue[cp]; t = p->next; while (t!= NULL) sp = t->index; /* 첫문자는비교할필요없음. -> i =1; */ for (i = 1; i < length && queue[qx(sp+i)] == queue[qx(cp+i)]; i++); if (i == length) return sp; /* 패턴을찾았음 */ t = t->next; return FAIL; /* 문자 c 를출력파일에씀 */ int LZ::putc1(int c, FILE *dst) if (c == ESCAPE) /* 탈출문자이면 < 탈출문자 0x00> 쌍으로치환 */ putc(escape, dst); putc(0x00, dst); putc(c, dst); return c; /* 패턴을압축해서출력파일에씀 */ void LZ::encode(int sp, int cp, int length, FILE *dst) /* jump_table[] 에패턴의문자들을기록 */ put_jump(queue[qx(cp+i)], qx(cp+i)); putc(escape, dst); /* 탈출문자 */ putc(qx(cp-sp), dst); /* 상대위치 */ putc(length, dst); /* 패턴길이 */ /* Sliding Window 를이용한 LZ 압축함수 */ void LZ::lzwin_comp(FILE *src, char *srcname)

int length; char dstname[13]; FILE *dst; int sp, cp; int i, j; int written; 4 make_dstname(dstname, srcname); /* 출력파일이름을만듬 */ if ((dst = fopen(dstname, "wb")) == NULL) printf(" n Error : Can't create file."); fcloseall(); /* 압축파일의헤더작성 */ putc(ident1, dst); /* 출력파일에식별자삽입 */ putc(ident2, dst); fputs(srcname, dst); /* 출력파일에파일이름삽입 */ putc(null, dst); /* NULL 문자삽입 */ for (i = 0; i < 256; i++) /* jump_table[] 초기화 */ jump_table[i].next = NULL; rewind(src); init_queue(); put(getc(src)); while (!feof(src)) if (queue_full()) /* 큐가꽉찼으면 */ if (sp == front) /* sp 의패턴이넘어가려고하면현재의정보로출력파일에씀 */ if (length > 3) encode(sp, cp, length, dst); put_jump(queue[qx(cp+i)], qx(cp+i)); putc1(queue[qx(cp+i)], dst); /* 큐에서빠져나가는문자의위치를 jump_table[] 에서삭제 */ del_jump(queue[front], front); get(); /* 큐에서한문자삭제 */ if (length == 0) cp = qx(rear-1); sp = qmatch(length+1); if (sp == FAIL) putc1(queue[cp], dst); put_jump(queue[cp], cp);

length++; 5 put(getc(src)); if (length > 0) if (queue[qx(cp+length)]!= queue[qx(sp+length)]) j = qmatch(length+1); j = sp; if (j == FAIL length > SIZE - 3) if (length > 3) encode(sp, cp, length, dst); put_jump(queue[qx(cp+i)], qx(cp+i)); putc1(queue[qx(cp+i)], dst); sp = j; length++; put(getc(src)); /* 큐에남은문자출력 */ if (length > 3) encode(sp, cp, length, dst); putc1(queue[qx(cp+i)], dst); delete_all_jump(); fclose(dst); /* 큐에문자를넣고, 만일꽉찼다면큐에서빠져나온문자를출력 */ void LZ::put_byte(int c, FILE *dst) if (queue_full()) putc(get(), dst); put(c); /* Sliding Window 를이용한 LZ 압축법의복원함수 */ void LZ::lzwin_decomp(FILE *src) int c; char srcname[13]; FILE *dst; int length; int i = 0, j; int sp;

rewind(src); c = getc(src); if (c!= IDENT1 getc(src)!= IDENT2) /* 헤더확인 */ printf(" n Error : That file is not Lempel-Ziv Encoding file"); fcloseall(); 6 while ((c = getc(src))!= NULL) /* 파일이름을얻음 */ srcname[i++] = c; srcname[i] = NULL; if ((dst = fopen(srcname, "wb")) == NULL) printf(" n Error : Disk full? "); fcloseall(); init_queue(); c = getc(src); while (!feof(src)) if (c == ESCAPE) /* 탈출문자이면 */ if ((c = getc(src)) == 0) /* < 탈출문자 0x00> 이면 */ put_byte(escape, dst); /* < 탈출문자상대위치패턴길이 > 이면 */ length = getc(src); sp = qx(rear - c); put_byte(queue[qx(sp+i)], dst); /* 일반적인문자의경우 */ put_byte(c, dst); c = getc(src); while (!queue_empty()) /* 큐에남아있는모든문자를출력 */ putc(get(), dst); fclose(dst); void LZ::main(char filename[], int mode) FILE *src; long s, d; char dstname[13]; clock_t tstart, tend; tstart = clock(); /* 시작시간기록 */ // 압축 if(mode == 1) if ((src = fopen(filename, "rb")) == NULL)

printf(" n Error : That file does not exist."); lzwin_comp(src, filename); make_dstname(dstname, filename); 7 s = file_length(filename); /* 원래파일의크기를구함 */ d = file_length(dstname); /* 압축파일의크기를구함 */ printf(" nfile compressed to %d%%.", (int)((double)d/s*100.)); // 압축해제 if(mode == 2) src = fopen(filename, "rb"); lzwin_decomp(src); printf(" nfile decompressed & created."); fclose(src); tend = clock(); /* 종료시간기록 */ printf(" ntime elapsed %d ticks", tend - tstart); /* 수행시간출력 : 단위 tick */