KKK735 2021-11-27 20:04 采纳率: 75%

# 无法打印结构体数组里的数据

``````
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 8
//存储哈夫曼树的静态三叉链表定义
typedef struct{
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char ** HuffmanCode;
//字符、权值、对应编码组成的结构体类型
struct s
{
char c;
unsigned int weight;
char code[N];
};
//选择两个权值最小的结点
void Select(HuffmanTree &HT,unsigned int i,unsigned int *s1,unsigned int *s2){
unsigned int min1,min2,j;
min1=min2=9999;
for(j=1;j<=i;j++){
if(HT[j].weight<min2&&HT[j].parent ==0){
min2=min1;
*s2=j;
if(HT[j].weight<min1&&HT[j].parent==0){
min1=HT[j].weight;
*s1=j;

}
}
}
}

//构造哈夫曼树和哈夫曼编码
void Huffman(HuffmanTree &HT,HuffmanCode &HC,unsigned int n,s S[N]){
if (n<=1)return;
unsigned int i=0,m=2*n-1,c=0,f=0,s1=0,s2=0;
HuffmanTree p;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;i++,++p){
p->parent=0;
p->lchild=0;
p->rchild=0;
p->weight=S[i-1].weight;
}
/*    for(unsigned int v=1;v<=2*n-1;v++){
printf("%d\t",HT[v].weight);
printf("%d\t",HT[v].parent);
printf("%d\t",HT[v].lchild);
printf("%d\t\n",HT[v].rchild);
}
printf("****************************************************\n");*/
for(;i<=m;i++,++p){
p->parent=0;
p->lchild=0;
p->rchild=0;
p->weight=0;
}
/*for(unsigned int o=1;o<=2*n-1;o++){
printf("%d\t",HT[o].weight);
printf("%d\t",HT[o].parent);
printf("%d\t",HT[o].lchild);
printf("%d\t\n",HT[o].rchild);
}
printf("*************************************************************************\n");*/
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;
}
/*    for(unsigned int k=1;k<=2*n-1;k++){
printf("%d\t",HT[k].weight);
printf("%d\t",HT[k].parent);
printf("%d\t",HT[k].lchild);
printf("%d\t\n",HT[k].rchild);
}*/
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
char *cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++){
int start=n-1;
for(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));
//        strcpy(HC[i],&cd[start]);
strcpy(S[i].code,&cd[start]);
}
free(cd);
}
//输出哈夫曼树数据
void PrintHuffman(HuffmanTree HT,int n,s S[N]){
printf("哈夫曼树如下所示:\n");
for(int k=1;k<=2*n-1;k++){
printf("%d\t",HT[k].weight);
printf("%d\t",HT[k].parent);
printf("%d\t",HT[k].lchild);
printf("%d\t\n",HT[k].rchild);
}
printf("8个字符的字符、权值及哈夫曼编码如下:\n");
for(int l=0;l<=n;l++){
printf("%s\t%u\t%s\t\n",S[l].c,S[l].weight,S[l].code);
}
}
int main()
{
//哈夫曼树的建立和编码的生成
HuffmanTree HT;
HuffmanCode HC;
s S[N];
printf("请输入8个字符，及它们的权值:\n");
for(int i=1;i<=N;i++){
printf("请输入第%d个字符:",i);
scanf("%s",&S[i-1].c);
printf("请输入该字符的权值:");
scanf("%u",&S[i-1].weight);
//    printf("%d\n",S[i-1].weight);
}
Huffman(HT,HC,8,S);

//打印输出哈夫曼树数据
PrintHuffman(HT,8,S);
//用户输入任意一个由 N 个字符组成的字符串，输出该字符串对应的哈夫曼编码字符串
printf("请输入一个字符串,该字符串只能包含8个字符(ABCDEFGH):");

printf("\n该字符串对应的哈夫曼编码为:");

//用户输入哈夫曼编码(由 01 组成)，将进行解码，输出对应的字符串
printf("请输入一个由0或1构成的哈夫曼编码:");
printf("\n该哈夫曼编码对应的字符串为");
system("PAUSE");
return 0;
}
``````

• 写回答

#### 1条回答默认 最新

关注

scanf("%s",&S[i-1].c);
改为
scanf("%c",&S[i-1].c);

本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

#### 问题事件

• 已结题 （查看结题原因） 11月28日
• 已采纳回答 11月28日
• 修改了问题 11月27日
• 修改了问题 11月27日
• 展开全部

#### 悬赏问题

• ¥15 ＃求带 python，使用pycharm爬取智联招聘数据资源并保存为Excel文件，同时以图表形式呈现
• ¥15 学校优化算法怎么样，国内用的多吗？
• ¥15 微信购物商城购物车的所有功能以及购物车，和首页的搜索功能
• ¥40 servlet的web程序部署出错
• ¥50 activiti 新建流程系列问题
• ¥50 为什么我版本升级之后运行速度变慢5倍？？
• ¥15 如何在gazebo中加载机械臂和机械手
• ¥15 纯运放实现隔离采样方案设计
• ¥20 easyconnect无法连接后缀带.com的网站，一直显示找不到服务器ip地址，但是带有数字的网站又是可以连接上的，如何解决
• ¥15 电脑开机过商标后就直接这样，求解各位