#include
/ v8 q7 |5 M( K, q4 R( L* e/ Q; j #include
* d, ?( f6 O2 q. O/ T: U. G #include
w" v8 H {" J5 y8 p4 o #include, N& c/ }4 N% ]0 [
#include$ C& w9 v( J) Z6 N: k0 q' a7 R7 e" K
/*声明两种链表结构----start*// X& v0 _6 d3 c# S! z
struct node_a{ /*链表1-----作用:用来统计文件中字符的个数和种类(通过count)*/
5 s" u1 C5 B3 w char data;
& T9 ?+ x {3 ?# J int count;. ]2 [7 Y4 |! {# z' R0 k
struct node_a *next;
7 e C3 ?6 a* y8 h8 w2 n6 R& \ };* `. {) b7 ^- U: K3 U/ _; c
typedef struct node_a node,*list;# ~- m2 C) ^' y9 c( a) A
list head=NULL;6 Z: F" d% G7 t B2 j; X
struct nodeb{ /*链表2-----作用:用来建立用相应的编码代替字符的新文件*/
, D; H0 M2 r& O( {6 D# q. n' C6 } char data;" y3 f: m- T9 ~. N
struct nodeb *next;
4 J1 ] w/ K+ b6 S9 r };- Q- l3 Y3 k' J% m5 B) H
typedef struct nodeb node_b,*list_b; /*jiang bianma xieru wenjian*/! K3 L1 Q3 ?, F. l( t8 r# j8 G
list_b head_b=NULL;
& v8 ?# v/ d0 r/ t( W6 [/ p7 Q3 N Q: n+ s /*声明两种链表结构----end*/
4 S8 g2 u) I3 t- S3 ?" d4 e" ~& _ /*哈夫曼算法种相关的3种结构的声明-----start*/% B+ o1 n8 h: Z/ c
struct forest{
; M) }' B8 b- Y) `4 _+ G% C& G float weight;
- X3 W1 S" b7 @- B int root;
, w" D! O2 C! s6 w- J' K5 t- i0 ?2 k };; ?: m2 G# ~* M7 f0 Y
struct alphabet{
- y+ W$ v- W8 T& K% K, l char symbol;
/ l) v# E. U6 r" U1 } float probability;
) }& {+ ^2 r4 {" Q% V c int leaf; `- H" z- e1 w; X" W; i8 h7 A( U: u
char *bianma;: O. j6 p8 k& x2 g1 f1 b! v
};
l: o$ I0 |/ H" p2 k struct tree{3 `( r- e$ u; P4 p# i! m
int lchild;
$ [- L. q/ ]* m int rchild;* W; U) W3 K) J, `$ d
int parent;9 e" r. z; e% I. X4 u# \8 [" x
};5 R: p4 H+ X- g; L$ S
typedef struct tree *tree_ptr,tree_node;+ ^' `- W- m( O- G5 r( X3 u
typedef struct forest *forest_ptr,forest_node;
. M$ S0 t' Z8 { typedef struct alphabet *alphabet_ptr,alphabet_node;" Q) z/ W* S9 X& A, H
tree_ptr tree1;
" F( Q1 N# C" w6 Y+ \ ]5 N5 ~ forest_ptr forest1;
, V( W1 Y+ V ^* b0 F8 c4 q/ m4 j alphabet_ptr alphabet1;/ w+ f8 O; E3 e8 B, u y
int lasttree,lastnode;
7 t2 X+ F F; ~8 Q$ K& Z% p% I3 j( e int least,second;3 T( W* `- W' R, d! Y* B+ V
/*哈夫曼算法种相关的3种结构的声明-----end*/) j% ]0 q+ m8 L( s; O5 n, ?+ ~7 R9 Q
/**************stack difination start****************/" L$ W3 T) m& p4 E! i" p
struct stacknode{: t" {+ i6 u8 Q' t- ~+ Y4 N ]
char *bian_ma;7 E( M* ?( I6 J# _6 V7 e
struct stacknode *next;/ H4 D* G6 k- \1 u
};
4 N. ]/ O' g! `7 F1 M, P typedef struct stacknode stack_node;% x _) \$ O& |: H' `
typedef stack_node *link;
# c- E& q7 A1 _* K' @6 @7 Y link top=NULL;
3 b2 u$ l# E- B$ ]9 N void push(char *item){
* r0 M, d. {4 D4 t$ C link p;
! K" | Y" m$ Z5 R# E, @ if(top!=NULL){
$ b* d5 J$ T. P9 S" X8 y7 d" R p=(link)malloc(sizeof(stack_node));
9 ~+ G+ D8 w! G$ l; A1 @ if(p==NULL){
0 M% }* M: ~9 e {& P printf("Memory allocation error!");
& s! _4 D1 T4 I x* g x( Z return;3 u4 ]! C. {" O
}
$ B0 g- i/ D, M) U. G p->bian_ma=item;
; U7 j N) |7 q/ s9 Q& e: v7 w, B p->next=top;
8 N) N' F$ i. }; Q top=p;4 q( ~1 K+ }* ~7 a7 n
}
; \: F% u5 o/ p7 r3 H% B5 [ n else{' N u9 @) a! s, l+ h
top=(link)malloc(sizeof(stack_node));
# r/ p8 y6 D! _7 l- n5 S if(!top){5 K+ |2 Q g% d* \% U% B
printf("Memory allocation error!");
9 K: D- D# e P return;
1 v5 _1 e" R, Y4 B8 o+ P; W5 f# p }
' q# }6 x' M! _ top->bian_ma=item;" _' C! z3 S- M2 T0 P; |; Z3 F" a
top->next=NULL;
$ G& Z( _- M$ q }3 c( g3 `' }$ |, }1 ~8 [
}
8 K5 V; B# p5 r. \8 L void pop(void){# T# j/ h& y0 b1 E1 H
link p;
5 ~% j x; w9 p0 Z p=top;5 f9 m0 a! N4 e+ D! C1 d1 F4 R& E; a% q
top=top->next;
5 M8 [( A, W. [. r. |$ _ free(p);
, t1 [2 l2 L) G3 g& h, ~( `2 L [% f" j }
& r# T, n! o3 c* N3 y5 i! ^ void makenull(void){
% R! t, M4 l" e5 g' a E while(top!=NULL)% R) @3 ~( M6 l5 g" J
pop();
( Q X Q( H; b }
) v* W! X3 k* _$ i0 d8 e+ i* h int empty(){3 t/ X- s8 Z( |9 c* L8 q" e
if(top==NULL)6 @3 p' \7 k5 u J4 D" G t
return 1;4 D8 }* d! h& B1 b1 H, W3 C
else, \5 O# j) {) o+ J3 A* \
return 0;
# A' S' V8 \0 ^2 P K }
1 A( r7 Z: @4 V& W. ]/ M5 k, k char* tops(void){
1 H1 d. |- D1 h return (top->bian_ma);
% k6 {: Z% r) U* C }+ x& G/ P( V: @# L: U. D) B$ J) e5 Q
void display_stack(link s){ /*显示栈重的内容*/, p5 K! h! d' F1 ~9 p
link ptr;; Z! O* p$ X/ K A- b/ v5 H- m
ptr=s;
! U9 s+ G7 ]6 a9 e8 @7 | while(ptr!=NULL){
6 ]! e9 q }4 ~$ q printf("%s",ptr->bian_ma);" b. N) _) M& C- V6 z- }! @8 n
ptr=ptr->next;6 d3 p" U) O" Y- A8 a
}
% B/ }( m$ t3 }- l }
; @; A Z4 |9 O. X /***************************stack__difination is end************************/6 P) g* i; W8 R
void display(list h){ /*显示链表1*/
* G1 U- S2 X& ^' G- f w list ptr;
6 P: H6 C% C a$ `! w, A int i=1;
/ W% W0 Q/ P7 ~2 ~$ u- j ptr=h->next;& S* |" _4 f" a, o# V3 E: X6 `
while(ptr!=NULL){
# Y- h; I+ q, S1 P printf("%d,%c,%d\n",i,ptr->data,ptr->count);; i* I1 } X j* l. }5 z$ M
i++;
4 |% e0 v& O' a! S ptr=ptr->next;/ \2 q% o9 f; W; K- y/ K0 v
}2 C& s, g1 S9 d8 ]
}1 m2 B% n! ^. Z4 Q# J0 J# q. t
void display_b(list_b h){ /*显示链表2*/9 B1 w" t. W( k7 `( V
list_b ptr;( `% ?5 f& H5 d
int i=1;
% d F& k4 d9 I2 r9 d' g ptr=h->next;
4 L9 R$ B% I5 j" X/ l, G while(ptr!=NULL){
! X, Y% M( |% B* U! n printf("%d,%c\n",i,ptr->data);& M- D# D5 M& N S% R$ ]
i++; m- f; E+ e. J6 k
ptr=ptr->next;) N h" A% [7 R; P* @* K
}, Q0 g: z3 ^6 i$ J
}
2 B! {7 X* O) I5 o void insert(char item){ /*用于插入元素以建立链表1*/
* Y2 ^) F D8 c& |5 i list temp,ptr;0 ?8 H$ p% i! }, |1 B3 I( j5 ]/ q
int flag;& G0 A* Y2 Z3 \7 [( Q
ptr=head->next;( [0 y3 M9 s+ e/ w; M
if(ptr==NULL){- `# v* H7 U$ I1 d# G
head->next=(list)malloc(sizeof(node));
0 A. _; Z% O. u% u4 g head->next->data=item;
- t6 T4 }7 Z f2 p& a/ @# M head->next->count=1;7 q; V, f8 q. ~6 h' i: s+ N/ n
head->next->next=NULL;. h( a5 _% A" A0 U6 {) l; h
} O v" n' ]( ~# e# |; I
else{0 N8 V/ ~/ A! j. A; i
while(ptr!=NULL){, C% @7 C( l% U" `: x7 j
if(ptr->data==item){
2 P% Y- t8 D2 y5 D ptr->count=ptr->count+1;4 [- [" \) O& J6 ]
flag=1;
' K" f* O* g, X8 R }
% v" }& I A. J- P$ F6 o# c7 A$ Z ptr=ptr->next;
4 R" G; ]1 F6 h }
) q0 H5 L9 T% g" U ptr=head;8 F9 T* Z# G4 X
if(flag==1), o" n" O5 {: D
return;
+ V+ b* k" d1 H1 ~4 Y else{ D; Q& l4 e. n
temp=ptr->next;
0 I4 _$ ] r# ~* Z2 Y9 ~2 [: r ptr->next=(list)malloc(sizeof(node));6 v2 S: |& v- ]9 H+ h
ptr->next->data=item;/ T8 u) {3 ^" S' u, C9 W: L9 y% a
ptr->next->count=1;/ s( q% ]! i: v6 p
ptr->next->next=temp;
& k2 c' h( ~9 v8 G }
6 W2 e. E( a$ e4 p/ D }
7 m$ X; F6 Z- W8 l }
' O7 g# _) D/ J. ^
% \- O8 a9 P! B, R4 M/ Y( X9 G void insert_b(char item){ /*插入元素以建立链表2*/4 n9 G3 x. I5 ~' B3 L( c+ p
list_b ptr_b, temp_b;( d$ J. Z. d; {: u5 X- c, d2 ]
ptr_b=head_b;
u1 k3 ?8 b) w; I if(ptr_b->next==NULL){
( ]+ v" ]( X. L5 M head_b->next=(list_b)malloc(sizeof(node_b));! s' _) v" M# O; \* Z4 t
head_b->next->data=item;0 `- M1 d/ I* d) q
head_b->next->next=NULL;9 [# z9 G0 l2 E& _- K
}0 q5 G! h' w6 y- n h F+ @6 P
else{" j' t6 o( U: r. K+ m5 X" t
while(ptr_b->next!=NULL){& t2 \6 g! s& i- |
ptr_b=ptr_b->next;8 ` z8 W- h6 s5 Z, ]; r
}0 A7 \" O" K9 I
ptr_b->next=(list_b)malloc(sizeof(node_b));% W4 e& T( h9 m, d/ ]7 e. Q2 H D
ptr_b->next->data=item;4 h: n# u. j& l, I) s5 S$ A- x
ptr_b->next->next=NULL;) o% K2 A8 \- u
}
, r: S: b. t" p% e+ Q. o/ Z* H }" F7 ?- b. n4 T& Q5 P. x
void search(void){ /*搜索文件并将文件中的数据分别存入作用不同的链表中*/
. b* W' U1 t9 Q* k9 n" X0 _1 l FILE *fp;+ \3 c" I2 P; h5 q E
list ptr;6 p* S" {+ j* h& h' m! O
char ch;2 \" U0 |* ]$ C3 k$ \: n$ {
if((fp=fopen("test.txt","r"))==NULL)9 \9 B. V" {6 j0 P. A+ P' \% @
printf("Reading error!\n"); ?; n0 p, }6 v4 E7 T4 u# [
while(!feof(fp)){
4 j9 Z) U9 q4 s& w+ I- d ch=getc(fp);9 J$ C6 Z0 y f: i$ V* w
if(ferror(fp)){ @+ c: j! Z3 q1 {
printf("error!\n");
" H4 w2 ~5 N- O5 X+ p( n break;& b1 ]" Q, N& `7 i0 z
} A* J) c! C! w2 w F; `8 {. d
if(ch==EOF)# d! ?! s7 h/ _: {" o. v7 e
break;' k l( T ?+ ~! O* @5 w
insert(ch); /*插入元素进链表1*/ |