C/C++ char类型指针数组输入问题
数据结构课程设计,要求从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上。
程序代码如下:
#include <iostream>
#include <string.h>
#define N 50
#define M 2*N-1
#define MAX 100
using namespace std;
typedef struct {
char data[5];
int weight;
int parent;
int lchild;
int rchild;
}HTNode;
typedef struct {
char cd[N];
int start;
}HCode;
void CreatHT(HTNode ht[], int n) {
int i,k,lnode,rnode;
int min1,min2;
for (i=0; i<2*n-1; i++) {
ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
}
for (i=n; i<2*n-1; i++) {
min1=min2=32767;
lnode=rnode=-1;
for (k=0; k<=i-1; k++) {
if (ht[k].parent==-1) {
if (ht[k].weight<min1) {
min2=min1;
rnode=lnode;
min1=ht[k].weight;
lnode=k;
}
else if (ht[k].weight<min2) {
min2=ht[k].weight;
rnode=k;
}
}
}
ht[lnode].parent=i;
ht[rnode].parent=1;
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode;
ht[i].rchild=rnode;
}
}
void CreatHCode(HTNode ht[], HCode hcd[], int n) {
int i,f,c;
HCode hc;
for (i=0; i<n; i++) {
hc.start=n;
c=i;
f=ht[i].parent;
while (f!=-1) {
if (ht[f].lchild==c) {
hc.cd[hc.start--]='0';
}
else {
hc.cd[hc.start--]='1';
}
c=f;
f=ht[f].parent;
}
hc.start++;
hcd[i]=hc;
}
}
void DispHCode(HTNode ht[], HCode hcd[], int n) {
int i,k;
int sum=0,m=0,j;
printf("输出哈弗曼编码:\n");
for (i=0; i<n; i++) {
j=0;
printf(" %s:\t", ht[i].data);
for (k=hcd[i].start; k<=n; k++) {
printf("%c", hcd[i].cd[k]);
j++;
}
m+=ht[i].weight;
sum+=ht[i].weight*j;
}
printf("\n平均长度=%g\n", 1.0*sum/m);
}
int main(int argc, const char * argv[]) {
// insert code here...
int n,i;
char *str[MAX];//这里定义了一个指针数组存放哈夫曼编码
int fnum[MAX];
HTNode ht[M];
HCode hcd[N];
printf("输如字符集大小:");
scanf("%d", &n);
printf("输入%d个字符:", n);
for (i=0; i<n; i++) {
scanf("%s", str[i]);//这里的输入应该如何修改?
}
printf("输入%d个权值:", n);
for (i=0; i<n; i++) {
scanf("%d", &fnum[i]);
}
for (i=0; i<n; i++) {
strcpy(ht[i].data, str[i]);
ht[i].weight=fnum[i];
}
CreatHT(ht, n);
CreatHCode(ht, hcd, n);
DispHCode(ht, hcd, n);
return 1;
}
有问题的地方已在主函数中注释,其他的函数都是哈夫曼树的基本算法。
困扰许久求大佬解决!