顺序表的查找
#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;
intlength;
}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);
}
这个代码哪错了,运行后乱码
[解决办法]
ST=malloc(sizeof(SSTable) * N);
改成ST=(SSTable *)malloc(sizeof(SSTable) * N);
for(i=1;i<=ST.length;i++)
{
p = ST.elem[i];
Visit(p);
}
改成
for(i=0;i<=ST.length;i++)
{
p = ST.elem[i];
Visit(p);
}
for(i=0;i<=ST.length;i++)
{
p = ST.elem[i];
Visit(p);
}
改成
for(i=0;i<ST.length;i++)
{
p = ST.elem[i];
Visit(p);
}
我的是GCC编译环境。
- C/C++ code
jimmy@MyPet:~/code/learnc$ makegcc -Wall -g -o test test.c -std=c99test.c:82:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]jimmy@MyPet:~/code/learnc$ ./test 准考证号 姓名 政治 语文 外语 数学 物理 化学 生物 总分1234 何芳芳 85 89 98 100 93 80 47 5921793 陈红 85 86 88 100 92 90 45 5861753 陆华 78 75 90 80 95 88 37 5431793 张平 82 80 78 98 84 96 40 5581728 赵小怡 76 85 94 57 77 69 44 502请输入待查找人的总分: 543 1753 陆华 78 75 90 80 95 88 37 543jimmy@MyPet:~/code/learnc$