文章

313

粉丝

0

获赞

0

访问

59.9k

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


评分及理由

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

得分:2分

理由:学生作答的基本设计思想描述为“用辅助指针指向 L->next,将 L 与后继断链,找到单链表中间结点,将后结点通过头插法到 L 后实现逆置后半部分,再将 q 中结点间隔一个插入 L 中,得到 L'”。该思路基本正确,包含了寻找中间结点、逆置后半部分、合并三个关键步骤,与标准答案的核心思想一致。但描述中“将 L 与后继断链”这一说法不够准确,容易引起误解(实际上在寻找中间结点后需要将链表断开为前后两部分)。由于思路整体正确,但表述存在一点瑕疵,扣1分。

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

得分:4分

理由:学生的代码试图实现所述思路,但存在多处逻辑错误和语法问题:
1. 函数声明错误:题目要求处理带头结点的单链表,函数参数应为 NODE* L(或 NODE* h),但学生写为 void L'(NODE L),参数类型错误且函数名不合法(C语言不允许 ' 作为函数名的一部分)。
2. 变量 s 声明错误:s 应为指针类型 node*,但代码中写为 node s;(在第二次识别中未明确类型,但第一次识别中为 s;,根据上下文应为指针)。
3. 求长度循环错误:第一次识别中 while (p->next != 0); 多了一个分号,导致循环体为空,逻辑错误;第二次识别中修正为 while (p->next!= 0) {,但 p 初始指向 L(头结点),求长度逻辑正确。
4. 断链操作错误:代码中在找到中间结点 p 后,执行 L->next = NULL; 这将直接丢弃链表前半部分,导致数据丢失。正确的做法应该是将前半部分的尾结点(即 p)的 next 置空,而不是 L->next。
5. 逆置后半部分逻辑错误:while (p->next!= NULL) 循环中,p 是中间结点,但逆置操作使用头插法插入到 L 之后,这会导致链表连接顺序混乱,且未正确保存后半部分的头指针。
6. 合并逻辑错误:while (q!= NULL) 循环中,q 初始指向 L(与 p 相同),但后续操作试图将 q 中的结点隔一个插入 L,但 q 和 L 指向同一链表,逻辑混乱,且 p 的移动 p = p->next; 只执行一次(第二次识别中少了一次 p = p->next;),无法实现交替合并。
7. 代码整体结构混乱,未能正确实...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发