(一)二叉树方法:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define maxword 100
typedef struct tnode
{
char ch;
int count;
struct tnode *lchild,*rchild;
}BTree;
void CreaTree(BTree* &p,char c)
{
if(p==NULL)
{
p = (BTree*)malloc(sizeof(BTree));
p->ch = c;
p->count=1;
p->lchild = p->rchild =NULL;
}
else if(c==p->ch)
p->count++;
else if(c<p->ch)
CreaTree(p->lchild,c);
else
CreaTree(p->rchild,c);
}
void InOrder(BTree* &p)
{
if(p!=NULL)
{
InOrder(p->lchild);
printf(" %c(%d)/n",p->ch,p->count);
InOrder(p->rchild);
}
}
void main()
{
BTree* root=NULL;
int i = 0;
char str[maxword];
printf("/n");
printf("输入字符串:");
gets(str);
while(str[i]!=NULL)
{
CreaTree(root,str[i]);
i++;
}
printf("字符出现的次数:/n");
InOrder(root);
printf("/n");
}
(二) 普通方法
1.
====================
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
typedef struct
{
char ch; //字符
int num; //字符个数
}CType;
int Record(string s,CType cnum[])
{
int i,j,k=0; //k记录cnum中元素的个数,即是字符的种类
for(i=0;i<s.length();i++) //对原始串元素逐个进行检查
{
if(k==0) //cnum中没有元素的时候,将s[i]直接放到cnum中
{
cnum[k].ch = s[i];
cnum[k].num = 1;
k++;
}
else
{ //cnum中存在元素时,查找是否有相同的字符
for(j=0;j<k && s[i]!=cnum[j].ch;j++)
; //空操作只是为了逐次检查cnum中已有的每个元素
if(j>=k) //s[i]不在cnum中,添加进来
{
cnum[k].ch = s[i];
cnum[k].num = 1;
k++;
}
else //s[i]在cnum中,增加cnum中该元素的计数
cnum[j].num++;
}
}
return k;
}
int main()
{
CType cnum[128];
string str;
cout<<"请输入字符串,并按两次回车键"<<endl;
getline(cin,str); //读入字符串到string中
cout<<str<<endl;
int k=Record(str,cnum);
for(int i=0;i<k;i++)
cout<<cnum[i].ch<<":"<<cnum[i].num<<endl;
return 0;
}
=====================
2. (本质上合法一是一样的,只是没有采用结构体的形式,而是开了两个数组)
=====================
#include <iostream>
#include <string>
using namespace std;
#define N 1000
int frequency(string & s, char A[],int C[],int k)
{
//A[]存放字符的种类,C[]存放每种字符的个数,k为字符的种类数
int i,j, len=s.length();
if(!len)
{
cout<<"空串!"<<endl;
return k=0;
}
else
{
A[0]=s[0];C[0]=1; k=0;
for(i=1;i<len;i++) C[i]=0;
for(i=1;i<len;i++)
{ //检测串中所有字符
j=0;
while(j<k && A[j]!=s[i]) j++; //检查s[i]是否已在A[ ]中
if(j==k)
{
A[k]=s[i]; C[k]++; k++; //[i]从未检测过,则将其输入到下个数组元素中
}
else
C[j]++; //s[i]已经检测过
}
return k;
}
}
void main()
{
string str;
char A[N];
int C[N];
int k=0,j;
cout<<"input a string :"<<endl;
getline(cin,str);
int m=frequency(str,A,C,k);
cout<<"出现的字符是: 次数"<<endl;
for(j=0;j<m;j++)
cout<<A[j]<<":"<<C[j]<<endl;
cout<<endl;
cout<<"字符个数是:"<<str.length()<<endl;
}
===================================