zoukankan      html  css  js  c++  java
  • 输出文章中几个最高频率单词和次数

    #include "stdio.h"
    #include "string.h" 
    #include <malloc.h> 
     
    typedef struct _link        // 定义该链表是为了存储不重复出现的单词 

        char* ch; 
        int num; 
        _link* next; 
    }link; 
     
    int main(int argc, char* argv[]) 
    {
        // 读入一个txt.文件操作 
        FILE *fp; 
        fp = fopen("text1.txt","r");
     if(fp==NULL)
     {
      printf("找不到文件");
      return 0;
        }
     char word[30]; 
        int pos = 0;        // 亦可用 size_t类型 
        char c; 
        link *head, *pnow, *ptmp,*pt,*pw; 
        head = pnow = ptmp = pt=pw=NULL; 
     
        while (!feof(fp)) 
        { 
            c = fgetc(fp);      //逐个获取的字符 
            if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c=='\'')) 
                word[pos++]=c; 
            else if (pos>0) 
            { 
                word[pos] = '\0'; 
                // 链表遍历,比较链表中的节点值与当前单词 
                ptmp = head; 
                while (ptmp) 
                { 
                    if (strcmp(word, ptmp->ch)==0) 
                    { 
                        ptmp->num++; 
                        break; 
                    } 
                    ptmp = ptmp->next; 
                } 
                // 如果链表中没有当前单词,在链表末尾插入节点 
                if (ptmp == NULL) 
                { 
                    ptmp = (link*)malloc(sizeof(link)); //注意一下两行的用法 
                    ptmp->ch = (char*)malloc(pos); 
                    strcpy(ptmp->ch, word); 
                    ptmp->num=1; 
                    ptmp->next = NULL; 
                    if (pnow)   // 插入当前节点为末节点 
                    { 
                        pnow->next = ptmp; 
                        pnow = ptmp; 
                    } 
                    else        // 此处为第一次出现单词的时候 
                        head = pnow = ptmp; 
                } 
                pos=0; 
            } 
        } 
        fclose(fp); // 对文件进行操作,关闭文件
     pt=ptmp=head;
     pw=head->next;
     head->next=NULL;
     while(pw)
     {
      while(ptmp->num>pw->num&&ptmp!=NULL)
      {
       pt=ptmp;
       ptmp=ptmp->next;
      }
       pnow=pw->next;
       pw->next=ptmp;
       pt->next=pw;
       pw=pnow;
     }
     
        // 读取链表,输出单词及其出现的个数 
        ptmp = head; 
       
         for(int i=0;i<10;i++) 
        { 
            printf("%s\t%d\n", ptmp->ch, ptmp->num); 
            ptmp = ptmp->next; 
        } 

     
        return 0; 
    }

     这个问题要解决单词的识别和次数统计,按照频率的大小排序然后输出。要注意的是在一篇文章中字母肯定存在大小写的不同,一开始我打算是先将文章中的所有字母转换成小写再去统计,后来我又想跳过这一步,将大小写不同的同一个单词按照不同的单词处理,其实大体上的思想大家应该差不多。欢迎大家来找这个程序的缺陷,共同进步!

  • 相关阅读:
    Red Hat Enterprise Linux 7的新功能
    Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
    Unix/Linux环境C编程入门教程(40) 初识文件操作
    hadoop 1.2.1 安装步骤 伪分布式
    heritrix 3.2.0 -- 环境搭建
    nyoj301递推求值
    nyoj301递推求值
    luogu1962斐波那契数列
    矩阵快速幂模板
    矩阵快速幂模板
  • 原文地址:https://www.cnblogs.com/812969272zheng/p/3577097.html
Copyright © 2011-2022 走看看