感謝 @guaiguaitinghua 的歸併鍊錶排序
思路:構建鏈式雜湊表,再組合成按詞頻逆序、字典序順序排列的鍊錶
主要的幾個問題:
資料結構的構建(鏈式雜湊表)
讀入單詞並忽略大小寫(統一轉換成小寫)
鍊錶排序,如果詞頻一樣比較字典序
#include
#include
#include
#include
#include
#define percent 10
#define maxtablesize 200
#define tablesize 100
#define wordlen 15
typedef
char
*elementtype;
typedef
struct lnode *ptrtolnode;
struct lnode
;typedef ptrtolnode position;
struct hnode
;typedef
struct hnode *hashtable;
intnextprime
(int n)}if
(i ==2)
else
}return p;
}int
hash
(const
char
*key,
int tablesize)
return h % tablesize;
}char
tolowercase
(char c)
bool iswordcharacter
(char c)
bool isupper
(char c)
bool getword
(elementtype str, elementtype word,
int*start)
word[len++
]= c;
}else
}else
if(len)}}
*start = i;
word[len]
='\0'
;return flag;
}bool compare
(elementtype a, elementtype b)if(
*a &&
*b)return
*a ? false : true;
} hashtable createtable()
return h;
}position find
(hashtable h, elementtype key)
return p;
}void
insert
(hashtable h, elementtype key)
else
}void
destroytable
(ptrtolnode head)
}ptrtolnode merge
(ptrtolnode p1, ptrtolnode p2)
else
if(p1->count < p2->count)
else
else
} p = p->next;}if
(p1)
if(p2)
return head->next;
}ptrtolnode sort
(ptrtolnode head)
slow = fast = pre = head;
while
(fast && fast->next)
pre->next =
null
;return
merge
(sort
(head)
,sort
(slow));
}void
print
(hashtable h)
}printf
("%d\n"
, h->head[h->size]
->count)
; head->next =
sort
(head->next)
; p2 = head->next;
while
(size--
&& p2)
destroytable
(head);}
intmain()
}}}print
(h);
//fclose(stdin);
return0;
}
習題5 13 詞頻統計 30分
請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入給出一段非空文字,最後以符號 ...
PTA 詞頻統計
請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入給出一段非空文字,最後以符號 ...
詞頻統計(上機)
include include include define error 1 define ok 0 const int word length 250 定義單個單詞最大長度 typedef int status 定義儲存單詞及其出現次數的結構體 typedef struct nodewordnod...