文章

75

粉丝

78

获赞

0

访问

4.1k

头像
2009年(408)计算机学科专业基础综合试题 - 第42题回答
数据结构
发布于2025年12月14日 16:56
阅读数 35


评分及理由

(1)得分及理由(满分5分)

得分:3分

理由:学生的基本设计思想是“先遍历链表统计长度,再重新遍历到第 (n-k+1) 个结点”。这个思路是正确的,能够解决问题。但是,题目要求“设计一个尽可能高效的算法”,并明确说明“若采用两遍或多遍扫描才能得到正确结果的,最高分10分”(对应总分为15分的题目,此处5分部分会相应扣分)。标准答案强调的“一遍扫描”是更高效的方法。学生的思路需要遍历链表两次,效率较低,因此不能给满分。思路本身没有逻辑错误,但未达到“尽可能高效”的要求。

(2)得分及理由(满分5分)

得分:4分

理由:学生的详细实现步骤描述基本清晰,包含了统计长度和二次定位两个主要步骤。步骤描述与设计思想一致。扣1分是因为步骤描述中对于边界条件(如k值非法、链表为空等)的处理描述不够明确和完整,且同样存在需要两遍遍历的效率问题。

(3)得分及理由(满分5分)

得分:3分

理由:学生的代码实现了其设计思想,基本功能正确。但存在以下逻辑错误和问题:

  1. 函数声明与使用不一致:第1次识别代码中函数名为seek,参数为linklist *list;第2次识别中参数为LinkNode *linklist。这里假设以第2次识别为准,但第2次识别代码中,函数返回的是结点的data值,而题目要求成功时“输出该结点的 data 域的值,并返回 1”,失败时“只返回 0”。学生的代码成功时返回了数据值,失败时返回0,这不符合题目“返回1”的要求,这是一个逻辑错误。
  2. 边界条件处理不严谨:在定位循环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;。这是一个重要的逻辑缺陷。
  3. 代码未处理表头结点:题目明确说明是“带有表头结点的单链表”,但学生的代码中,参数linklist被直接当作第一个数据结点开始遍历,忽略了表头结点。这会导致长度统计和定位的起始点错误。
由于存在上述逻辑错误,且算法效率未达最优,因此扣分。代码基本框架正确,故给予部分分数。

...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发