从C中的链接列表中删除一些元素

时间:2015-07-06 16:13:35

标签: c list average

我必须从链接列表中删除所有小于或等于" media"的元素。我已经编写了这个函数,但它并没有对某些输入起作用。

代码:

typedef struct lista {
        int dato;
        struct lista *next;
        }
    node;

......
.....
.....

void filtra_elementi(node ** head, int media)
{
node *prec, *corr;
while(((*head)->dato <= media) &&((*head!=NULL)))
    {
    corr=(*head)->next;
    free(*head);
    *head=corr;

    }
prec=*head; corr=(*head)->next;
while(corr!=NULL)
    {
    if(corr->dato<=media)
      {
      prec->next=corr->next;
      //free(corr);
      corr=prec->next;
      }
     else prec=corr; corr=corr->next;
    }
}

这是功能。 如果列表是,它不起作用 0 10 1 11 3 13 4 14 5 15 有人能解释一下为什么吗?感谢。

2 个答案:

答案 0 :(得分:1)

 corr=prec->next;
  }
 else prec=corr; corr=corr->next;//corr=corr->next is not in else part and will always be executed.
}

你想要的是

 corr=prec->next;
  }
 else 
 {prec=corr; 
  corr=corr->next;
 }
}

你的while条件也是错误的。你应该改变check的顺序。想想如果(*head)null会发生什么,那么访问(*head)->dato)会导致运行时错误。如果你用这个

while(((*head!=NULL)) && ((*head)->dato <= media))

如果(*head) null (*head)->dato将无法访问。

答案 1 :(得分:0)

这是函数的另一个版本,有点简单,只有一个循环

void filtra_elementi(node **head, int media)
{
 node *next;
 while(*head != NULL) {
    next = (*head)->next;
    if((*head)->dato <= media) {
        free(*head);
        *head = next;
    } else {
        head = &((*head)->next);
    }
 }
}