最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì)

 更新時(shí)間:2020年03月16日 10:28:20   作者:-天凌-  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

這幾天寫(xiě)了一個(gè)基于C語(yǔ)言對(duì)文本詞頻進(jìn)行統(tǒng)計(jì)的程序,開(kāi)發(fā)及調(diào)試環(huán)境:mac集成開(kāi)發(fā)環(huán)境Xcode;測(cè)試文本,馬丁.路德金的《I have a dream》原文演講稿。

主要運(yùn)行步驟:

1. 打開(kāi)文本把文本內(nèi)容讀入流中并且開(kāi)辟相應(yīng)空間放入內(nèi)存
2 .對(duì)文本內(nèi)容進(jìn)行處理,去除大寫(xiě)字母(轉(zhuǎn)化為小寫(xiě)),去除特殊字符
3. 基于單鏈表對(duì)詞頻進(jìn)行統(tǒng)計(jì)
4. 把統(tǒng)計(jì)結(jié)果進(jìn)行歸并排序
5.打印輸出全部詞頻或者頻率最高的10個(gè)單詞和其出現(xiàn)次數(shù)
6.釋放所有結(jié)點(diǎn)消耗的內(nèi)存

廢話(huà)不多說(shuō),上代碼!

//
// main.c
// word_frequency_statistic
//
// Created by tianling on 14-3-16.
// Copyright (c) 2014年 tianling. All rights reserved.
// 實(shí)現(xiàn)英文文本的詞頻統(tǒng)計(jì)
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERROR 1
#define OK 0
const int WORD_LENGTH = 250;//定義單個(gè)單詞最大長(zhǎng)度
typedef int status;


/*
 **定義存儲(chǔ)單詞及其出現(xiàn)次數(shù)的結(jié)構(gòu)體
 */
typedef struct Node{
 char word[WORD_LENGTH];
 int time;
 struct Node *next;
}wordNode;

wordNode *headNode = NULL;//定義鏈表頭指針

/*
 **函數(shù)聲明
 */
wordNode *wordSearch(char *word,int *num);
status wordCount(char *word,int *num);
void printCountList(int *num);
void PrintFirstTenTimes();
void mergeSort(wordNode **head);
void FrontBackSplit(wordNode *head,wordNode **pre,wordNode **next);
void wordJob(char word[]);
wordNode *SortedMerge(wordNode *pre,wordNode *next);
void release();

status main(int argc,char *argv[])
{
 char temp[WORD_LENGTH];//定義用以臨時(shí)存放單詞的數(shù)組
 FILE *file;
 int count,articleWordNum = 0;//定義統(tǒng)計(jì)結(jié)點(diǎn)個(gè)數(shù)的變量
 int *num = &articleWordNum,choose;
 
 /*
  **讀取文件
  */
 if((file = fopen("/Users/tianling/Documents/Data_Structure/word_frequency_statistic/word_frequency_statistic/article.txt", "r")) == NULL){
  //這里是絕對(duì)路徑,基于XCode編譯器查找方便的需求
  printf("文件讀取失敗!");
  exit(1);
 }
 
 while((fscanf(file,"%s",temp))!= EOF){
  wordJob(temp);
  count = wordCount(temp,num);
 }
 
 fclose(file);//關(guān)閉文件
 
 printCountList(num);
 
 printf("***********請(qǐng)選擇***********\n");
 printf("*****1. 輸出詞頻最高的10個(gè)詞**\n");
 printf("*****2. 退出****************\n");
 
 scanf("%d",&choose);
 if(choose == 1){
  mergeSort(&headNode);
  PrintFirstTenTimes();

 }else{
  release();
  exit(0);
 }
 
 release();
 return 0;
 
 
}

/*
 **查找單詞所在結(jié)點(diǎn)
 */
wordNode *wordSearch(char *word,int *num){
 wordNode *node;//聲明一個(gè)新結(jié)點(diǎn)
 
 if(headNode == NULL){//若頭結(jié)點(diǎn)為空
  node = (wordNode*)malloc(sizeof(wordNode));
  strcpy(node->word, word);//將第一個(gè)單詞賦值給這個(gè)新結(jié)點(diǎn)
  node->time = 0;//初始化該單詞的出現(xiàn)次數(shù)
  *num+=1;
  headNode = node;//將頭結(jié)點(diǎn)指向這個(gè)新結(jié)點(diǎn)
  return node;
  
 }
 
 wordNode *nextNode = headNode;
 wordNode *preNode = NULL;
 
 while(nextNode != NULL && strcmp(nextNode->word, word) != 0){
  preNode = nextNode;
  nextNode = nextNode->next;
 }
 
 //若該單詞不存在,則在鏈表中生成新結(jié)點(diǎn)
 if(nextNode == NULL){
  node = (wordNode*)malloc(sizeof(wordNode));
  strcpy(node->word, word);
  node->time = 0;
  node->next = headNode->next;
  headNode->next = node;
  *num+=1;
  
  return node;
 }else
  return nextNode;
 
}


/*
 **詞頻統(tǒng)計(jì)
 */
status wordCount(char *word,int *num){
 wordNode *tmpNode = NULL;
 tmpNode = wordSearch(word,num);
 
 if(tmpNode == NULL){
  return ERROR;
 }
 
 tmpNode->time++;
 
 return 0;
}


/*
 **打印所有詞頻
 */
void printCountList(int *num){
 if(headNode == NULL){
  printf("該文件無(wú)內(nèi)容!");
  
 }else{
  wordNode *preNode = headNode;
  printf("總詞量 %d \n",*num);
  
  while(preNode != NULL){
   printf("%s 出現(xiàn)次數(shù) %d\n",preNode->word,preNode->time);
   preNode = preNode->next;
  }
 }
 
}


/*
 **打印詞頻最高的10個(gè)詞
 */
void PrintFirstTenTimes(){
 if(headNode == NULL){
  printf("該文件無(wú)內(nèi)容!");
  
 }else{
  wordNode *preNode = headNode;
  int i = 0;
  printf("出現(xiàn)次數(shù)最多的10個(gè)詞如下: \n");
  
  while (preNode != NULL && i<=10) {
   printf("%s 出現(xiàn)次數(shù) %d\n",preNode->word,preNode->time);
   preNode = preNode->next;
   i++;

  }
 }
}


/*
 **對(duì)詞頻統(tǒng)計(jì)結(jié)果進(jìn)行歸并排序
 */
void mergeSort(wordNode **headnode){
 wordNode *pre,*next,*head;
 head = *headnode;
 
 //若鏈表長(zhǎng)度為0或1則停止排序
 if(head == NULL || head->next == NULL){
  return;
 }
 
 FrontBackSplit(head,&pre,&next);
 
 mergeSort(&pre);
 mergeSort(&next);
 
 *headnode = SortedMerge(pre,next);
 
}


/*
 **將鏈表進(jìn)行分組
 */
void FrontBackSplit(wordNode *source,wordNode **pre,wordNode **next){
 wordNode *fast;
 wordNode *slow;
 
 if(source == NULL || source->next == NULL){
  *pre = source;
  *next = NULL;
 }else{
  slow = source;
  fast = source->next;
  
  while(fast != NULL){
   fast = fast->next;
   
   if(fast != NULL){
    slow = slow->next;
    fast = fast->next;
   }
  }
  *pre = source;
  *next = slow->next;
  slow->next = NULL;
 }
}


/*
 **根據(jù)排序結(jié)果更換頭結(jié)點(diǎn)
 */
wordNode *SortedMerge(wordNode *pre,wordNode *next){
 wordNode *result = NULL;
 
 if(pre == NULL)
  return next;
 else if(next == NULL)
  return pre;
 
 if(pre->time >= next->time){
  result = pre;
  result->next = SortedMerge(pre->next,next);
  
 }else{
  result = next;
  result->next = SortedMerge(pre,next->next);
 }
 return result;
}


/*
 **處理大寫(xiě)字母及特殊字符
 */
void wordJob(char word[]){
 int i,k;
 char *specialChar = ",.;:'?!><+=|*&^%$#@\"";//定義特殊字符集
 
 for(i = 0;i<strlen(word);i++){
  //篩選并將字符串中的大寫(xiě)字母轉(zhuǎn)化為小寫(xiě)字母
  if(word[i]>='A'&& word[i]<='Z'){
   word[i] += 32;
  }
  //篩選并去除字符串中的特殊字符
  for(k = 0;k<strlen(specialChar);k++){
   
   if(word[i] == specialChar[k]){
    
    while(i<strlen(word)){
     word[i] = word[i+1];
     i++;
    }
    
   }
  }
 }
 
}


/*
 **釋放所有結(jié)點(diǎn)內(nèi)存
 */
void release(){
 if(headNode == NULL)
  return;
 
 wordNode *pre = headNode;
 while(pre != NULL){
  headNode = pre->next;
  free(pre);
  pre = headNode;
  
 }
}

調(diào)試結(jié)果:(Xcode環(huán)境)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言三子棋小游戲的實(shí)現(xiàn)

    C語(yǔ)言三子棋小游戲的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言三子棋小游戲的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語(yǔ)言順序表實(shí)現(xiàn)代碼排錯(cuò)

    C語(yǔ)言順序表實(shí)現(xiàn)代碼排錯(cuò)

    這篇文章主要介紹了C語(yǔ)言順序表實(shí)現(xiàn)方法,大家參考使用吧
    2013-12-12
  • 手把手帶你了解C++最小棧

    手把手帶你了解C++最小棧

    這篇文章主要介紹了C++的最小棧,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • c語(yǔ)言如何實(shí)現(xiàn)DES加密解密

    c語(yǔ)言如何實(shí)現(xiàn)DES加密解密

    這篇文章主要介紹了c語(yǔ)言如何實(shí)現(xiàn)DES加密解密問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • C++實(shí)現(xiàn)順序排序算法簡(jiǎn)單示例代碼

    C++實(shí)現(xiàn)順序排序算法簡(jiǎn)單示例代碼

    這篇文章主要介紹了C++實(shí)現(xiàn)順序排序算法簡(jiǎn)單示例代碼,對(duì)于學(xué)過(guò)C++的朋友一定不會(huì)陌生,現(xiàn)在重溫一下這個(gè)算法,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言新建臨時(shí)文件和臨時(shí)文件名的方法

    C語(yǔ)言新建臨時(shí)文件和臨時(shí)文件名的方法

    這篇文章主要介紹了C語(yǔ)言新建臨時(shí)文件和臨時(shí)文件名的方法,分別是mkstemp()函數(shù)和mktemp()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++深入講解函數(shù)重載

    C++深入講解函數(shù)重載

    C++ 允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途
    2022-07-07
  • 一個(gè)string類(lèi)的簡(jiǎn)單實(shí)現(xiàn)案例

    一個(gè)string類(lèi)的簡(jiǎn)單實(shí)現(xiàn)案例

    下面小編就為大家?guī)?lái)一篇一個(gè)string類(lèi)的簡(jiǎn)單實(shí)現(xiàn)案例。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 基于Qt實(shí)現(xiàn)日志打印系統(tǒng)

    基于Qt實(shí)現(xiàn)日志打印系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt開(kāi)發(fā)一個(gè)日志打印系統(tǒng),可以實(shí)現(xiàn)打印日志按日期、大小保存,過(guò)期刪除,窗口實(shí)時(shí)顯示日志,網(wǎng)絡(luò)傳輸日志遠(yuǎn)程調(diào)試,需要的可以參考下
    2023-12-12
  • C++ Boost Container庫(kù)示例詳細(xì)講解

    C++ Boost Container庫(kù)示例詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-11-11

最新評(píng)論

循化| 锡林浩特市| 潼南县| 沁源县| 镇江市| 湄潭县| 高州市| 静海县| 丹凤县| 临漳县| 读书| 南通市| 武川县| 米易县| 赤水市| 安岳县| 邛崃市| 行唐县| 绩溪县| 会理县| 五家渠市| 桦甸市| 邛崃市| 宕昌县| 古浪县| 胶州市| 乌鲁木齐县| 砚山县| 上虞市| 大英县| 台东市| 夏河县| 漾濞| 临猗县| 内丘县| 利津县| 七台河市| 江达县| 延川县| 青岛市| 三明市|