静态查找表 哨兵的使用与一般的对比(简化版)

#include <iostream.h>
#include<stdlib.h>
#define ok 1
#define N 3
#define overflow 0
typedef struct 
{
int *elem;
int length;
}sstable;


int initlist(sstable &l)
{
l.elem=(int*)malloc(N*sizeof(int));
if(!l.elem)  exit(overflow);
return ok;


}


int search(sstable st,int key)
{
int i=N-1;
st.elem[0]=key;
while(st.elem[i]!=key)
{
i--;
}
return i;


}


void main()
{
int a,i;
sstable st;
    initlist(st);
for(i=1;i<N;i++) cin>>st.elem[i];

cout<<"你想查找的数字是";
cin>>a;
cout<<"位置在"<<search(st,a);

}



程序用于说明问题可能比较简单但是个人水平确实低,在刚开始写的时候有好多错误 


其实最重要的还是那个 search函数的i值是等于N-1,因为数组的下标是和数字不对应的,以一个是a【0】

同时 for(i=1;i<N;i++) cin>>st.elem[i];  这里不能=N,只能小于,例如这里本来只有三个窗口值,现在a【o】又成了哨兵占据第一位,也就是三个东西只需要弄出两个东西就好了 


那么问题又来了 本来我是定义N为6 但是系统只让我输入五个数字 



怎样解决这个问题 

l.elem=(int*)malloc((N+1)*sizeof(int));  只要写成N+1  然后for(i=1;i<=N;i++) cin>>st.elem[i]; 加上个等于号就好了






哨兵的作用 对比一下 如果是一般的程序 大概是这样的

for(int i=1;i<=n;i++)

  {

     if(a[i]==key)

      return i;

}

也就是每一次都需要比较那个i<n;  加了哨兵之后就。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值