首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

解决编程过程中遇到的有关问题(1)——数据冗余,有意者请进.

2012-03-30 
解决编程过程中遇到的问题(1)——数据冗余,有意者请进...目标:1、总:利用赫夫曼编码对输入文字加密(输入-〉存

解决编程过程中遇到的问题(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 ");
}
}

不是看得很明白,不知楼主是不是这个意思

热点排行