数据结构课题报告解析

测试数据用的ssadb

1.main函数解析

getline
getline()
cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符)

1、用getline函数从输入流读字符时,遇到终止标志字符时结束,指针移到该终止标志字符之后,下一个getline函数将从该终止标志的下一个字符开始接着读入。

2、 如果在用cin.getline(ch, 20, ‘/’)从输入流读取数据时,遇到回车键("\n"),是否 结束读取?结论是此时"\n"不是结束标志"\n"被作为一个字符被读入。
目的链接
strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)
int n在函数开头,先开始赋值为0
如果出现两次一样的字母b[j]+1;权值增加
如果 if (j>=n)//个人测试来看n始终在执行 这步,所以n始终会跟随输入字符n变化
{
a[n]=buff[i];
b[n]=1;
n++;
}
3. char a[100], buff[1024], p;//a为存放字符 buff为输入的字符串 p为输入译码时的字符
int b[100];//存放权值信息
上述完成main函数的字符编码及权值的赋值
接着
CreateHuffmanTree(HT, a, b);
CreatHuffmanCode(HT);

2.CreatHuffmanTree函数解析

4
在creathuffmanTree中 HT[i].letter=t[i],char t[]对应上述a[100]中存放字符,weight为当前节点权值信息
第一个for循环for(i=0; i<n; i++){…}
便已经分配好权值和字符
前提如果输入ssadb的话,n=4为4个字母,
前面有4个节点.后面4个默认空节点
这里i=n,这里HT已经有了这行
HT=new HTNode[8]//开辟了8个对象???需要复习
Select(HT, i-1,s1, s2);//在n个数中找出权值最小的两个解析:i-1=3函数中.
这时进入Min函数(HT,3)
5.Min
第一次调用
for循环4次,k=10000
第一次循环
j=0
if(HT[j].parent==0)
k=HT[0].weight=2
flag=1;
最终循环下去
会选到b的
第二次调用
b的parent=1 标记不会选到
选到前一个d
HT[s1].parent=i;
HT[s2].parent=i;//将他们两个的parent节点设置为i;

HT[i].lchild=s1;
HT[i].rchild=s2;//把这两个分别当作左右节点
HT[i].weight=HT[s1].weight+HT[s2].weight;//他们两个的双亲为他们两个的和;

一个for循环总是选择权值最小的两个构建哈夫曼树.

3.解析creatHuffmanCode(HuffmanTree HT)

HT已经创立好
得知道HTree树中各个节点parent节点的值
for(i=n; i<m; i++)//
{
Select(HT, i-1,s1, s2);//在n个数中找出权值最小的两个

HT[s1].parent=i;
HT[s2].parent=i;//将他们两个的parent节点设置为i;

HT[i].lchild=s1;
HT[i].rchild=s2;//把这两个分别当作左右节点
HT[i].weight=HT[s1].weight+HT[s2].weight;//他们两个的双亲为他们两个的和;

}解析parent

猜你喜欢

转载自blog.csdn.net/lpblog/article/details/115698509