【C語言程式設計】統計一個句子中各個單詞出現的次數
阿新 • • 發佈:2020-12-08
【C語言程式設計】統計一個句子中各個單詞出現的次數
文章目錄
題目
編一程式,它讀入一個句子,統計在句子中出現的各個單詞出現的次數,並將結果輸出。
例如:
如果輸入的一個句子為how do you do.
則輸出結果為:
[how]=>1
[do]=>2
[you]=>1
程式碼部分
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
//利用連結串列的方式儲存每個單詞和出現的次數。
#define MaxSize 81
typedef struct LNode{
char data[81];//data儲存單詞
int count;//count儲存次數
struct LNode *next;//next指向下一個結構體
}LNode, *LinkList;
void insert(LinkList L,char *word);
struct LNode* check(LinkList L, char *word);
void reverse_L(LinkList L) ;
int main()
{
//頭節點HL
struct LNode HL = {"0",0,NULL};
//指標L指向頭節點,L用於之後對連結串列的操作
LinkList L = &HL;
//flag用於獲得返回的重複出現單詞結構體的地址以方便修改count出現次數
LinkList flag = NULL;
//ch用於獲得每次從鍵盤輸入的字元
char ch;
//i用於陣列儲存
int i = 0;
//word陣列用於儲存每次獲得的單詞
char word[MaxSize];
//while迴圈實現“插入”新單詞,或者讓舊單詞的count+1
while((ch = getchar())!='\n'){
if(ch == ','){
continue;
}
else if(ch==' '||ch=='.'){
word[i++] = '\0';
//如果出現過該單詞flag為該單詞結構體的地址
//否則返回NULL
flag = check(L,word);
if(!flag){
//沒有出現過這個單詞,在連結串列中插入新單詞
insert(L,word);
}
else{
//出現過這個單詞,count+1
flag->count++;
}
//重新獲得單詞,i置為0,flag置為NULL
i = 0;
flag = NULL;
}
else if((ch>='a' && ch<='z')||(ch >= 'A' && ch<='Z' )){
//把字母拼接成單詞
word[i++] = ch;
}
}
reverse_L(L);
return 0;
}
//連結串列的插入操作,建議選用頭插法,這裡用了尾插法
void insert(LinkList L,char *word){
LNode *insert_p = L;
LNode *p = (LNode*)malloc(sizeof(struct LNode));
p->next = NULL;
p->count = 1;
strcpy(p->data,word);
for(;insert_p->next;insert_p = insert_p->next);
insert_p->next = p;
return;
}
//check為flag提供該單詞結構體的陣列,沒有則返回NULL
struct LNode* check(LinkList L, char *word){
LNode *p = L->next;
while(p){
if(!strcmp(word,p->data)){
return p;
}
else{
p = p->next;
}
}
return NULL;
}
//遍歷單鏈表,列印單詞和次數
void reverse_L(LinkList L){
LNode *p = L->next;
while(p){
printf("[%s]==>%d \n", p->data,p->count);
p = p->next;
}
return;
}
執行結果
補充和總結
本題利用連結串列,可以減少對陣列進行操作,可以降低程式的時間複雜。同時,程式碼中還存在這一些缺陷,比如如果末尾沒有句號的時候會無法判斷最後一個單詞是否出現,希望讀者在使用的時候加以改進。
如果有更好的方法歡迎討論~