正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 提高 2014 第一轮真题 › 第 11 题

NOIP 提高 2014 第一轮 第 11 题:现要将 q 和 r 所指结点的先后位置交换,同时要保持链表的连续,以下程序段中错

单项选择 · 线性表、栈与队列 · 答案 D

题目

有以下结构体说明和变量定义,如图所示,指针 $p,q,r$ 分别指向一个链表中的三个续结点。

struct node {
 int data;
 struct node *next;
} *p,*q,*r;

现要将 $q$ 和 $r$ 所指结点的先后位置交换,同时要保持链表的连续,以下程序段中错误的是(   )
题目插图
题目插图

选项

  • A. q->next = r->next; p-> next = r; r->next = q;
  • B. p->next = r; q->next = r->next; r->next = q;
  • C. q->next = r->next; r->next = q; p->next = r;
  • D. r->next = q; q->next = r->next; p->next = r;

答案

D

题解

考点定位

链表交换时的指针赋值顺序。

解题过程

原链表为 p→q→r→后继,目标是 p→r→q→后继。题目要求选出错误的程序段。

D 的第一句 r->next=q 覆盖了 r 原来的后继。第二句 q->next=r->next 读取的已经是 q,因此变成 q->next=q,产生自环;第三句再令 p->next=r,也不能修复这个问题。

A、B、C 都在覆盖 r->next 之前,把原后继赋给 q->next,因此能完成交换。

选 D。

易错提醒

赋值按顺序立即生效,后面的语句读取的是修改后的指针值。注意题目问“错误的是”。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号