1
Status ListDelete(LinkList *L, int i, int *e)
{
   int j=0;
   LinkList p=L,q;
   while(p->next && j > i-1)
   {
     p = p->next;
     j++;
   }

   if(!p->next||j>i-1) 
     return ERROR;
   q=p->next; 
   p->next=q->next;
   *e=q->data;
   free(q);
   return OK;
}

代码是正确的,但我需要对指针 p 的位置变化进行一些解释。

我的问题是:
如果我想删除(i=2)链表中的第二个元素,那么while()第一次的条件应该是(j<i-1 => 0<2-1),所以实际上while 只执行了一次,但是while 循环中的p 已经指向了第二个元素,所以我认为q->next应该指向第三个要素。

当我执行代码时,它运行良好,如果输入i = 2,它将删除第二个元素,但在我的理解中,它应该删除第三个元素。为什么?

4

2 回答 2

0

因为 i-1,使得 i = 1,它指向列表中的第二个元素。HTH。

于 2013-03-29T20:44:17.310 回答
0

循环条件的第二部分告诉代码在删除之前循环必须跳过多少元素。当您需要删除第二个元素时,您需要跳过它前面的一个元素。一般来说,要删除第 N 个元素,需要跳过 N-1 个元素。

于 2013-03-29T20:46:51.440 回答