VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 712|回复: 1

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

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-4 12:40:01 | 显示全部楼层 |阅读模式
目标:
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]);
}
回复

使用道具 举报

0

主题

22

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-1-8 14:45:01 | 显示全部楼层
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");
  }
}

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表