关于LocateElem算法 15
intLocateElem_Sq(Sq_ListL,ElemTypee,Status(*compare)(ElemType,ElemType)){//在顺序线性表L中查找...
int LocateElem_Sq(Sq_List L,ElemType e,Status(*compare)(ElemType,ElemType))
{//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回O
i=1;
p=L.elem;
while(i<=L.Length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return;
else return 0;
}// LocateElem_Sq
很简短的一个算法,但是不是很明白。虽然书中有注释。
(1)这里的ElemType是不是一个抽象的类型,它可以代表是整型等一系列的数据类型?
(2)还有就是while(i<=L.Length&&!(*compare)(*p++,e)) ++i;中的!(*compare)(*p++,e))不是很明白是什么意思?
(3)while(i<=L.Length&&!(*compare)(*p++,e)) ++i;是不是相当于
while(i<=L.Length&&!(*compare)(*p++,e))
{++i;} 展开
{//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回O
i=1;
p=L.elem;
while(i<=L.Length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return;
else return 0;
}// LocateElem_Sq
很简短的一个算法,但是不是很明白。虽然书中有注释。
(1)这里的ElemType是不是一个抽象的类型,它可以代表是整型等一系列的数据类型?
(2)还有就是while(i<=L.Length&&!(*compare)(*p++,e)) ++i;中的!(*compare)(*p++,e))不是很明白是什么意思?
(3)while(i<=L.Length&&!(*compare)(*p++,e)) ++i;是不是相当于
while(i<=L.Length&&!(*compare)(*p++,e))
{++i;} 展开
展开全部
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;
}
初始条件:线性表存在,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;
}
富港检测东莞有限公司
2024-12-25 广告
2024-12-25 广告
ISTA3L是一个基于研究、数据驱动的测试协议,它模拟了由零售公司完成的产品订单被直接运送给消费者时所经历的危险,它允许用户评估包装产品的能力,以承受运输和处理包装产品时所经历的供应链危险,从接收到任何电子商务零售商履行操作,直到最终消费者...
点击进入详情页
本回答由富港检测东莞有限公司提供
展开全部
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;
}
初始条件:线性表存在,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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
由于评论限制字数,只能在回复中说了,LZ采用的最佳答案(好像只有唯一一个回答),是有问题的。讨论如下:
Status(*compare)(ElemType c1,ElemType c2)
并非是比较相等的函数,它也可以判断大于或小于,甚至e2是不是e1平方的关系(这里为了方便讨论加入c1和c2)。取决于ElemType的类型所能具有的操作,和程序员对它的定义。比如,我这么定义:
Status big(ElemType c1,ElemType c2)
{
if(c1>c2)
return TRUE;
else
return FALSE;
}
然后我这么调用:
j=3;
k=LocateElem(L,j,big);
if(k)
printf("L中的第%d个元素的值比%d大,",k,j);
else
printf("没有值比%d大的元素\n",j);
这里你可能要问为什么调用时候没有看到compare,这是因为它是形参,是在定义时候用的,真正调用的时候用实参(这里是big传进去),这里实际上传的是函数指针(C语言中把函数名就是当成指针看待的)
另外while(i<=L.Length&&!(*compare)(*p++,e))这句也有问题,应改为while(i<=L.Length&&!compare(*p++,e))。详细的说,compare是一个指针(指向一个函数)只有在定义参数的时候为了表明它是一个函数指针才在前面加*。但在应用时,如果前面加*,表示解引用,得到一个地址(一串数字),一串数字+(*p++,e)编译器不认识的,编译会出错。
当调用k=LocateElem(L,j,big); 时会把big传进LocateElem里,在while(i<=L.Length&&!compare(*p++,e))这句中用big替换掉compare,实际得到调用的是while(i<=L.Length&&!big(*p++,e))。
Status(*compare)(ElemType c1,ElemType c2)
并非是比较相等的函数,它也可以判断大于或小于,甚至e2是不是e1平方的关系(这里为了方便讨论加入c1和c2)。取决于ElemType的类型所能具有的操作,和程序员对它的定义。比如,我这么定义:
Status big(ElemType c1,ElemType c2)
{
if(c1>c2)
return TRUE;
else
return FALSE;
}
然后我这么调用:
j=3;
k=LocateElem(L,j,big);
if(k)
printf("L中的第%d个元素的值比%d大,",k,j);
else
printf("没有值比%d大的元素\n",j);
这里你可能要问为什么调用时候没有看到compare,这是因为它是形参,是在定义时候用的,真正调用的时候用实参(这里是big传进去),这里实际上传的是函数指针(C语言中把函数名就是当成指针看待的)
另外while(i<=L.Length&&!(*compare)(*p++,e))这句也有问题,应改为while(i<=L.Length&&!compare(*p++,e))。详细的说,compare是一个指针(指向一个函数)只有在定义参数的时候为了表明它是一个函数指针才在前面加*。但在应用时,如果前面加*,表示解引用,得到一个地址(一串数字),一串数字+(*p++,e)编译器不认识的,编译会出错。
当调用k=LocateElem(L,j,big); 时会把big传进LocateElem里,在while(i<=L.Length&&!compare(*p++,e))这句中用big替换掉compare,实际得到调用的是while(i<=L.Length&&!big(*p++,e))。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想请问下,你们教材是哪个版本的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询