查找字符串中每个单词的个数出现的次数

查找字符串中每个单词的个数出现的次数 看到题目的第一感觉给人时比较复杂
涉及到的子算法比较多 ,写这个算法的木的是给大家看看 我们现在学到算法可能就是以后一些复杂功能的一小部分

我们先把这个算法的大概了解一下
1:我们首先统计出 该字符串单词的个数
2:统计了单词的个数 保存再链表里(每个节点保存一个单词)
3:再删除重复的单词 在计数 就可以得出每个单词出现的次数 然后打印出来
删除的时候两个单词我们得自己写一个函数strcmp这个函数不可用 相同单词应该不区分大小写的(这里只用c 自己写算法具体过程 而不向用完全面向对象的语言调用函数)
我们必须每统计出一个单词 就创建一个节点 并把这个单词保存再创建节点的数据域 里
我们 怎么判定一个单词?
1:连续的两个空格不相邻的空格之间有一个单词
2:如果字符串第一个位置为字符(非空格)则 有一个特殊情况
3: 如果字符串最后一个位置为非空格 就还有一个特殊情况
把这些都考虑到了 写出来的算法才是没有问题的 如果实现有问题可以看看我写的删除重复元素博客 ,统计单词数量博客
希望可以给大家带来帮助
设计到的知识点有链表 字符串操作 知识点比较广 对自己提升也是大
大家也可以优化下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
char a[256];
char length;
struct node *next;
}*List,list;
int count=0;
int m=0;
List p=NULL;
int CreatList(){ //创建一个节点 尾插法
List r=p;
while(r->next){
r=r->next;
}
List s=(List)malloc(sizeof(list));
s->next=NULL;
s->length=1;
memset(s->a,0,256);
r->next=s;
}
int fun(char a[],int s,int n){ //单词个数每增加一个就调用 该函数
int i=s;
int j=n;
List r=p;
int x=1,y=0;
int t=0;
if(count>1){
CreatList();//创建一个节点
}
while(x<count){
x++;
r=r->next;
}
while(i<j){
t++;
r->a[y++]=a[i];//将这个单词保存刚创建节点里
printf("%c",a[i++]);
}

r->a[y]=0;
printf("\t\t字节数为%d\n",t);
}
int conut(char s[]){ //统计单词的个数 单词个数每增加1 就调用fun函数 i=0,k=0,x=0,y=0,n=0;
while(s[i]!=0){
y=i;//
if(s[i] == ’ '){//若连续存储
if(k>0){
count++;
x=i;
}
k=0;
if(y == x){ //遇到空格
(n == 0)?((s[0] == ’ ')?(fun(s,n+1,y)):(fun(s,n,y))):(fun(s,n+1,y));
x=i;
}
n=i;//保存上一个单词第一个字符的前一个位置
}
else{
k++;
}
i++;
}
if(k>0){
if(count == 0){
count++;
(s[0] == ’ ')?(fun(s,n+1,y)):(fun(s,n,y));
}
else{
count++;
fun(s,n+1,y+1);
}
//count++; 产生错误导致倒数第二个节点消失
}
printf(“单词个数为%d个:\n”,count);
}
List initList(){
List s=(List)malloc(sizeof(list));
s->next=NULL;
s->length=1;
memset(s->a,0,256);
return s;
}
int print(){
List r=p;
while(r ){
printf(“单词的个数为:%d %s \n”,r->length,r->a);
r=r->next;
}
}
int strcp(char s[],char p[]){
int i=0,j=0;
while(s[i]!=0&&p[j]!=0)
{
if(i==j&&((s[i]==p[j]||(s[i]==p[j]-32)&&s[i]>=‘A’&&s[i]<=‘Z’
||‘a’<=s[i]&&s[i]<=‘z’&&s[i]==p[j]+32)));//判定大小写
else{
return -1;
break;
}
i++;
j++;
}
if(s[i]==0&&p[j]==0){//是否长度相等 而都结束
return 0;
}
else{
return -1;
}
}
int deletrepeat(){ //删除重复元素
List r=p;
while(r->next){
List L=r;//删除节点的前一节点
List s=r->next;

while(s){
if(strcp(r->a,s->a)==0){ //strcmp(r->a,s->a)
if(r ==L){
L->next=s->next;
}else{
L->next=s->next;
}
r->length++;
free(s);//
s=L->next;
}
else{
s=s->next;
L=L->next;
}
}
r=r->next;
}
}
int main(){
p=initList();
char a[1000];
printf(“请输入英文序列:”);
gets(a);
conut(a);
deletrepeat();
print();
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值