LocateElem(L,e,compare())&ListTraverse(L,visit())小组作业内容说明:
1、LocateElem(L,e,compare())函数:
初始条件:线性表存在,compare()是数据元素判定函数;
操作结果:返回第一个与e满足关系compare()的数据元素的位序。若不存在,返回0.
由定义的结构体知:
typedef struct
{
char Name[100]; //学生姓名
char Number[100]; //学生的学号
} StudentRacord;
如何来比较每位学生的信息呢?及如何创建compare()函数?根据一般的学号特点,学号的前两位一般表示的是学生的入学年份。由此我们可以构造一个比较两位同学是否同一年入学的函数。部分代码如下:
Status compare(StudentRacord Student_A, StudentRacord Student_B)
{
//学号前两位数表示该生的入学年份
///判断该生是否和比较的学生是否是同一年入学
if(Student_A.Number[0]==Student_B.Number[0]&&
Student_A.Number[1]==Student_B.Number[1])
{
return TRUE;
}
else
{
return FALSE;
}
}
Status LocateElem(SequentialList Record, StudentRacord Student,
int (*compare)(StudentRacord , StudentRacord)) // 算法2.6
{
// 在顺序线性表Record中查找第1个值与Student满足compare()的元素的位序。
// 若找到,则返回其在Record中的位序,否则返回0。
int i,j;
StudentRacord *p;
i = 1; // i的初值为第1个元素的位序
p = Record.elem; // p的初值为第1个元素的存储位置
j = (*compare)(*p++, Student);
while (i <= Record.length&&j==0)
{
++i;
j = (*compare)(*p++, Student);
}
if (i <= Record.length)
{
return i;
}
else
{
return 0;
}
} // LocateElem
2、ListTraverse(L,visit())函数:
初始条件:线性表已存在.
操作结果:依次对线性表中的每个数据元素调用函数visit().一旦visit()失败,则操作失败。
注意操作失败的字眼,这就意味着线性表中的每个数据元素都存在一个共性,一旦缺乏这个共性,就代表学生信息内容有误,提示线性表构建失败。
为此我们认定每个学生的学号都是13位数,如果一个学生的学号不是13位即意味着操作失败。
部分代码:
bool visit(StudentRacord STUDENT)
{
///规定学号为13位,若非13位;则该同学的学号输入有误,操作失败
if(strlen(STUDENT.Number)==13)
{
return true;
}
else
{
return false;
}
}
Status ListTraverse(SequentialList Record,bool (*visit)(StudentRacord))
{
StudentRacord *p;
p = Record.elem;
int i=1,j = (*visit)(*p++);
while (i <= Record.length&&j!=0)
{
++i;
j = (*visit)(*p++);
}
if (i <= Record.length)
{
printf("The number of student%d is Error!/n",i);
return ERROR;
}
else
{
printf("The number of students is OK!/n");
return 0;
}
}
3、总结:
1)、由于此次小组作业时间紧促,且小组大部分成员大都还没有电脑;又由于小组刚刚建立还没到3天;队员之间的交流默契不好。以后小组成员间的交流培养是重点。
2)、在理解代码的过程中,体现本组各成员上学期C语言没学好。特别是指向函数的指针既不会用也不能理解。
Sunshine_Rainbow小组