【正确答案】
【答案解析】(1)head->next
(2)ptr
(3)q->data == ptr->data
或ptr->next->data==ptr->data,或其等价表示
(4)ptr->next
(5)ptr
[分析]
本题考查基本程序设计能力。
链表上的查找、插入和删除运算是常见的考点。本题要求去掉链表中的重复元素,使得链表中的元素互不相同,显然是对链表进行查找和删除操作。
对于元素已经按照非递减方式排序的单链表,删除其中重复的元素,可以采用两种思路。
1.顺序地遍历链表,对于逻辑上相邻的两个元素,比较它们是否相同,若相同,则删除后一个元素的结点,直到表尾。代码如下:
ptr=head->next; /*取得第一个元素结点的指针*/
while (ptr && ptr->next){ /*指针ptr指示出重复序列的第一个元素结点*/
q=ptr->next;
while(q && ptr->data==q->data) { /*处理重复元素*/
ptr->next=q->next; /*将结点从链表中删除*/
free(q);
q=ptr->next; /*继续扫描后继元素*/
}
ptr=ptr->next;
}
2.对于每一组重复元素,先找到其中的第一个结点,然后向后查找,直到出现一个相异元素时为止,此时保留重复元素的第一个结点,其余结点则从链表中删除。
ptr=head->next; /*取得第一个元素结点的指针*/
while (ptr && ptr->next) { /*指针ptr指示出重复序列的第一个元素结点*/
q=ptr->next;
while(q && ptr->data==q->data) /*查找重复元素*/
q=q->next;
s=ptr->next; /*需要删除的第一个结点*/
ptr->next=q; /*保留重复序列的第一个结点,将其余结点从链表中删除*/
while (s && s!=q} { /*逐个释放被删除结点的空间*/
t = s->next; free(s); s = t;
}
ptr=ptr->next;
}
题目中采用的是第一种思路。