文本文件单词统计

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

#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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值