AutoComplete的字典建立和单词查找算法实现

//说明:使用有序链表实现, 单词插入的复杂度和 查找的时间复杂度均为O(n),
#include 
< windows.h >
#include 
< math.h >
#include 
< iostream >
#include 
< list >
#include 
< string >

#define   ASSERT(x) if(!(x)){throw 0;}
void  TRACE( const   char   * szFormat,dot.gif)
{
    va_list l;
    
char  s[ 1000 ];

    va_start(l,szFormat);
    vsprintf(s,szFormat,l);
    OutputDebugString(s);
}

using   namespace  std;

typedef list
< string >  STRLIST;

// MS笔试题:AutoComplete字典的插入单词,和查找类似单词的实现
// 说明:如果查询的单词长度小于等于当前单词,且strnicmp(两个单词,较短的长度)==0,则认为是类似单词
// 用有序链表保存单词,测试成功
namespace  Dictionary2
{
    
struct  LISTNODE 
    {
        
char  data[ 100 ];
        LISTNODE 
* next;
    };

    BOOL InsertWord(LISTNODE 
*& root, const   char   * word)
    {
        
int  n = strlen(word);
        ASSERT(n
> 0   &&  n < 100 );

        
if ( ! root)
        {
            root
= new  LISTNODE;
            strcpy(root
-> data,word);
            root
-> next = 0 ;
            
return  TRUE;
        }
        
        LISTNODE 
* p = root;
        LISTNODE 
* p1 = 0 // 前一个指针
         while  (p)
        {
            
// cout<<(DWORD)p<<endl;
             int  n2 = strlen(p -> data);
            
int  nm = min(n,n2);
            
int  icmp = strnicmp(word,p -> data,nm);
            
            
if (icmp < 0   ||  (icmp == 0   &&  n < n2))
            {
                
break ;
            }
            
else   if (icmp == 0   &&  n == n2)
            {
                
return  FALSE;
            }

            p1
= p;
            p
= p -> next;
        }

        LISTNODE 
* p2 = new  LISTNODE;
        strcpy(p2
-> data,word);

        
if  (p1)
        {
            TRACE(
" 插入到%s之后 " ,p1 -> data);
            
            p2
-> next  =  p1 -> next;
            p1
-> next = p2;
        }
        
else
        {
            
// 插入到跟指针出
            p2 -> next = root;
            root
= p2;
        }
        
        
return  TRUE;
    }

    
void  Traverse(LISTNODE  * root)
    {
        
while  (root)
        {
            cout
<< root -> data << endl;
            root 
=  root -> next;
        }
    }

    
void /* STRLIST */  FindWord(LISTNODE  * root, const   char   * word)
    {
        
// STRLIST sl;
         if  (root)
        {
            
int  n = strlen(word);

            LISTNODE 
* p = root;
            LISTNODE 
* p1 = 0 ;
            
int  step = 0 ;
            
while  (p)
            {
                
int  n2 = strlen(p -> data);
                
int  nm = min(n,n2);
                
int  icmp = strnicmp(word,p -> data,nm);

                
if  (icmp == 0   &&  n <= n2)
                {
                    
// sl.push_back(p->data);
                    cout  << p -> data  << endl;
                }
                
else   if (icmp < 0 )
                    
break ;

                p1
= p;
                p
= p -> next;
            }
        }
    }
    
void  Test()
    {
        LISTNODE 
* root = 0 ;

        InsertWord(root,
" abc " );
        InsertWord(root,
" abcd " );
        InsertWord(root,
" abcc " );
        InsertWord(root,
" zxabc " );
        InsertWord(root,
" a " );
        InsertWord(root,
" ab " );
        InsertWord(root,
" ac " );
        InsertWord(root,
" cb " );
        InsertWord(root,
" bc " );
        InsertWord(root,
" bxs " );
        InsertWord(root,
" ba " );
        InsertWord(root,
" baa " );
        InsertWord(root,
" bsxa " );

        Traverse(root);

        
char  word[ 100 ];
        
        strcpy(word,
" ab " );
        cout
<< " 查找单词 " << word  << endl;
        FindWord(root,word);

        strcpy(word,
" b " );
        cout
<< " 查找单词 " << word  << endl;
        FindWord(root,word);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值