文章

156

粉丝

0

获赞

0

访问

16.4k

头像
2019年(408)计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年12月2日 19:30
阅读数 7


评分及理由

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

得分:1分

理由:学生给出了基本的设计思想,即先求链表长度,然后根据长度奇偶性从中间位置开始将后半部分结点插入到新链表R中,最后将L和R合并。这个思路与标准答案“找中点、反转后半段、合并”的核心思想有相似之处,但存在明显缺陷:
1. 学生没有明确说明需要对后半部分进行反转(或逆序插入),而目标顺序要求后半部分是逆序的(aₙ, aₙ₋₁, …),仅将后半部分按原顺序插入R无法得到正确结果。
2. 学生提到“每遍历一个便插入R链表R后”,若理解为尾插法,则R中顺序与原顺序相同,不符合要求;若理解为头插法,则可能实现逆序,但描述不清晰。
3. 合并过程的描述过于简略且存在逻辑混乱(如“每遍历L中的一个结点便将R中的一个结点插入”)。
因此,设计思想部分存在重要遗漏(反转步骤),且描述不够准确,扣2分。

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

得分:2分

理由:学生尝试用代码实现,但代码中存在多处严重逻辑错误和语法错误,导致算法无法正确运行:
1. 计算长度a的循环中,L指针未移动,导致死循环(`while (L->next != NULL) a++;`)。
2. 指针p未初始化就直接使用(`p = p->next;`),这是未定义行为。
3. 在分离后半部分时,代码逻辑混乱:例如在偶数情况下,`for(int i = 0; i < a / 2 + 2; i++) p = p->next;` 起始位置错误(应为a/2+1),且后续插入操作中q和p的赋值混乱(`q = p; q = q->next; q = p;`等)。
4. 插入R时,使用`p->next = R.next; R.next = p;` 若p是当前待插入结点,则此操作为头插法,可以实现逆序,但p的前驱链接未处理,会破坏原链表。
5. 合并部分的代码逻辑完全错误:`p->next = q->next; q->next = p->next; p->next = q;` 这几句互相覆盖,导致链表断裂且无法正确交叉合并。
6. 最后`L = L;`无意义,且释放内存操作错误(`free(&R);`释放局部变量地址,`free(p); free(q);`可能重复释放或释放未分配的内存)。
代码整体无法实现题目要求的功能,仅因结构体定义正确且大致框架符合“分拆-合并”思路,给2分基础分。

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

得分...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发