静态顺序表查找

静态顺序表查找

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

#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))

#define N 5 /* 数据元素个数 */
typedef int Status;


typedef int KeyType;	/* 设关键字域为整型 */
typedef struct		/* 数据元素类型(以教科书图9.1高考成绩为例) */
{
	char number[21];	/* 准考证号 */
	char name[13];	/* 姓名(4个汉字加1个串结束标志) */
	int politics;	/* 政治 */
	int Chinese;	/* 语文 */
	int English;	/* 英语 */
	int math;		/* 数学 */
	int physics;	/* 物理 */
	int chemistry;	/* 化学 */
	int biology;	/* 生物 */
	KeyType key;	/* 关键字类型应为KeyType,域名应为key */
}ElemType;

ElemType r[N] = { {"20175968452","何芳芳",85,89,98,100,93,80,47},
			   {"20175968453","陈红",85,86,88,100,92,90,45},
			   {"20175968454","陆华",78,75,90,80,95,88,37},
			   {"20175968455","张平",82,80,78,98,84,96,40},
			   {"20175968456","赵小怡",76,85,94,57,77,69,44} }; /* 全局变量 */

#define total key /* 定义总分(total)为关键字 */
//静态查找表的顺序存储结构
typedef struct {
	ElemType* elem;		//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
	int length;			//表长度
}SSTable;

//静态查找表 ---- 构造一个含n个数据元素的静态顺序查找表ST(数据来自全局数组r)
Status Creat_Seq(SSTable* ST, int n) {
	int i;
	ST->elem = (ElemType*)calloc(n + 1, sizeof(ElemType));	//动态生成n个数据元素空间(0号单元不用)
	if (!(ST->elem)) {
		return 0;
	}
	for (i = 1; i <= n; i++) {
		*(ST->elem + i) = r[i - 1];		//将全局数组r的值依次赋给ST	
	}
	ST->length = n;
	return 1;
}

/* 在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为 */
/* 该元素在表中的位置,否则为0.*/
int Search_Seq(SSTable ST, KeyType key)
{
	int i;
	ST.elem[0].key = key; /* 哨兵 */
	for (i = ST.length; !EQ(ST.elem[i].key, key); --i);		/* 从后往前找 */
	return i;	 /* 找不到时,i为0 */
}


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

/* 初始条件: 静态查找表ST存在,Visit()是对元素操作的应用函数 */
  /* 操作结果: 按顺序对ST的每个元素调用函数Visit()一次且仅一次。 */
  /* 一旦Visit()失败,则操作失败 */
Status Traverse(SSTable ST, void(*Visit)(ElemType))
{
	ElemType* p;
	int i;
	p = ++ST.elem; /* p指向第一个元素 */
	for (i = 1; i <= ST.length; i++)
		Visit(*p++);
	return 1;
}

/* Traverse()调用的函数 */
void print(ElemType c)
{
	printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\n", c.number, c.name, c.politics, c.Chinese, c.English, c.math, c.physics, c.chemistry, c.biology, c.total);
}

int main() {
	SSTable st;
	int i, s;
	for (i = 0; i < N; i++)		/* 计算总分 */
		r[i].total = r[i].politics + r[i].Chinese + r[i].English + r[i].math + r[i].physics + r[i].chemistry + r[i].biology;
	Creat_Seq(&st, N);	/* 由全局数组产生静态查找表st */
	printf("准考证号\t姓名\t政治\t语文\t外语\t数学\t物理\t化学\t生物\t总分\n");
	Traverse(st, print);	/* 按顺序输出静态查找表st */
	printf("请输入待查找人的总分: ");
	scanf("%d", &s);
	i = Search_Seq(st, s);	 /* 顺序查找 */
	if (i)
		print(*(st.elem + i));
	else
		printf("没找到\n");
	Destroy(&st);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值