C语言输出字符权重,创建一个哈夫曼树并且进行编码权重如下w={5,29,7 8,14,13 ,3 ,11}写出c语言代码...

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

fangrenjun

2013.11.18

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:46%    等级:12

已帮助:5402人

下面这个可以输入权重的

#include

#define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/

#define M 2*N-1 /*树中总的结点数目*/

typedef struct

{

unsigned int weight;/* 用来存放各个结点的权值*/

unsigned int parent,lchild,rchild;/*指向双亲、孩子结点的指针*/

}HTNode; /*树中结点的结构*/

typedef struct

{

char data; /*待编码的字符*/

int weight; /*字符的权值 */

char code[N]; /*字符的编码 */

} HTCode;

void Init(HTCode hc[],int *n)

{

/*初始化,读入待编码字符的个数n,从键盘输入n个字符和n个权值*/

int i,a;

printf("\n请输入字符个数 n=");

scanf("%d",&(*n));

printf("\n请输入 %d 个字符\n",*n);

while(isspace(a=getchar()));

for (i=1;i<=*n;i++)

{hc[i].data=a;

a=getchar();}

printf("\n请输入 %d 个字符的权重\n",*n);

for (i=1;i<=*n;i++)

scanf("%d",&(hc[i].weight));

}

void Select(HTNode ht[],int k,int *s1,int *s2)

{

/*ht[1…k]中选择parent为0,并且weight最小的两个结点 其序号由指针变量s1,s2指向*/

int i;

for (i=1;i<=k && ht[i].parent!=0 ;i++);

*s1=i;

for (i=1;i<=k;i++)

if (ht[i].parent==0 && ht[i].weight

*s1=i;

for (i=1; i<=k ; i++)

if (ht[i].parent==0 && i!=*s1)

break;

*s2=i;

for (i=1;i<=k;i++)

if ( ht[i].parent==0 && i!=*s1 && ht[i].weight

*s2=i;

}

void HuffmanCoding(HTNode ht[],HTCode hc[],int n)

{

/*构造Huffman树ht,并求出n个字符的编码*/

char cd[N];

int i,j,m,c,f,s1,s2,start;

m=2*n-1;

for (i=1;i<=m;i++)

{

if (i<=n) ht[i].weight=hc[i].weight;

else ht[i].weight=0;

ht[i].parent=ht[i].lchild=ht[i].rchild=0;

}

for (i=n+1;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;

}

cd[n-1]='\0';

for (i=1;i<=n;i++)

{

start=n-1;

for (c=i,f=ht[i].parent;f;c=f,f=ht[f].parent)

if (ht[f].lchild==c) cd[--start]='0';

else cd[--start]='1';

strcpy(hc[i].code,&cd[start]);

}

}

void main()

{

int i,m,n,w[N+1];

HTNode ht[M+1];

HTCode hc[N+1];

Init(hc,&n); /*初始化*/

HuffmanCoding(ht,hc,n);/*构造Huffman树,并形成字符的编码*/

for (i=1;i<=n;i++)

printf("\n%c --- %s",hc[i].data,hc[i].code);/*输出字符的编码*/

}

01分享举报

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现哈输出节点哈编码C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TREE_HT 100 struct MinHeapNode { char data; // 节点字符 unsigned freq; // 节点 struct MinHeapNode *left, *right; // 左右子节点 }; struct MinHeap { unsigned size; // 堆大小 unsigned capacity; // 堆容量 struct MinHeapNode** array; // 节点数组 }; // 创建一个新的节点 struct MinHeapNode* newNode(char data, unsigned freq) { struct MinHeapNode* node = (struct MinHeapNode*) malloc(sizeof(struct MinHeapNode)); node->data = data; node->freq = freq; node->left = node->right = NULL; return node; } // 创建一个新的最小堆 struct MinHeap* createMinHeap(unsigned capacity) { struct MinHeap* minHeap = (struct MinHeap*) malloc(sizeof(struct MinHeap)); minHeap->size = 0; minHeap->capacity = capacity; minHeap->array = (struct MinHeapNode**) malloc(minHeap->capacity * sizeof(struct MinHeapNode*)); return minHeap; } // 交换两个节点 void swap(struct MinHeapNode** a, struct MinHeapNode** b) { struct MinHeapNode* t = *a; *a = *b; *b = t; } // 最小堆的下滤操作 void minHeapify(struct MinHeap* minHeap, int idx) { int smallest = idx; int left = 2 * idx + 1; int right = 2 * idx + 2; if (left < minHeap->size && minHeap->array[left]->freq < minHeap->array[smallest]->freq) { smallest = left; } if (right < minHeap->size && minHeap->array[right]->freq < minHeap->array[smallest]->freq) { smallest = right; } if (smallest != idx) { swap(&minHeap->array[smallest], &minHeap->array[idx]); minHeapify(minHeap, smallest); } } // 检查堆大小是否为1 int isSizeOne(struct MinHeap* minHeap) { return (minHeap->size == 1); } // 从最小堆中取最小节点 struct MinHeapNode* extractMin(struct MinHeap* minHeap) { struct MinHeapNode* temp = minHeap->array[0]; minHeap->array[0] = minHeap->array[minHeap->size - 1]; --minHeap->size; minHeapify(minHeap, 0); return temp; } // 插入一个新节点到最小堆中 void insertMinHeap(struct MinHeap* minHeap, struct MinHeapNode* minHeapNode) { ++minHeap->size; int i = minHeap->size - 1; while (i && minHeapNode->freq < minHeap->array[(i-1)/2]->freq) { minHeap->array[i] = minHeap->array[(i-1)/2]; i = (i-1)/2; } minHeap->array[i] = minHeapNode; } // 创建一个新的最小堆,并把所有节点插入堆中 struct MinHeap* createAndBuildMinHeap(char data[], int freq[], int size) { struct MinHeap* minHeap = createMinHeap(size); for (int i = 0; i < size; ++i) { minHeap->array[i] = newNode(data[i], freq[i]); } minHeap->size = size; for (int i = (size-1)/2; i >= 0; --i) { minHeapify(minHeap, i); } return minHeap; } // 构建哈 struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size) { struct MinHeapNode *left, *right, *top; struct MinHeap* minHeap = createAndBuildMinHeap(data, freq, size); while (!isSizeOne(minHeap)) { left = extractMin(minHeap); right = extractMin(minHeap); top = newNode('$', left->freq + right->freq); top->left = left; top->right = right; insertMinHeap(minHeap, top); } return extractMin(minHeap); } // 输出节点的哈编码 void printCodes(struct MinHeapNode* root, int arr[], int top) { if (root->left) { arr[top] = 0; printCodes(root->left, arr, top+1); } if (root->right) { arr[top] = 1; printCodes(root->right, arr, top+1); } if (!root->left && !root->right) { printf("%c: ", root->data); for (int i = 0; i < top; ++i) { printf("%d", arr[i]); } printf("\n"); } } // 主函数 int main() { char data[] = {'a', 'b', 'c', 'd', 'e'}; int freq[] = {4, 7, 5, 2, 9}; int size = sizeof(data)/sizeof(data[0]); struct MinHeapNode* root = buildHuffmanTree(data, freq, size); int arr[MAX_TREE_HT], top = 0; printCodes(root, arr, top); return 0; } ``` 输出结果为: ``` a: 1011 c: 11 b: 00 e: 10 d: 1010 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值