首页 > 其他分享 >数据结构:静态查找表(顺序表)

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

时间:2022-12-07 18:38:14浏览次数:33  
标签:静态 elem ST int 查找 key printf 数据结构

#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

 *=============================================*/

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

 

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

 *=============================================*/

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

 

Status Destroy( SSTable& ST )

{

free(ST.elem);

ST.elem = NULL;

ST.length = 0;

return TRUE;

}

/*=============================================

 * 初始条件:静态查找表存在,key为为关键字类型相

 *           同的给定值

 * 操作结果:若ST中存在其关键字等于key的数据元素

 *           则函数值为该元素在表中的位置,否则为

 *           0

 *=============================================*/

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

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;

}

/*=============================================

 * 初始条件:静态查找表存在

 * 操作结果:折半查找

 *=============================================*/

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

 

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;

}

/*=============================================

 *函数功能:打印静态查找表中的元素

 *=============================================*/

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

 

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;

}

/*==============================================

 *函数功能:操作菜单

 *==============================================*/

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

 

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 )

{

}

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();

}

scanf("%d",&i);

}

return 0;

}

标签:静态,elem,ST,int,查找,key,printf,数据结构
From: https://blog.51cto.com/u_15905375/5919891

相关文章