#include "stdio.h"
#include "string.h"
#include <malloc.h>
typedef struct _link // 定义该链表是为了存储不重复出现的单词
{
char* ch;
int num;
_link* next;
}link;
int main(int argc, char* argv[])
{
// 读入一个txt.文件操作
FILE *fp;
fp = fopen("text1.txt","r");
if(fp==NULL)
{
printf("找不到文件");
return 0;
}
char word[30];
int pos = 0; // 亦可用 size_t类型
char c;
link *head, *pnow, *ptmp,*pt,*pw;
head = pnow = ptmp = pt=pw=NULL;
while (!feof(fp))
{
c = fgetc(fp); //逐个获取的字符
if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c=='\''))
word[pos++]=c;
else if (pos>0)
{
word[pos] = '\0';
// 链表遍历,比较链表中的节点值与当前单词
ptmp = head;
while (ptmp)
{
if (strcmp(word, ptmp->ch)==0)
{
ptmp->num++;
break;
}
ptmp = ptmp->next;
}
// 如果链表中没有当前单词,在链表末尾插入节点
if (ptmp == NULL)
{
ptmp = (link*)malloc(sizeof(link)); //注意一下两行的用法
ptmp->ch = (char*)malloc(pos);
strcpy(ptmp->ch, word);
ptmp->num=1;
ptmp->next = NULL;
if (pnow) // 插入当前节点为末节点
{
pnow->next = ptmp;
pnow = ptmp;
}
else // 此处为第一次出现单词的时候
head = pnow = ptmp;
}
pos=0;
}
}
fclose(fp); // 对文件进行操作,关闭文件
pt=ptmp=head;
pw=head->next;
head->next=NULL;
while(pw)
{
while(ptmp->num>pw->num&&ptmp!=NULL)
{
pt=ptmp;
ptmp=ptmp->next;
}
pnow=pw->next;
pw->next=ptmp;
pt->next=pw;
pw=pnow;
}
// 读取链表,输出单词及其出现的个数
ptmp = head;
for(int i=0;i<10;i++)
{
printf("%s\t%d\n", ptmp->ch, ptmp->num);
ptmp = ptmp->next;
}
return 0;
}
这个问题要解决单词的识别和次数统计,按照频率的大小排序然后输出。要注意的是在一篇文章中字母肯定存在大小写的不同,一开始我打算是先将文章中的所有字母转换成小写再去统计,后来我又想跳过这一步,将大小写不同的同一个单词按照不同的单词处理,其实大体上的思想大家应该差不多。欢迎大家来找这个程序的缺陷,共同进步!