课课入第课的系指数与数用空格隔课printf("%d,:
",i+1);
scanf("%f%d",&p->coef,&p->expn);Insert(p,head);}returnhead;}voidDestroyPolyn(Polynp){Polynq1,q2;q1=p->next;q2=q1->next;while(q1->next){free(q1);q1=q2;q2=q2->next;}}
voidPrintPolyn(PolynP){Polynq=P->next;intflag=1;
if(!
q){putchar('0');printf("\n");return;}while(q){if(q->coef>0&&flag!
=1)putchar('+');if(q->coef!
=1&&q->coef!
=-1){printf("%g",q->coef);
if(q->expn==1)putchar('X');elseif(q->expn)printf("X^%d",q->expn);}
else{if(q->coef==1){if(!
q->expn)putchar('1');
elseif(q->expn==1)putchar('X');elseprintf("X^%d",q->expn);}
if(q->coef==-1){if(!
q->expn)printf("-1");elseif(q->expn==1)printf("-X");
elseprintf("-X^%d",q->expn);}}q=q->next;flag++;}printf("\n");}
intcompare(Polyna,Polynb){if(a&&b){
if(!
b||a->expn>b->expn)return1;elseif(!
a||a->expnexpn)
return-1;elsereturn0;}elseif(!
a&&b)return-1;elsereturn1;}
PolynAddPolyn(Polynpa,Polynpb){
Polynqa=pa->next;Polynqb=pb->next;Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));hc->next=NULL;headc=hc;
while(qa||qb){qc=(Polyn)malloc(sizeof(structPolynomial));
switch(compare(qa,qb)){
case1:
{qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;}
case0:
{qc->coef=qa->coef+qb->coef;qc->expn=qa->expn;
qa=qa->next;qb=qb->next;break;}
case-1:
{qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;}}if(qc->coef!
=0)
{qc->next=hc->next;hc->next=qc;hc=qc;}elsefree(qc);}returnheadc;}PolynSubtractPolyn(Polynpa,Polynpb){
Polynh=pb;Polynp=pb->next;Polynpd;while(p)
{p->coef*=-1;p=p->next;}pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next)p->coef*=-1;returnpd;}
floatValuePolyn(Polynhead,intx){Polynp;inti,t;floatsum=0;for(p=head->next;p;p=p->next){t=1;for(i=p->expn;i!
=0;){if(i<0){t/=x;i++;}else{t*=x;i--;}}sum+=p->coef*t;}returnsum;}
PolynMultiplyPolyn(Polynpa,Polynpb)
{Polynhf,pf;Polynqa=pa->next;Polynqb=pb->next;
hf=(Polyn)malloc(sizeof(structPolynomial));hf->next=NULL;for(;qa;qa=qa->next){for(qb=pb->next;qb;qb=qb->next){
pf=(Polyn)malloc(sizeof(structPolynomial));pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;Insert(pf,hf);}}returnhf;}voidmain(){intm,n,a,x,f,k=1;Polynpa=0,pb=0,pc;while(k!
=0){
课课入的课数printf("a:
");scanf("%d",&m);pa=CreatePolyn(pa,m);
课课入的课数printf("b:
");scanf("%d",&n);pb=CreatePolyn(pb,n);
课出多课式课出多课式printf("*1:
a2:
b\n");
代入的课课算代入的课课算printf("*3:
xa4:
xb\n");
课出课出printf("*5:
a+b6:
a-b\n");
课出退出printf("*7:
a*b0:
\n");
课课课操作,while(a){printf("\n");scanf("%d",&f);switch(f){
多课式case1:
{printf("\na=");PrintPolyn(pa);break;}
多课式case2:
{printf("\nb=");PrintPolyn(pb);break;}
课入的课,case3:
{printf("xx=");scanf("%d",&x);
课printf("\nx=%da=%.3f\n",x,ValuePolyn(pa,x));break;}
课入的课,case4:
{printf("xx=");scanf("%d",&x);
课printf("\nx=%db=%.3f\n",x,ValuePolyn(pb,x));break;}case5:
{pc=AddPolyn(pa,pb);printf("\na+b=");PrintPolyn(pc);break;}
case6:
{pc=SubtractPolyn(pa,pb);printf("\na-b=");PrintPolyn(pc);break;}
case7:
{pc=MultiplyPolyn(pa,pb);printf("\na*b=");PrintPolyn(pc);break;}
case0:
{DestroyPolyn(pa);DestroyPolyn(pb);a=0;break;}
您的课课课课~课重新课default:
printf("\n!
\n");}}}}
2哈夫曼课/课课器
2.1述概
本课程课课用于建立哈夫曼课~课其课行课课、课课以及打印。
使用课言,课言C
课课课境,VC++6.0
2.2课课容内
、课课描述1
利用哈夫曼课课课行信息通信可以大大提高信道利用率~课短信息课课课课~降低课课
成本。
但是~课要求在课送端通课一课课系课课待课课据课先课课~在接受端课的课个数将来数
据课行课课;课原,。
课于工信道;可以向课课信息的通道,~每端都需要一双即双个
完整的课课课系课。
课课课课的信息站一哈夫曼的课课课系课。
写个/
基本要求,
;,初始化。
课端课入字符集大小从及个字符和个课课~建立哈夫曼课~1nnm
并将它存于文件中。
;,课课。
利用已建立好的哈夫曼课;如不在存~课文件中的正文课行课课~内从2
然后课果存入文件中。
将
;,解课。
利用已建好的哈夫曼课文件中的代课课行课课~课果存入文件中。
将3
;,打印哈夫曼课。
已在存中的哈夫曼课以直课的方式课示在课端上~同课将内4
将写字符形式的哈夫曼课入文件中。
、需求分析2
;,初始化,课入一串字符~课算不同的字符出课的课率~根据;以课课字符出1
课的次作课其出课课率,~根据课课建立哈夫曼课~课出每一课字符的哈夫曼课课。
数
;,利用求出的哈夫曼课课~课课正文;字符串,课行课课~课出。
并2
;,课于得到的一串课课~利用已求得得哈夫曼课课课行课课~课出的正文课出将。
3
;,以课的形式课出哈夫曼课。
4
2.3要课课概
、存课课构1
typedefstructnode1
{
datatyped[MAX];
intweight[MAX];
课度intlen;//
}nodes;
课课定课了课~分课用以存放哈夫曼课的课课字和课课~外课定课了哈夫曼课课课构体两个数另
的课度。
typedefstructnode2
{
datatypedata;
intquan;
structnode2*lchild,*rchild,*next;}Node;
课课用以存放哈夫曼课的课课字、课课、左孩子、右孩子、以及下一指课~以课课课基课。
构体个
、函数2
课函用以课课排序数nodes*sort(nodes*s)
课函用以打印出字符课课以及课课的课课数voidprint(nodes*s)
nodes*keyinsert(nodes*n,chartxt[100])
课函用以课课课课课入的一串字符数从
Node*buildlinks(Node*head)
课函用以建立课课表存课课课课入的一串字符数从
Node*readkeybords(Node*head,chartxt[100])
课函用以课课课入一串字符数从
课函用以文件课取一段字符串数从Node*readfile(Node*head,chartxt[100])
课函用以哈夫曼课中入一课点数从插个Node*insert(Node*head,Node*s)
Node*creathuffman(linknode*head)
Node*buid_hafumantree(Node*root,chartxt[100])
两个数棵函用以建立一哈夫曼课
intbinary(Node*p,charch)
课函用于哈夫曼课课课保存到文件中~数并voidmain_binary(Node*root)
charonlydecode(Node*head,charyima[100])
课函用以哈夫曼课课课数voiddecoding(Node*root,charyima[100])
课函用以打印哈夫曼课数voidprintleaf(Node*p)
、流程课3
哈夫曼课/课课器
建立哈夫曼课
课课课课
打印哈夫曼课
课束
2.4课课分析
1、课课分析
;1,一课始课课课课课不少小课课~如某课量缺少定课~函课用位置出课~通课课出课果数课课~基本课课已改正。
2、行课果运
2.5源程序代课
#include
#include
#include
typedefchardatatype;
#defineMAX100charbin[500];intnum=0;inttop1=-1;intmm=10;typedefstructnode1{datatyped[MAX];intweight[MAX];intlen;}nodes;
typedefstructnode2{datatypedata;intquan;
structnode2*lchild,*rchild,*next;}Node;
typedefNode*linknode;nodes*n;Node*init(Node*head){returnNULL;}nodes*sort(nodes*s){inti,j;datatypetemp1;inttemp2;for(i=0;i<=s->len-2;i++)for(j=i+1;j<=s->len-1;j++){
if(s->weight[i]>s->weight[j]){temp1=s->d[i];
s->d[i]=s->d[j];s->d[j]=temp1;temp2=s->weight[i];
s->weight[i]=s->weight[j];s->weight[j]=temp2;}}returns;}voidprint(nodes*s){inti;
for(i=0;ilen;i++){printf("\t(%c,%d)\n",s->d[i],s->weight[i]);}}nodes*keyinsert(nodes*n,chartxt[100]){inti=0,j=0,k,m=0,v,leng;
datatypec;charp,filename[10];FILE*fp;
n=(nodes*)malloc(sizeof(nodes));
课课入一串字符,printf("\t");gets(txt);leng=strlen(txt);
字符串的课度,printf("\t%d\n",leng);
for(k=0;kweight[k]=0;
for(k=0;kd[m]=txt[k];
n->weight[m]=n->weight[m]+1;m++;
elsefor(v=0;vif(n->d[v]==txt[k]){n->weight[v]=n->weight[v]+1;break;}};
if(v==m){n->d[m]=txt[k];n->weight[m]=n->weight[m]+1;m++;}}
n->len=m;n=sort(n);
是否要保存文件;课入代表是~课入其他代表否,,printf("\ty");
scanf("%c",&p);c=getchar();
课课入要保存的文件名,if(p=='y'){printf("\t");scanf("%s",filename);
fp=fopen(filename,"w");fprintf(fp,"%s",txt);fclose(fp)}returnn;}
Node*buildlinks(Node*head){
Node*p=NULL,*q=head;intj=0;
p=(Node*)malloc(sizeof(Node));p->data=n->d[j];p->quan=n->weight[j];
p->lchild=p->rchild=NULL;
while(jlen){j++;
if(head==NULL)head=p;elseq->next=p;q=p;p=(Node*)malloc(sizeof(Node));
p->data=n->d[j];p->quan=n->weight[j];p->lchild=p->rchild=NULL;}
if(head!
=NULL)q->next=NULL;returnhead;}
Node*readkeybords(Node*head,chartxt[100]){n=keyinsert(n,txt);
课课字符课课课,printf("\t\n");print(n);head=buildlinks(head);returnhead;}
Node*readfile(Node*head,chartxt[100]){
inti=0,m=0,v,k,leng;FILE*fp;charfilename[10];n=(nodes*)malloc(sizeof(nodes));
课课入要课出的文件名,printf("\t");scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL){printf("can'topenfile!
\n");exit(0);}
fscanf(fp,"%s",txt);fclose(fp);leng=strlen(txt);
for(k=0;kweight[k]=0;
for(k=0;kd[m]=txt[k];
n->weight[m]=n->weight[m]+1;m++;}
elsefor(v=0;vif(n->d[v]==txt[k]){n->weight[v]=n->weight[v]+1;break;}};
if(v==m){n->d[m]=txt[k];n->weight[m]=n->weight[m]+1;m++;}}
课课字符课课课,n->len=m;sort(n);printf("\t\n");print(n);
head=buildlinks(head);returnhead;}
intbinary(Node*p,charch){
Node*stack[100];inttag[100],top,i=-1;top=-1;bin[++top1]=ch;while(p||top!
=-1){while(p){i++;stack[++top]=p;tag[top]=0;p=p->lchild;
if(p)bin[++top1]='0';}
while(top>=0&&tag[top]==1){p=stack[top--]