数据结构:静态查找表(顺序表)

#include <stdio.h>
#include <stdlib.h>

#define OVERFLOW -2
#define FALSE  0
#define TRUE 1
typedef int Status;
typedef int IndexOfKey;


 //关键字为整型
typedef int KeyType; 

//数据元素类型
typedef struct  
{
KeyType key;    //关键字域
//...           //其他域
}SElemType;

//对两个关键字比较约定为如下的宏定义
#define EQ( a,b )  ( (a) == (b) )
#define LT( a,b )  ( (a) < (b) )
#define LQ( a,b )  ( (a) <= (b) )

//---------------静态查找表的顺序存储结构---------
typedef struct  
{
SElemType* elem;  //数据元素存储空间基址,建表时按实际长度分配,0号单元不用
int length;     //表长
}SSTable;

/*=============================================
 * 操作结果:构造一个含n个数据元素的静态查找表ST
 * 函数:  Create
 *=============================================*/
图片 
Status Create( SSTable& ST, int n )
{
ST.elem = (SElemType*)malloc( (n+1)*sizeof(SElemType) );
if(!ST.elem)
{
exit(OVERFLOW);
}
printf("请任意输入%d个整数,以空格分开:", n );
int i = 0;
for( i = 1; i <= n; i++ )
{
scanf("%d",&(ST.elem[i]) );
}
ST.length = n;
return TRUE;
}


/*=============================================
 * 初始条件:静态查找表存在
 * 操作结果:销毁表ST
 *=============================================*/
图片 
Status Destroy( SSTable& ST )
{
free(ST.elem);
ST.elem = NULL;
ST.length = 0;
return TRUE;
}


/*=============================================
 * 初始条件:静态查找表存在,key为为关键字类型相
 *           同的给定值
 * 操作结果:若ST中存在其关键字等于key的数据元素
 *           则函数值为该元素在表中的位置,否则为
 *           0
 *=============================================*/
图片
IndexOfKey Search_Seq(const SSTable& ST, const KeyType& key )
{
ST.elem[0].key = key;  //0号位置设置一个"哨兵"
int i = 0;
for ( i = ST.length; !EQ( ST.elem[i].key, key); --i )
{
//从后往前找
;
}
return i;  //找不到时返回0
}


/*=============================================
 * 初始条件:静态查找表存在
 * 操作结果:将表中的元素按升序排列
 *=============================================*/  
Status AscElem(SSTable& ST)
{
SElemType temp;  //中间变量
int i = 0;
int j = 0;
for ( i = 1; i <= ST.length; i++ )
{
int index = i;
for ( j = i+1; j <= ST.length; j++ )
{
if ( ST.elem[index].key > ST.elem[j].key )
{
index = j;
}
}
if ( index != i )
{
temp = ST.elem[i];
ST.elem[i] = ST.elem[index];
ST.elem[index] = temp;
}
}
return TRUE;
}


/*=============================================
 * 初始条件:静态查找表存在
 * 操作结果:折半查找
 *=============================================*/
图片 
IndexOfKey Search_Bin( const SSTable& ST, KeyType key )
{
int low = 1; 
int high = ST.length;
int mid =0;
while( low <= high )
{
mid = (low + high )/2;
if ( EQ(key, ST.elem[mid].key ))
{
return mid;
}
else if (LT(key, ST.elem[mid].key))
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return 0;
}

/*=============================================
 *函数功能:打印元素
 *=============================================*/
Status VisitElem( const SElemType& elem )
{
printf("%d", elem );
return TRUE;
}


/*=============================================
 *函数功能:打印静态查找表中的元素
 *=============================================*/
图片 
Status Traverse(const SSTable& ST, Status (*Visit)( const SElemType&) )
{
int i = 0;
for ( i = 1; i <= ST.length; i++ )
{
if(!Visit(ST.elem[i]))
{
return FALSE;
}
printf("\n");
}
return TRUE;
}

/*==============================================
 *函数功能:操作菜单
 *==============================================*/
图片 
void Menu(void)
{
//界面设计仅作测试使用
system("COLOR 27");
printf("\t\t            ========================         \n");
printf("\t\t             |                                     |        \n");
printf("\t\t   |-------|   顺序静态查找表操作   |-------|\n");
printf("\t\t   |         |                                     |       |\n");
printf("\t\t   |        ========================        |\n");
printf("\t\t   |                                        |\n");
printf("\t\t   |       请选择你的操作:                 |\n");
printf("\t\t   |       [1]创建静态查找表                |\n");
        printf("\t\t   |       [2]销毁静态查找表                |\n");
printf("\t\t   |       [3]顺序查找                      |\n");
printf("\t\t   |       [4]折半查找                      |\n");
printf("\t\t   |       [5]查看表元素                    |\n");
printf("\t\t   |       [6]退出                          |\n");
        printf("\t\t   |-======================================-|\n");
printf("\t\t   |                欢迎修改                |\n");
printf("\t\t   |-======================================-|\n");
printf("请选择你要进行的操作(1/2/3/4/5/6):");
}

//改为控制台背景色
/*库#include <stdlib.h>
命令用法:system("COLOR 7a");
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 湖蓝色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 开关或
DefaultColor 注册表值。

如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
会将 ERRORLEVEL 设置为 1。

例如: "COLOR fc" 在亮白色上产生亮红色
*/

int main(void)
{
Menu();
int i = 0;
int n = 0;  //要创建的元素个数
IndexOfKey index;   //记录查询函数返回的索引
SSTable ST;
KeyType key;  //查找关键字
scanf("%d",&i);
while( i != 6)
{
switch( i )
{
case 1:
printf("请输入创建表中的元素个数:");
scanf("%d",&n);
if(Create(ST, n))
{
printf("创建成功!\n");
}
system("pause");
system("cls");
Menu();
break;
case 2:
if(Destroy(ST))
{
printf("销毁成功!\n");
}
system("pause");
system("cls");
Menu();
break;
case 3:
printf("请输入查找关键字:");
scanf("%d", &key);
index = Search_Seq(ST, key);
if ( 0 !=  index )
{
    printf("查找成功!这第%d条记录\n", index);

}
else
{
printf("表中无此元素\n");
}
system("pause");
system("cls");
Menu();
break;
case 4:
AscElem(ST);  //先将表中的元素按升序排列
printf("表中的元素已按升序排列\n");
printf("请输入查找关键字:");
scanf("%d", &key);
index = Search_Bin(ST, key);
if ( 0 !=  index )
{
printf("查找成功!这第%d条记录\n", index);
}
else
{
printf("表中无此元素\n");
}
system("pause");
system("cls");
Menu();
break;
case 5:
printf("表中的元素:\n");
Traverse(ST,VisitElem);
system("pause");
system("cls");
Menu();
break;
default:
printf("输入有误,请重新输入!\n");
system("pause");
system("cls");
Menu();
    break;
}
scanf("%d",&i);
}
return 0;
}
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值