0

有人可以解释一下这个带有指针的代码的作用:

    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;
4

1 回答 1

6

在 NULL 输入的情况下,它将导致分段错误,因为s->value它是非法的。

在大小为 1 的列表上,它同样会失败,因为 s->next->value 是非法的。

在带有循环的列表(例如 a>b>a...)上,它将无限循环,因为 s->next->next 永远不会为 NULL

最后在一个大小为 2 或更大的链表上,它将遍历将下一个节点的值对应到当前节点的链表,并删除最后一个节点。

实际上,它将以非常迂回的方式“删除”列表中的第一个节点。(我们释放了最后一个节点的内存,但我们将值复制到列表中。新列表短了 1 个节点,并且没有第一个节点中的值)。

于 2013-11-08T13:11:18.280 回答