//--------------------------静态查找表的顺序存储结构------------------------------
typedef struct{
ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,0号单元留空
int length; //表长度
}SSTable;
int Search_Seq(SSTable ST,KeyType key){
//在顺序表中ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
//该元素在表中的位置,否则为0。
ST.elem[0].key=key; //“ 哨兵”
for(i=ST.length;!EQ(ST.elem[i].key,key);--i); //从后往前找
return i; //找不到时,i为0;
}//Search_Seq
下面是在vs 2005中的实现代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int KeyType;
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
}SSTable;
Status Create_Seq(SSTable *st, int n){
int i=0;
st->elem=(ElemType *)malloc(sizeof(ElemType)*n);
if(st->elem==NULL)
return ERROR;
st->length=0;
for(i=1;i<n;i++){
scanf_s("%d", &st->elem[i]);
st->length++;
}//传入的参数虽然为n,但是实际上只能输入n-1个元素,因为第一个元素用来做哨兵了。
printf("输入成功,长度是%d\n",st->length);
return OK;
}
Status Destroy_Seq(SSTable *st){
free(st);
return OK;
}
int Search_Seq(SSTable ST, KeyType key){
int i=0;
ST.elem[0]=key;
for(i=ST.length; ST.elem[i]!=key; --i);
return i;
}
Status Traverse_Seq(SSTable ST, Status (*visit)(int i)){
int i=0;
for(i=1; i<ST.length+1; i++)
(*visit)(ST.elem[i]);
return OK;
}
Status Visit(int i){
printf("%d", i);
return OK;
}
int main(int argc, char *argv[]){
KeyType key;
SSTable ST, *st=&ST;
Status (*func)(int);
func=Visit;
printf("请输入9个整数:\n");
Create_Seq(st, 10);//传入参数为10,实则是能输入9个元素。
printf("您输入的数据是:\n");
Traverse_Seq(ST, func);
printf("\n");
printf("请输入您想要查找的元素的值:\n");
scanf("%d", &key);
printf("查找成功!您查找的元素的索引是%d\n", Search_Seq(ST, key));
system("pause");
return 0;
}//其中有些多余的函数虽然实现了,但是没有用上。
实现效果如下图: