文章
75
粉丝
78
获赞
0
访问
4.1k

评分及理由
(1)得分及理由(满分5分)
得分:3分
理由:学生的基本设计思想是“先遍历链表统计长度,再重新遍历到第 (n-k+1) 个结点”。这个思路是正确的,能够解决问题。但是,题目要求“设计一个尽可能高效的算法”,并明确说明“若采用两遍或多遍扫描才能得到正确结果的,最高分10分”(对应总分为15分的题目,此处5分部分会相应扣分)。标准答案强调的“一遍扫描”是更高效的方法。学生的思路需要遍历链表两次,效率较低,因此不能给满分。思路本身没有逻辑错误,但未达到“尽可能高效”的要求。
(2)得分及理由(满分5分)
得分:4分
理由:学生的详细实现步骤描述基本清晰,包含了统计长度和二次定位两个主要步骤。步骤描述与设计思想一致。扣1分是因为步骤描述中对于边界条件(如k值非法、链表为空等)的处理描述不够明确和完整,且同样存在需要两遍遍历的效率问题。
(3)得分及理由(满分5分)
得分:3分
理由:学生的代码实现了其设计思想,基本功能正确。但存在以下逻辑错误和问题:
seek,参数为linklist *list;第2次识别中参数为LinkNode *linklist。这里假设以第2次识别为准,但第2次识别代码中,函数返回的是结点的data值,而题目要求成功时“输出该结点的 data 域的值,并返回 1”,失败时“只返回 0”。学生的代码成功时返回了数据值,失败时返回0,这不符合题目“返回1”的要求,这是一个逻辑错误。for (int i = 0; i < len - k; i++)中,当k等于len时(即查找倒数第len个,即第一个结点),循环次数为0,定位正确。但当k > len时,len - k为负数,循环条件i < 负数不成立,循环不会执行,p仍指向头结点,最后if (p != NULL)条件成立,会错误地返回头结点的数据(可能是无效值)。正确的做法是在统计长度后,应先判断if (k <= 0 || k > len) return 0;。这是一个重要的逻辑缺陷。linklist被直接当作第一个数据结点开始遍历,忽略了表头结点。这会导致长度统计和定位的起始点错误。
登录后发布评论
暂无评论,来抢沙发