统计各字母在文本中出现的次数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct word{
char word[200];
int num;
struct Sword * next;
};
typedef struct word Word;
void add(Word * Head,char str[]);
void show(Word * Head);
int main()
{
FILE * fp;
char filename [] ="D:\\test\\678.txt";//打开读的文件位置 自定义
char str[200]; //暂存一个单词的数组
Word * Head;
Head = (Word *)malloc(sizeof(Word)); //头指针
memset(Head,0,sizeof(Word));
if((fp = fopen(filename,"r"))==NULL){ //读 初始化
printf("Can not open file");
exit(0);
}
while(fscanf(fp,"%s",str) != EOF){ //读文件
add(Head,str); //添加到链表
}
fclose(fp); //关闭读
show(Head);
return 0;
}
void add(Word * Head,char str[]){
Word * tw;
Word * p = Head;
while(1){
if(strcmp(p->word,str)==0){ //判断是否和当前单词相同
p->num++; //相同此单词个数++
return;
}else{ //不同 遍历下个元素 看是否后后面的元素相同
if(p->next != NULL){
p = p->next;
}else{ //与链表上所有的都不同 新建一个节点
tw = (Word *)malloc(sizeof(Word));//动态分配内存空间
memset(tw,0,sizeof(Word));
sprintf(tw->word,"%s",str);//将单词 保存
tw->num++; //单词数++
p->next = tw; //p的下一个节点为tw 就是连到链表上
return;
}
}
}
}
void show(Word * Head){
Word *pn=Head;
while(pn!=NULL)//条件为当前节点,遍历时主要显示当前节点
{ pn=pn->next;
printf("%s:%d\n",pn->word,pn->num);
}
}