//说明:使用有序链表实现,
单词插入的复杂度和
查找的时间复杂度均为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,
)
{
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);
}
}
#include < windows.h >
#include < math.h >
#include < iostream >
#include < list >
#include < string >
#define ASSERT(x) if(!(x)){throw 0;}
void TRACE( const char * szFormat,

{
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);
}
}