概述
这是我第一篇,之前写这个真是一脸懵,只记得我9点写到第二天四点 我不喜欢我的程序因为用户输入了一些特殊的情况就挂 所以一个程序无论多小我都会加上排错的函数。
这个代码可以输出哈夫曼形成的二叉树(好像不能称为树,管他呢)。感觉还是不错的··~
不多说上代码:
/*
制作者zha good well
输入一段字符串对字符串的字符种类和个数进行整理,并输出编码值
哈夫曼编码*/
纯C语言:
# include <stdio.h>
# include <stdlib.h>
# define N 1000 //如果想录入x个字节那么就把N的数值改成x
# define M 13 //哈夫曼树编码的长度
typedef struct ptree //定义二叉树结点类型
{
struct ptree *lchild; //左0右1子结点指针
struct ptree *rchild; //右子结点指针
int w; //w[2]存储节点权值
char zha[2]; //存储当前的字符
}Ptree,*Optree; //optimum tree
typedef struct pforest //每个此类结构体连接一个二叉树与另一个此类结构体
{
struct pforest *link; //连接每个叶子节点节点权值由大到小排列
struct ptree *root; //指向叶子节点
}Forest,*forest;
int gainchar(char *A,int min,int max);//返回字符长度 范围[min,max]
int jianyan(char *ch,int type[3]);//检验字符串是否合法合法的话type[0]=大写字母个数,type[1]=小写字母个数,type[2]=数字字符个数
int BF(char *a,char *b);//字符串匹配 返回匹配的b在a中的个数
int zhengli(char b[],char *p,int *q);//整理字符串,所有可以出现的字符整理到p里,p[i]的次数储存在q[i]中,返回字符串中不同的个数
Optree hafman(int n,char m[],int w[]);//构造哈夫曼树,权值存在w[]中,返回树根
forest inforest(forest f,Optree t);//将每个二叉树连接起来.根据每个二叉树的根节点的权值大小,将二叉树权值由大到小相接
void shuxing(Optree p,int len);//输出树的形状,形参len=0;
int bianma(Optree p,int a,char b[]);//对哈夫曼树进行编码,返回哈夫曼树的权值
int main(){
int a=0,d,k;
char b[N+1],*p=NULL;
char kkk[M]={"