编程思想:利用hashtable的思想,将输入的字符,映射到一个哈希表中,hash函数为:对输入字符的ASCII码求模运算,映射到在hashtable中的具体下标。通过对hashtable的初始化,均为‘\0’,如果输入的字符,映射到hashtable的相应位置,其内容不是‘\0’,则表示已经有字符放置,则该字符一定不是只出现一次。
#include <iostream>
using namespace std;
#define HASHSIZE 12
typedef struct HashTable
{
char *elem;
int count;
}*pHash; // 要实现此要求,不需要定义这么复杂的hash,此处只是为了更好理解hash而使用
void initHashTable(pHash &ph) //初始化
{
int i = 0;
int m=HASHSIZE;
ph->elem = (char *)malloc(m*sizeof(char));
for(i=0; i<m; i++)
{
ph->elem[i] = '\0';
}
return ;
}
int hash(int key) // 哈希函数
{
return key%HASHSIZE;
}
int insertHashTable(pHash &ph,int value) // 判断是否是已经存在
{
int flag = 0;
int addr = hash(value);
if (ph->elem[addr]!= '\0')
{
flag++;
}
ph->elem[addr] = value;
return flag;
}
int main()
{
int i=0;
int flag = 0;
char arr[HASHSIZE];
pHash phash=NULL;
cout<<"请输入一串字符"<<endl;
cin>>arr;
phash = (pHash)malloc(HASHSIZE*sizeof(char));
initHashTable(phash);
for(i=0; i<HASHSIZE; i++)
{
flag = insertHashTable(phash,arr[i]);
}
if(flag == 0)
{
cout<<"第一个只出现一次的字符:"<<arr[i]<<endl; // 此处还没有想好如何保存arr[i]
return 0;
}
cout<<"遍历结束,字符均不唯一出现"<<endl;
return 0;
}