#include "stdio.h" #include "malloc.h" #include "string.h" /** * 因为扫描的过程需要往线性表中增加数据,所以使用单链表的形式,减少移动 * * 注意下面三个*********************************************中的内容 * 都是容易出错的地方! */ //统计字符串中单词个数及每个单词出现次数 typedef struct WordsNode{ int time; char s[20];//单词,最长长度为20 WordsNode *next; }WList; //将单词插入到带头节点的递增顺序排列的单链表中 WList *function(char word[],WList *list){ WordsNode *p=list->next,*pre=list;; while(p&&strcmp(p->s,word)<0){ pre=p; p=p->next; } if(p==NULL || strcmp(p->s,word)){ WordsNode *node=(WList *)malloc(sizeof (WordsNode)); node->time=1; strcpy(node->s,word);//***********字符串不能直接赋值,需要拷贝或者手动遍历赋值!!!*************** node->next=pre->next; pre->next=node; }else if(strcmp(p->s,word)==0){ p->time=p->time+1; } return list; } //扫面文章字符串,生成递增的单链表 WList *create(char *text){ WList *list=(WList *)malloc(sizeof (WordsNode));//头结点 list->next=0; int i=0,j=0; char c=text[i]; char word[20]; while(c!='\0'){ if((c>='A'&&c<='Z') || c>='a'&&c<='z'){ word[j]=c; j++; }else{ if(j>0){ word[j]='\0';//******************字符结束标志!!!************************ list=function(word,list); j=0; } } i++;//***************************不要忘记递增!!!最好循环开始的时候就写好********************************* c=text[i]; } return list; } void print(WList *list){ WordsNode *p=list->next; while(p) { printf("%10s :%10d次\n",p->s,p->time); p=p->next; } } int main(){ char s[300]="If the public can be well educated to enhance their awareness over the benefits of promoting Chinese culture | preserving the living circumstance | promoting the phenomenon mentioned, it would be much better."; WList *list=create(s); print(list); }
使用单链表统计英文文本单词个数
最新推荐文章于 2024-04-05 19:49:21 发布