用三重指针实现HaffTree

来源:互联网 发布:mysql拖动排序设计 编辑:程序博客网 时间:2024/06/05 06:29
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct Tree{int wight;int left;int right;int flag;int parent;}HaffTree;void CreatHaffTree(HaffTree *p,int n,int *wight){int i,j;   //循环变量int min1,min2;    //最小值和次小值int  x1,x2;       //最小值和次小值的下标//初始化 HaffTreefor (i = 0; i < 2 * n -1; i++){if (i < n)p[i].wight = wight[i];elsep[i].wight = 0;p[i].parent = 0;p[i].left = p[i].right = 0;p[i].flag = 0;}//创建HaffTreefor (i = 0; i < n -1;i++){min1 = min2 = INT_MAX;x1 = x2 = 0;for (j = 0; j < n + i; j++){if (p[j].wight < min1 && p[j].flag == 0){min2 = min1;x2 = x1;min1 = p[j].wight;x1 = j;}else if (p[j].wight < min2 && p[j].flag ==0){min2 = p[j].wight;x2 = j;}  }p[x1].flag  = p[x2].flag = 1;p[x1].parent = p[x2].parent = n+i;p[n+i].wight = min1 + min2;p[n+i].left = x1;p[n+i].right = x2;}}void HaffTreeSet(HaffTree *p,int n,char ***Code){int i;   // 循环变量char ch[20] = "";int start;      //ch的下标int parent;int child;int lenth;(*Code) = (char **)malloc(sizeof(char **)*n);for (i = 0; i < n; i++){parent = p[i].parent;//p[i].parent 存储的是parent的下标child = i;start = 10;while (parent != 0){if(p[parent].left == child )ch[start--] = '1';else ch[start--] = '0';child = parent;parent = p[parent].parent;}int len = strlen(ch+start+1)+1;(*Code)[i] = (char *)malloc(len);     //  (*Code)[i] ==*(*Code)+i 即char * strcpy((*Code)[i],ch+start+1);}}void main(){int wight[] = {1,5,15,3,2,54,24,17,14};int n  = sizeof(wight)/sizeof(wight[0]);HaffTree *p= (HaffTree*) malloc (sizeof( HaffTree)*(2*n-1));CreatHaffTree(p,n,wight);char **Code = NULL;     //实际是创建了一个字符串数组的指针;想要改变数组内的值,就需要一个二级指针;想要在函数中改变,就需要三级指针;HaffTreeSet(p,n,&Code);for (int i = 0; i < n; i++){printf("%d ",wight[i]);puts(Code[i]);}}

原创粉丝点击