假设有一个带有头结点的双向循环链表L,其中每个节点的结构为(prior, data, next)。现要删除链表中第i个位置的节点(i从1开始计数),并用e保存被删除节点的数据。给定函数GetElemPDuL(L, i)返回指向第i个节点的指针p,若i超出链表范围则返回NULL。现有代码段如下:`if(!(p=GetElemPDuL(L,i))) return ERROR; e=p->data; p->prior->next=p->next; p->next->prior= p->prior; free(p); return OK;`。考虑所有可能的情况,以下关于该代码段的断言哪个最准确?

答案解析

选项A错误,当链表只有一个有效节点时,即头结点的next指向该节点,该节点的prior也指向头结点,删除该节点后,p->prior->next会指向p->next, 而p->next的prior指针也会指向p->prior,链表头结点的next指向正确,链表不会断裂。选项B错误,代码段首先检查GetElemPDuL是否返回NULL,如果链表为空,则会直接返回错误,不会产生运行时错误。选项C正确,代码段中使用了 `if(!(p=GetElemPDuL(L,i))) return ERROR;` 进行判断,保证在节点存在的情况下进行删除操作,对于循环双向链表,删除第一个有效节点不会导致链表断裂,而是使头结点的next直接指向下一个有效节点,逻辑上是正确的。选项D错误,即使链表长度为2,当i等于1时,GetElemPDuL(L,1)会返回指向第一个节点的指针,代码逻辑正常,不会错误地修改头结点的next指针,只会将头结点的next指向下一个有效节点。
正确答案:C
随机推荐
开始刷题