解决编程过程中遇到的问题(1)——数据冗余,有意者请进...
目标:
1、总:利用赫夫曼编码对输入文字加密(输入-〉存储-〉统计频率作权-〉编码-〉替换-〉输出);
2、分:本人现停留于统计部分,实现统计输入串中字符的出现次数(作权值,备用以构造赫树与编码),输出之。
思想:
串存储采用线性顺序表L,数组w[1000]存储权重(次数)。
问题:
在Counting函数执行统计的过程中,默认了每个读入的字符皆不相等。例如:输入‘Then what?&’(&为结束符),则权值数组中:w[1]=w[6]=2.这对于之后利用该数组寻找权值最小的两个节点来造赫夫曼树是有害的。应当如何改进算法来消除它?
源代码:
#include <stdio.h>
#include <stdlib.h>
#define Init_Size 1000
typedef struct{
char *Elem;
int len;
} Sqlist;
Initlist(Sqlist *L)
{ L-> Elem=(char *)malloc(sizeof(char)*Init_Size);
if(L-> Elem)
L-> len=0;
else printf( "ERROR!\n ");
printf( "\nInitializing... Success!\n ");
}
ReadIn(Sqlist *L)
{ int i=0;
do
scanf( "%c ",&L-> Elem[i++]);
while((L-> Elem[i-1])!= '& ');
L-> len=i;
printf( "\nREAD IN SUCCESS!\n ");
}
Counting(Sqlist *L,char w[1000])
{ int count,i,j;
for(i=0;i <(L-> len);i++)
{ count=0;
for(j=0;j <(L-> len);j++)
if(L-> Elem[i]==L-> Elem[j]) count++;
w[i]=count;
printf( "w[%d]=%d ", i,w[i]);
if((i%6==0)&&(i> 5)) printf( "\n ");
}
}
main()
{ Sqlist *L;
char w[1000];
Initlist(L);
ReadIn(L);
Counting(L,w[1000]);
}
[解决办法]
Counting(Sqlist *L,char w[1000])
{ int count,i,j;
for(i=0;i <(L-> len);i++)
{
count=1;
for(j=i+1;j <(L-> len);j++){
if(L-> Elem[i]==L-> Elem[j])
count++;
else if(count> 1)
L-> Elem[j-count+1] = L-> Elem[j];/*每个元素前移count-1*/
}
L-> len -= count-1;
w[i]=count;
printf( "w[%d]=%d ", i,w[i]);
if((i%6==0)&&(i> 5)) printf( "\n ");
}
}
不是看得很明白,不知楼主是不是这个意思