数据结构总复习(2)
2013-10-10 22:51
435 查看
二叉树 基本操作
View Code
学会变通,方法各种各样,还有很多需要改进。。。
#include<stdio.h> #include<stdlib.h> typedef struct{ int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; //动态分配数组存储赫夫曼树 typedef char ** HuffmanCode; void Select(HuffmanTree HT,int i,int &s1,int &s2) { int min1=100,min2=100,k,t=100; for( k=0;k<=i;k++) { if(HT[k].parent==0) { if(t>HT[k].weight) { t=HT[k].weight; min1=k; } } } t=100; for( k=0;k<=i;k++) { if(HT[k].parent==0) { if(t>HT[k].weight) { if(k!=min1) { t=HT[k].weight; min2=k; } } } } s1=min1; s2=min2; } void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) { if(n<=1) return; int i,m,s1,s2,f; char *cd; HuffmanTree p; m=2*n-1; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(p=HT,i=1;i<=n;++i,++p,++w) { p->weight=*w; p->parent=0; p->lchild=0; p->rchild=0; } for(;i<=m;i++,p++) { p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; } for(i=n;i<m;i++) { Select(HT,i-1,s1,s2); HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } //从叶子结点到根逆向求每个字符的赫夫曼编码 HC=(HuffmanCode)malloc((n+1)*sizeof(char *));//分配n个字符编码的头指针向量 cd=(char *)malloc(n*sizeof(char)); cd[n-1]='\0'; for(i=0;i<n;++i) { int start=n-1; for(int c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; HC[i]=(char *)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间 HC[i]=&cd[start];//这里应该是没问题的。。。 } free(cd); } int main() { HuffmanTree HT; HuffmanCode HC; int a[8]={1,2,3,4,5,6,7}; HuffmanCoding(HT,HC,a,7); printf("%c",**HC);//怎么访问二级指针会出错。。 }
View Code
学会变通,方法各种各样,还有很多需要改进。。。
相关文章推荐
- 数据结构复习——堆
- 数据结构期末复习第五章数组和广义表
- 数据结构复习之–“冒泡排序”-JAVA实现
- <复习>数据结构中的结构体
- 数据结构总复习(1)
- 数据结构复习笔记(递归先序遍历)
- java基础复习1--基本数据类型、运算符号、表达式语句与程序结构
- [150421][C++]数据结构复习——栈实现源码
- 软考复习:数据结构基础(1.1线性表)
- 数据结构之【树】--复习
- 数据结构复习材料2
- 数据结构复习(交换左右子树)
- 数据结构算法复习[栈操作相关]
- 数据结构之【队列】--复习
- 数据结构复习—栈
- 数据结构复习(Updating)
- 树,森林与二叉树的转换 数据结构期末复习
- 数据结构之顺序表复习
- Python快速复习之数据结构
- 数据结构知识点复习——线性表