第 1 题
数据结构已知头指针 h 指向一个带头结点的非空单循环链表,结点结构为
[data|next]
其中 next 是指向直接后继结点的指针,p 是尾指针,q 是临时指针。现要删除该链表的第一个元素,正确的语句序列是( )。
A.
h->next = h->next->next;
q = h->next;
free(q);
B.
q = h->next;
h->next = h->next->next;
free(q);
C.
q = h->next;
h->next = q->next;
if (p != q)
p = h;
free(q);
D.
q = h->next;
h->next = q->next;
if (p == q)
p = h;
free(q);
查看答案与解析
参考答案:D
答案:D。
带头结点循环链表的首元素是 h->next,不是 h。应先用 q 保存首元素,再将 h->next 改为 q->next,最后 free(q),这样删除过程中不会丢失待释放的地址。还需检查原表是否只有一个元素:此时 q==p,删除后 h->next==h,尾指针也应设为 h,D 完整处理了这一情况。
A 先改链接,再把新的首元素赋给 q,实际会释放错误结点,原首元素还泄漏。B 对多个元素的表可删除首元素,却漏掉单元素时尾指针更新,留下悬空 p。C 的 p!=q 条件反了,会在多元素时误把尾指针设为 h,在单元素时反而不改。边界检查必须在释放 q 之前完成。








