查找兄弟字符串

#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;
                }
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值