问题 单项选择题

有以下结构体说明和变量定义,如下图所示,指针p、q、r分别指向一个链表中的三个连续结点。
struct node
int data;
struct node *next;
*p, *q, *r;
data next data next data next


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

A) r→next=q; q→next=r→next; p→next=r;
B) q→next=r→next; p→next=r; r→next=q;
C) p→next=r; q→next=r→next; r→next=q;
D) q→next=r→next; r→next=q; p→next=r;

答案

参考答案:A

解析: 本题的考查点是指向结构体变量的指针以及用指针处理链表。一个结构体变量的指针就是该变量所占据的内存字段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组的元素。在C语言中,q→next相当于(*q).next。即q所指向的是结构体变量中的next成员。链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它根据需要开辟内存单元。链表中的各元素在内存中可以不是连续存放的。所以必须利用指针变量才能实现。即一个结点中应包括一个指针变量,用它存放下一结点的地址。r→next=q表示让q指向新开辟的结点,r指向链表中最后一个结点,把r所指的结点连接在q所指的结点后面。同样,p→next=r表示让r指向新开辟的结点,p指向链表中最后一个结点,把p所指的结点连接在r所指的结点后面。那么在A中,执行r→next=q后,r→next指向了q。此时第2句相当于q→next=q; ,所以q的下一个结点指向了自己,而不是指向原来r的下一个结点。故本题答案为A)。

问答题 简答题
单项选择题