C语言——从字符串中统计单词的频数

C语言——从字符串中统计单词的频数

#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef struct node{
	char word[20];
	int count;
	struct node* next;
}node;
typedef node* LinkList;

LinkList InitList();
void GetWord(char *s,LinkList head);
void WordToLinkList(LinkList head,char* s);
void PrintList(LinkList head);

int main(){
	char str[10000]={'\0'};
	char temp[1000];
	char path[] = "number.in";
	FILE* in = fopen(path,"r");
	if(!in){
		printf("File can't be opened!\n");
		exit(0);
	}
	while(fgets(temp,sizeof(temp),in)!=NULL){
		if(temp[strlen(temp)-1] == '\n')  //去掉每一行末尾的换行符
			temp[strlen(temp)-1] = '\0';
		strcat(str,temp);  //将所有行的字符合并到一行
	}
	LinkList head = InitList();  //初始化链表
	GetWord(str,head);  //获取单词并添加到链表中
	PrintList(head);
	fclose(in);
	system("pause");
	return 0;
}

LinkList InitList(){  //初始化链表,获得头结点
	LinkList head = (LinkList)malloc(sizeof(node));
	head->word[0] = '\0';
	head->next = NULL;
	return head;
}

void GetWord(char *s,LinkList head){
	char *p;
	char delim[] = " ,.";  //分隔符
	p = strtok(s,delim);  //将字符串按照分隔符进行分隔
	//strtok函数只是将分隔符都设置为'\0',并没有生成多个字符串,采用
	while(p!=NULL){
		WordToLinkList(head,p);  //将每一个单词传进链表中,生成结点
		p = strtok(NULL,delim);  //p继续指向下一个字符串开头
	}
}

void WordToLinkList(LinkList head,char* s){
	LinkList q = head->next;
	int isExit = 0;
	while(q){
		if(strcmp(q->word,s)==0){  //存在结点,计数值+1
			q->count++;
			isExit = 1;
			break;
		}
		q = q->next;
	}
	if(!isExit){  //不存在则创建结点
		LinkList temp = (LinkList)malloc(sizeof(node));
		strcpy(temp->word,s);
		temp->count=1;
		temp->next = head->next;
		head->next = temp;
	}
}


void PrintList(LinkList head){  //输出链表中各结点的值
	LinkList p = head->next;
	while(p!=NULL){
		printf("%s:%d\n",p->word,p->count);
		p = p->next;
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值