来自于一个太大范围的关键字是不能作为索引的。符号表实现的一个简单方法是把数据项按照顺序连续地存放在数组中。当要插入一个新的数据项时,就像插入排序中所做的那样,将较大的元素移动一个位置,把新的数据项放进数组中;当要进行搜索时,我们顺序地查找数组。因为数组是有序的,当遇到一个大于搜索关键字的关键字时,我们即可报告搜索失败。
基于数组的实现:
static Item *st;
static int N;
void STinit( int maxN )
{
st= malloc((maxN)*sizeof(Item));
N= 0;
}
int STcount()
{
returnN;
}
void STinsert(Item item)
{
intj = N++;
Keyv = key(item);
while(j>0&&less(v,key(st[j-1])))
{
s[j]= s[j-1];
j--;
}
st[j] = item;
}
Item STsearch(Key v)
{
intj;
for(j=0;j<N;j++)
{
if(eq(v,key(st[j])))
return st[j];
if(less(v,key[st[j]]))
break;
}
return NULLitem;
}
Item STselect(int k)
{
returnst[k];
}
void STsort(void (*visit)(Item))
{
inti;
for(i=0; i<N;i++)
visit(st[i]);
}
对于搜索的实现中可以进行改进:对于表中不存在搜索关键字的数据项的情况,使用一个观察哨来避免尾部的测试。
如果不要求数据项在数组中有序,可以有另一种实现方法。当插入一个新数据项时,我们把它放在数组的末尾。当进行搜索时,只要顺序查看数组即可。这种方法的特性是插入快,但选择和排序需要大量的工作。
使用链表是另一种直接实现符号表的方法。我们可以选择使链表有序,能够很容易地支持
“排序”操作,或者选择使链表无序,这样“插入”操作很快。使用链表较之数组的优点是,
我们不需预测出表的大小,缺点是需要额外的空间。