#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "brother_string.h"
static word_dict_t *pword_head = NULL;
#define CaseInsen(_ch) ((_ch) | (0x20))
int add_word(char *word)
{
word_dict_t * pword1 = NULL;
word_dict_t * pword2 = NULL;
word_dict_t * tmpword = NULL;
if (word == NULL)
return -1;
pword1 = (word_dict_t *)malloc(sizeof(word_dict_t));
if (pword1 == NULL)
{
return -1;
}
memcpy(pword1->word, word, (strlen(word) + 1));
pword1->next = NULL;
// printf("%s\n", pword1->word);
if (pword_head == NULL)
{
pword_head = pword1;
}
else
{
pword2 = pword_head;
// 当头节点单词大于 pword1时
if (strcmp(pword2->word, pword1->word) >= 0)
{
pword1->next = pword2;
pword_head = pword1;
}
else
{
//当头节点小于pword1时
while (pword2 != NULL)
{
// 如果当前只有一个节点且小于pword1的单词则把pword1放到头节点后并推出循环
if (pword2->next == NULL)
{
pword2->next = pword1;
pword1->next = NULL;
break;
}
//如果当前有多个节点,则往后比较直到找到一个节点的单词大于pword1->word则将pword1插到pword2之前
if (strcmp(pword2->word, pword1->word) >= 0)
{
if (tmpword != NULL)
{
tmpword->next = pword1;
pword1->next = pword2;
}
break;
}
tmpword = pword2;
pword2 = pword2->next;
}
//如果没有找到pword2为NULL, 则把pword2插到最后
if (pword2 == NULL)
{
if (tmpword != NULL)
{
tmpword->next = pword1;
pword1->next = NULL;
}
}
}
}
return 0;
}
58,1-8 13%
int find_similar_word(const char *src_word, const char *dst_word)
{
char src_arr[26] = {0};
char dst_arr[26] = {0};
int i, len;
int index;
if (strlen(src_word) != strlen(dst_word))
return 0;
if (strcmp(src_word, dst_word) == 0)
return 0;
len = strlen(src_word);
for (i=0; i<len; i++)
{
index = CaseInsen(src_word[i]) - 'a';
src_arr[index] ++;
index = CaseInsen(dst_word[i]) - 'a';
dst_arr[index] ++;
}
for (i=0; i<26; i++)
{
if (src_arr[i] != dst_arr[i])
return 0;
}
return 1;
}
int find_similar_word_num(const char *word)
{
word_dict_t *pword = NULL;
int similar_num = 0;
char *src_word = NULL;
char *dst_word = word;
if (pword_head == NULL || word == NULL)
return 0;
pword = pword_head;
while (pword)
{
src_word = pword->word;
if (find_similar_word(src_word, dst_word) == 1)
similar_num ++;
pword = pword->next;
}
return similar_num;
}
int find_one_similar_word(const char *word, int seq, char *similar)
{
word_dict_t *pword = NULL;
char *src_word = NULL;
char *dst_word = NULL;
int similar_num = 0;
if (word == NULL)
{
similar[0] = '\0';
return -1;
}
if (pword_head == NULL)
{
similar[0] = '\0';
return -1;
}
printf("%s %d %s %d\b",__FUNCTION__, __LINE__, word, seq);
dst_word = word;
pword = pword_head;
while (pword)
{
src_word = pword->word;
if (find_similar_word(src_word, dst_word) == 1)
{
similar_num ++;
printf("similar_num %d seq %d %s\n", similar_num, seq, src_word);
if (similar_num == seq)
{
memcpy(similar, src_word, strlen(src_word));
break;
}
}
pword = pword->next;
}
return 0;
}
void clear_word_dic(void)
{
word_dict_t *ptemp = NULL;
if (pword_head != NULL)
{
ptemp = pword_head;
while (pword_head != NULL)
{
//保存head的下一个节点
ptemp = pword_head->next;
free(pword_head);
pword_head = ptemp;
}
}
}
#include <stdlib.h>
#include <string.h>
#include "brother_string.h"
static word_dict_t *pword_head = NULL;
#define CaseInsen(_ch) ((_ch) | (0x20))
int add_word(char *word)
{
word_dict_t * pword1 = NULL;
word_dict_t * pword2 = NULL;
word_dict_t * tmpword = NULL;
if (word == NULL)
return -1;
pword1 = (word_dict_t *)malloc(sizeof(word_dict_t));
if (pword1 == NULL)
{
return -1;
}
memcpy(pword1->word, word, (strlen(word) + 1));
pword1->next = NULL;
// printf("%s\n", pword1->word);
if (pword_head == NULL)
{
pword_head = pword1;
}
else
{
pword2 = pword_head;
// 当头节点单词大于 pword1时
if (strcmp(pword2->word, pword1->word) >= 0)
{
pword1->next = pword2;
pword_head = pword1;
}
else
{
//当头节点小于pword1时
while (pword2 != NULL)
{
// 如果当前只有一个节点且小于pword1的单词则把pword1放到头节点后并推出循环
if (pword2->next == NULL)
{
pword2->next = pword1;
pword1->next = NULL;
break;
}
//如果当前有多个节点,则往后比较直到找到一个节点的单词大于pword1->word则将pword1插到pword2之前
if (strcmp(pword2->word, pword1->word) >= 0)
{
if (tmpword != NULL)
{
tmpword->next = pword1;
pword1->next = pword2;
}
break;
}
tmpword = pword2;
pword2 = pword2->next;
}
//如果没有找到pword2为NULL, 则把pword2插到最后
if (pword2 == NULL)
{
if (tmpword != NULL)
{
tmpword->next = pword1;
pword1->next = NULL;
}
}
}
}
return 0;
}
58,1-8 13%
int find_similar_word(const char *src_word, const char *dst_word)
{
char src_arr[26] = {0};
char dst_arr[26] = {0};
int i, len;
int index;
if (strlen(src_word) != strlen(dst_word))
return 0;
if (strcmp(src_word, dst_word) == 0)
return 0;
len = strlen(src_word);
for (i=0; i<len; i++)
{
index = CaseInsen(src_word[i]) - 'a';
src_arr[index] ++;
index = CaseInsen(dst_word[i]) - 'a';
dst_arr[index] ++;
}
for (i=0; i<26; i++)
{
if (src_arr[i] != dst_arr[i])
return 0;
}
return 1;
}
int find_similar_word_num(const char *word)
{
word_dict_t *pword = NULL;
int similar_num = 0;
char *src_word = NULL;
char *dst_word = word;
if (pword_head == NULL || word == NULL)
return 0;
pword = pword_head;
while (pword)
{
src_word = pword->word;
if (find_similar_word(src_word, dst_word) == 1)
similar_num ++;
pword = pword->next;
}
return similar_num;
}
int find_one_similar_word(const char *word, int seq, char *similar)
{
word_dict_t *pword = NULL;
char *src_word = NULL;
char *dst_word = NULL;
int similar_num = 0;
if (word == NULL)
{
similar[0] = '\0';
return -1;
}
if (pword_head == NULL)
{
similar[0] = '\0';
return -1;
}
printf("%s %d %s %d\b",__FUNCTION__, __LINE__, word, seq);
dst_word = word;
pword = pword_head;
while (pword)
{
src_word = pword->word;
if (find_similar_word(src_word, dst_word) == 1)
{
similar_num ++;
printf("similar_num %d seq %d %s\n", similar_num, seq, src_word);
if (similar_num == seq)
{
memcpy(similar, src_word, strlen(src_word));
break;
}
}
pword = pword->next;
}
return 0;
}
void clear_word_dic(void)
{
word_dict_t *ptemp = NULL;
if (pword_head != NULL)
{
ptemp = pword_head;
while (pword_head != NULL)
{
//保存head的下一个节点
ptemp = pword_head->next;
free(pword_head);
pword_head = ptemp;
}
}
}