#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
char word[21];
int count;
}ElemType;
typedef struct{
ElemType* elem;
int length;
int listsize;
}Sqlist;
void InitList(Sqlist &S)//初始化顺序表
{
S.elem=(ElemType*)malloc((LIST_INIT_SIZE)*sizeof(ElemType));
if(!S.elem){
printf("malloc false\n");
return;
}else{
S.listsize=LIST_INIT_SIZE;
for(int i=0;i<S.listsize;i++){
memset(S.elem[i].word,0,sizeof(S.elem[i].word));
S.elem[i].count=0;
}
S.length=0;
}
}
int LocateElem(Sqlist &S,char *s)//寻找单词
{
bool flag=true;
for(int i=0;i<S.length;i++){
flag=true;
for(int j=0;S.elem[i].word[j]||s[j];j++){
char Selem,selem;//不区分大小写,全部按小写字母处理
Selem=S.elem[i].word[j];
selem=s[j];
if(Selem>='A'&&Selem<='Z')
Selem+=32;
if(selem>='A'&&selem<='Z')
selem+=32;
if(Selem!=selem){//和这个单词不相等,看下一个
flag=false;
break;
}
}
if(flag){//出现过这个单词
S.elem[i].count++;
return 0;
}
}
return S.length+1;
}
void InsertList(Sqlist &S,int i,char *s)//i为单词长度
{
int slength=i;
if(!LocateElem(S,s))//要插入的单词已经出现过
return;
if(S.listsize<=S.length){//空间不足
ElemType *newbase;
newbase=(ElemType*)realloc(S.elem,(LISTINCREMENT)*sizeof(ElemType));
if(!newbase){
printf("malloc LISTINCREMENT false\n");
return;
}
S.elem=newbase;
S.listsize+=(LISTINCREMENT);
}
int p;
bool flag=false;
for(int i=0;i<S.length;){
for(int j=0;S.elem[i].word[j]||s[j];j++){
char Selem,selem;
Selem=S.elem[i].word[j];
selem=s[j];
if(Selem>='A'&&Selem<='Z')
Selem+=32;
if(selem>='A'&&selem<='Z')
selem+=32;
if(selem==Selem)
continue;
else if(selem<=Selem){//比当前的单词小,找到了合适的插入位置
p=i;
flag=true;
break;
}else if(selem>=Selem){//比当前的单词大
i++;
break;
}
}
if(flag)
break;
}
if(flag){//如果找到了合适的插入位置则插入
for(int i=S.length-1;i>=p;i--){
S.elem[i+1]=S.elem[i];
}
memset(S.elem[p].word,0,sizeof(S.elem[p].word));
memcpy(S.elem[p].word,s,slength);
S.elem[p].count=1;
}else{//比当前所有的单词都要大,插入到顺序表的最后一个位置
memset(S.elem[S.length].word,0,sizeof(S.elem[S.length].word));
memcpy(S.elem[S.length].word,s,slength);
S.elem[S.length].count=1;
}
S.length++;
}
void PrintList(Sqlist &S,FILE *fp)//打印结果
{
fprintf(fp,"\n");
int res=0;
for(int i=0;i<S.length;i++){
//cout<<S.elem[i].word<<" "<<S.elem[i].count<<endl;
fprintf(fp,"%s %d\n",S.elem[i].word,S.elem[i].count);
res+=S.elem[i].count;
}
fprintf(fp,"ALL:%d\n",res);
return;
}
int main(void)
{
FILE *fp;
fp=fopen("d:\\History.txt","r");//读文件
Sqlist Q;//单词统计数组Q
InitList(Q);
char c;
char s[21];
memset(s,0,sizeof(s));
int i=0;
int titlecnt=0;
while(fscanf(fp,"%c",&c)){
if(c=='\n'&&titlecnt==1)
break;
else if(c=='\n'){
titlecnt++;
s[i]='\0';
InsertList(Q,i,s);
memset(s,0,sizeof(s));
i=0;
continue;
}
if(!((c>='A'&&c<='Z')||(c>='a'&&c<='z'))&&i){
s[i]='\0';
InsertList(Q,i,s);
memset(s,0,sizeof(s));
i=0;
}else if(!((c>='A'&&c<='Z')||(c>='a'&&c<='z'))){
continue;
}else
s[i++]=c;
}
fp=fopen("d:\\History.txt","a");//写入结果
PrintList(Q,fp);
fclose(fp);
return 0;
}
//2020-5-28 LZH
文本文件单词统计
最新推荐文章于 2021-01-19 04:59:02 发布