1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 char checkFirstChar(char *stringSrc) 6 { 7 char *ptr = stringSrc; 8 int arraryHash[255]; 9 memset(arraryHash,0,sizeof(int)*255); 10 while (*ptr != '\0') 11 { 12 arraryHash[*ptr]++; 13 ptr++; 14 } 15 int index = 0; 16 while (index < 255) 17 { 18 if (arraryHash[index] == 1) 19 return (char)index; 20 index++; 21 } 22 } 23 24 int main(int argc, char *argv[]) 25 { 26 char *sourceString = "abcdabce"; 27 printf("%c\n",checkFirstChar(sourceString)); 28 return 0; 29 }
今天在看一道C语言编程题。
哈希表Hash也称散列表,是根据关键码值key value而直接进行访问的数据结构。即,它通过把关键码值隐射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫散列表。
定义hash表和基本数据结点:
1 typedef struct Node 2 { 3 int data; 4 struct Node * next; 5 }Node; 6 7 typedef struct HashTable 8 { 9 Node *value[10]; 10 }HashTable;
创建一个Hash表:
1 HashTable *CreateHashTable() 2 { 3 HashTable *pHashTbl = (HashTable *)malloc(sizeof(HashTable)); 4 memset(pTH, 0, sizeof(HashTable)); 5 return pHashTbl 6 }
找出一个字符串中第一个只出现一次的字符。
分析:利用和哈希表的原理差不多的思路,就是创建一个表,储存每个字符出现的次数,然后遍历这个表直到找到第一次出现的一次的那个字符。
关于哈希表的大小,因为ASCII表的大小是255,因此数组的长度为255(arrayHash[255])
#include <stdio.h> #include <string.h> #include <stdlib.h> char checkFirstChar(char *stringSrc) { char *ptr = stringSrc; int arraryHash[255]; memset(arraryHash,0,sizeof(int)*255); while (*ptr != '\0') { arraryHash[*ptr]++; ptr++; } int index = 0; while (index < 255) { if (arraryHash[index] == 1) return (char)index; index++; } } int main(int argc, char *argv[]) { char *sourceString = "abcdabce"; printf("%c\n",checkFirstChar(sourceString)); return 0; }