| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 933 人关注过本帖
标题:考倒全年级试题~高手进来指点
只看楼主 加入收藏
chenlie39
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-3-5
收藏
 问题点数:0 回复次数:4 
考倒全年级试题~高手进来指点

开学了老师出了一道题目考全年级同学~给出程序过程,要求我们写出注释每一步都是做什么的,过了5天都没有一个同学交卷~这里有高手的请帮帮忙~老师要求星期一交卷5555555555 #include<iostream.h> #include<stdio.h> #include<string.h> #include<stdlib.h> struct Hnode{ Hnode * parent; int weight; int id; Hnode * lchild; Hnode * rchild; char code[10]; char ch;};

struct Ht{ Hnode arr[100]; int leaves; int total; }; Ht* statistic_char(char * text,Ht * t); Ht * create_tree(Ht * t); void code_string(Ht*t);

//------------------------------------------------------ // main program goes here! //

void display(Ht * t,char *text) { char * p=NULL;int len; printf("%s\n",text); len=strlen(text); cout<<len; for (int i=0;i<len;i++) { cout<<text[i];

}

}

int main(int argc, char* argv[]) { char str[20];Ht *t=NULL; printf("please input a string!\n"); scanf("%s",str); printf("%s\n",str); t=statistic_char(str,t); t=create_tree(t); code_string(t); display(t,str); return 0; }

Ht* statistic_char(char * text,Ht * t) { t=(Ht*)malloc(100*sizeof(Hnode)); t->total =0; t->leaves =0; cout<<t->total <<t->leaves <<endl; int len=strlen(text); printf("%s",text); for (int i=0;i<len;i++) { for (int j=0;j<t->leaves;j++) { if (t->arr[j].ch==text[i]) { t->arr[j].weight++; break; } } if (j==t->leaves ) { t->arr[t->leaves].ch =text[i]; t->arr[t->leaves].weight=1; t->leaves ++; } } t->total =2*t->leaves-1; cout<<endl; /* for (int h=0;h<t->leaves;h++) { cout<<t->arr[h].ch;cout<<t->arr[h].weight<<h<<t->total <<t->leaves <<endl;}*/ return t; }

Ht * create_tree(Ht * t) { Hnode * min_1=(Hnode*)malloc(sizeof(Hnode)); Hnode * min_2=(Hnode*)malloc(sizeof(Hnode)); int min1,min2,xb1,xb2;int temp=t->leaves;

for (int i=0;i<t->leaves;i++) { t->arr[i].parent=NULL; t->arr[i].lchild=NULL; t->arr[i].rchild=NULL; t->arr[i].id=0; cout<<t->arr[i].id<<t->arr[i].ch ; }

//cout<<t->leaves<<";"<<t->total<<endl; while (t->leaves<t->total ) { for (int j=0;j<t->leaves ;j++) {if (t->arr[j].id==0) {min1=t->arr[j].weight ;break;}}//初始化min1

for (int m=0;m<t->leaves ;m++) {if (min1>=t->arr[m].weight&&t->arr[m].id==0) {min1=t->arr[m].weight;}}//查小最小min1

for (m=0;m<t->leaves ;m++)//记下最小元素的下标 {if (min1==t->arr[m].weight&&t->arr[m].id==0) xb1=m;} min_1=&t->arr[xb1];//记下该元素地址; t->arr[xb1].id=1;//将该元素的下标置1; //--------------------------------------------------------------- for (int k=0;k<t->leaves ;k++) {if (t->arr[k].id==0) {min2=t->arr[k].weight ;break;}}//初始化min2 cout<<"min1="<<min1<<endl; cout<<"min2="<<min2<<endl;

//----------------------------------- for (int n=0;n<t->leaves ;n++) {if (min2>=t->arr[n].weight&&t->arr[n].id==0) {min2=t->arr[n].weight;}}//最小化min2 for(n=0;n<t->leaves;n++) {if (min2==t->arr[n].weight&&t->arr[n].id==0) xb2=n;}//记下该元素的下标 cout<<"min2IV"<<min2<<endl; min_2=&t->arr[xb2]; t->arr[xb2].id=1; cout<<"min2II"<<min2<<endl; //-------------------------------------

cout<<"min here"; cout<<min1<<";"<<min2;//测试 //------------------------------------------------------------------- min_1->parent=&t->arr[t->leaves]; min_2->parent=&t->arr[t->leaves]; t->arr[t->leaves].lchild=min_1; t->arr[t->leaves].rchild=min_2; t->arr[t->leaves].ch='X'; t->arr[t->leaves].parent=NULL; t->arr[t->leaves].weight=min1+min2; t->arr[t->leaves].id=0; cout<<"iD"<<t->arr[t->leaves].id<<endl; t->leaves++; cout<<"iD"<<t->arr[t->leaves].id<<endl; } cout<<"id"<<t->arr[t->leaves-1].id<<endl;

cout<<endl; for (int k=0;k<t->leaves;k++) { if (t->arr[k].id==0){ cout<<t->arr[k].id<<endl; cout<<t->arr[k].ch<<endl; cout<<t->arr[k].weight<<endl; } } t->leaves=temp; return t; }

void code_string(Ht*t) { int j; char * p; Hnode * parentnode=(Hnode*)malloc(sizeof(Hnode)); Hnode * pa=(Hnode*)malloc(sizeof(Hnode)); cout<<endl<<endl; for (int i=0; i<t->leaves ;i++) { j=0; pa=&t->arr[i]; parentnode=pa->parent; cout<<t->arr[i].ch ; while(parentnode!=NULL) { if(parentnode->lchild==pa) {t->arr[i].code[j++]='0';cout<<t->arr[i].code[j-1];} else {t->arr[i].code[j++]='1';cout<<t->arr[i].code[j-1];} pa=parentnode; parentnode=parentnode->parent; } //t->arr[i].code[j]='0';cout<<t->arr[i].code[j];j++; t->arr[i].code[j]='\0'; cout<<t->arr[i].code[j]; cout<<endl; }

for(int k=0;k<t->total;k++) { cout<<"HRER GOES!"<<endl; cout<<t->arr[k].ch<<"CH "<<t->arr[k].lchild<<"L " <<t->arr[k].rchild<<"R "<<t->arr[k].parent<<"P "<<t->arr[k].weight<<"W " <<&t->arr[k]<<endl; } cout<<"HERE!"<<endl; for (j=0;j<t->leaves;j++) {printf("%s\n",t->arr[j].code); } for(k=0;k<t->leaves;k++) { for(j=0;j<10;j++) { if (t->arr[k].code[j]==NULL) {p=&t->arr[k].code[j]-1; break; } } cout<<t->arr[k].ch<<"的编码是:"; do{ cout<<*p;p--; }while( p!=&t->arr[k].code[0]-1); cout<<endl; } }

搜索更多相关主题的帖子: 试题 年级 
2005-03-05 17:50
chenlie39
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-3-5
收藏
得分:0 
想挑战自己吗?
2005-03-05 17:50
chenlie39
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-3-5
收藏
得分:0 
高手 能写多少 就学多少~~拜托了!
2005-03-05 23:04
nyq1999
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2005-2-22
收藏
得分:0 
是不是赫夫曼树啊~~看着头都晕~~~~~~
2005-03-12 22:01
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
是哈夫曼树。哎~~~~~~~~~这个好难。他的基本思想是这样的。如一组数里a[4]={1,3,5,7}他先设计一个算法。找到这组数中的最小2个数为底。这里是就是 1 ,3 了 因为 1&lt;3所以1在左边。然后双亲节点就是1+3=4  .他把2个数之和放入另外一个数组上 。接着继续在a中找没用过的数中最小的数。这里就是5。因为5&gt;4所以4在左边。接着又找没用过数中的最小数。这里是 7  4+5=9     9&gt;7所以7在左边 画出来的图如下
                                                                   16
           

                                                      7                            9


                                                                             4             5

                                                                       1        3

没线条。我只能这样表示了。如果要讨论可以进 Q群来7976395
                                                                             

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-04-05 09:02
快速回复:考倒全年级试题~高手进来指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034734 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved