首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

詞頻統計小程序:鏈表存儲 + 自定義排序輸出 Top 10

     編輯:C++ 入門

需求分析

讀取英文文本文件,統計單詞出現頻率(不區分大小寫,忽略標點),輸出前 10 高頻詞。

數據結構設計

  • **鏈表節點**:string word; int count; Node* next; — 動態增長,無容量上限。
  • **單詞識別**:逐字符讀取,isalpha 判斷屬於單詞,非字母作為分隔符。統一轉小寫。

核心流程

  1. 打開文件,逐字符讀入構建單詞。
  2. 遍歷鏈表查找是否已存在:
     存在 → count++;
     不存在 → 表頭插入新節點 count=1。
  3. 文件讀完後,對鏈表按 count 降序排序(插入排序或轉 vector 再 sort)。
  4. 輸出前 10 節點 word count。

關鍵代碼片段

struct Node {
    string word; int count; Node* next;
    Node(string w):word(w),count(1),next(nullptr){}
};

Node* head = nullptr;
string token;
char ch;
while(in.get(ch)){
    if(isalpha(ch)) token += tolower(ch);
    else if(!token.empty()){
        // 查找或插入
        Node *p=head, *prev=nullptr;
        for(; p; prev=p, p=p->next)
            if(p->word == token){ p->count++; break; }
        if(!p){
            Node* nn = new Node(token);
            nn->next = head; head = nn;
        }
        token.clear();
    }
}
// 文件結尾可能剩餘 token
if(!token.empty()){ /* 同上 */ }

// 排序:轉 vector 便於 std::sort
vector vec;
for(Node* p=head; p; p=p->next) vec.push_back(p);
sort(vec.begin(), vec.end(),
    [](Node* a, Node* b){ return a->count > b->count; });

for(int i=0;iword<<' '<count<<'\n';

// 釋放內存
for(Node* p=head; p;){ Node* t=p->next; delete p; p=t; }

改進方向

  • 用 unordered_map 替代鏈表,查找 O(1),代碼更簡潔。
  • 更完善的分詞:處理縮寫、連字符、Unicode。
  • 大文件流式處理 + 外部排序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved