顺序表的查找
#include "stdio.h"#include "stdlib.h"
#define N 5
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
typedef int KeyType;
struct ElemType // 数据元素类型(以教科书图9.1高考成绩为例)
{
long number; // 准考证号
char name[9]; // 姓名(4个汉字加1个串结束标志)
int politics; // 政治
int Chinese; // 语文
int English; // 英语
int math; // 数学
int physics; // 物理
int chemistry; // 化学
int biology; // 生物
KeyType key; // 关键字类型应为KeyType,域名应为key,与bo9-1.cpp中一致
}r[N]={{1234,"何芳芳",85,89,98,100,93,80,47},
{1793,"陈红",85,86,88,100,92,90,45},
{1753,"陆华",78,75,90,80,95,88,37},
{1793,"张平",82,80,78,98,84,96,40},
{1728,"赵小怡",76,85,94,57,77,69,44}}; // 全局变量
#define total key // 定义总分(total)为关键字
typedef struct
{
ElemType *elem;
int length;
}SSTable;
//顺序查找P216
int Search(SSTable ST,KeyType key)
{
int i;
ST.elem[0].key = key;
for (i = ST.length;!EQ(ST.elem[i].key,key);--i);
return i;
}
//构造一个含n个数据元素的静态查找表ST
int Create(SSTable *ST,int n)
{
int i;
if(!((*ST).elem = (ElemType*)malloc(sizeof(ElemType)*(n)))) exit(-1);
for(i = 0;i<n;++i)
{
(*ST).elem[i].key = i;
}
(*ST).length = n;
return 0;
}
//销毁表ST
void Destroy(SSTable *ST)
{
free((*ST).elem);
(*ST).length = 0;
}
void Traverse(SSTable ST,void (*Visit)(ElemType))
{
ElemType *p;
int i;
p=++ST.elem;
for(i=1;i<=ST.length;i++)
Visit(*p++);
}
void print(ElemType c) // Traverse()调用的函数
{
printf("%-8ld%-8s%4d%5d%5d%5d%5d%5d%5d%5d\n",c.number,c.name,c.politics,c.Chinese,c.English,c.math,c.physics,c.chemistry,c.biology,c.total);
}
void 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;
Create(&ST,N); // 由全局数组产生静态查找表st
printf("准考证号 姓名 政治 语文 外语 数学 物理 化学 生物 总分\n");
Traverse(ST,print); // 按顺序输出静态查找表st
printf("请输入待查找人的总分: ");
scanf("%d",&s);
i=Search(ST,s); // 顺序查找
if(i)
print(*(ST.elem+i));
else
printf("没找到\n");
Destroy(&ST);
}
请教这哪错了,运行后乱码