有人可以用指针解释一下这段代码的作用:
while(terminate== 0)
{
s->value=s->next->value;
if ((s->next->next)==NULL)
{
free(s->next);
s->next=NULL;
terminate= 1;
}
s=s->next;
}
其中s作为参数传递:set_el * s并具有以下结构:
typedef struct set_el
{
int value;
struct set_el* next;
} set_el;
答案 0 :(得分:6)
如果输入为NULL,则会导致分段错误,因为s->value
是非法的。
在大小为1的列表中,它同样会失败,因为s-> next->值是非法的。
在带有循环的列表中(例如a> b> a ...),它会无休止地循环,因为s-> next-> next永远不会为NULL
最后,在大小为2或更大的链表上,它将遍历列表,将下一个节点的值复制到当前节点并删除最后一个节点。
实际上,它将以非常迂回的方式“删除”列表中的第一个节点。 (我们释放最后一个节点内存,但我们将值复制到列表中。新列表缩短了1个节点,第一个节点没有值。)