1. 程式人生 > 其它 >【C語言程式設計】統計一個句子中各個單詞出現的次數

【C語言程式設計】統計一個句子中各個單詞出現的次數

技術標籤:程式設計連結串列c語言指標

【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; }

執行結果

執行結果

補充和總結

本題利用連結串列,可以減少對陣列進行操作,可以降低程式的時間複雜。同時,程式碼中還存在這一些缺陷,比如如果末尾沒有句號的時候會無法判斷最後一個單詞是否出現,希望讀者在使用的時候加以改進。
如果有更好的方法歡迎討論~