特定的链表C函数

时间:2014-02-06 17:17:57

标签: c list

我需要编写一个C函数,它可以在链接列表上运行,如下所示:

struct list {
    int value;
    struct list * next_ptr;
}

此函数将阈值编号和列表本身作为输入,然后必须:

1)为列表中的每个整数添加+1 2)然后检查哪一个大于阈值并将其移除 3)作为输出提供已删除元素的数量

列表必须从最小到最大排序(例如:1 2 3 4是,4 3 2 1或1 3 2 4否......)

它应该如何运作的一个例子:

  • 列表中的值:2 4 6 8
  • 阈值:6
  • 该名单变为3 5 7 9
  • 该功能删除7和9 - > 3 5未被删除
  • 输出为2,因为已删除了2个值...

这是我编写的代码,但实际上它不起作用,我认为指针存在一些问题:

功能:

int thres_erase(struct list ** ptrptr, int thres){
int count;
visit_incr(ptrptr);
while (*ptrptr != NULL){
    if ((*ptrptr)->value > thres){
        consume(ptrptr);
        count ++;
        ptrptr= &((*ptrptr)->next_ptr);
       }
    else
        ptrptr= &((*ptrptr)->next_ptr);
}
return count;
}

(Count是已删除元素的数量)

使用的其他2个功能(它们实际上工作正常):

void consume (struct list ** ptrptr){
struct list *tmp_ptr;
    if (*ptrptr != NULL){
        tmp_ptr = *ptrptr;
        *ptrptr = (*ptrptr)->next_ptr;
        free(tmp_ptr);
    }
    else
        printf("\nEmpty!");

void visit_incr( struct list ** ptr ) {
    while ( *ptr != NULL ) {
          (*ptr)->value = (*ptr)->value + 1;
          ptr = &((*ptr)->next_ptr);
    }
}

我正在寻找一种不会彻底改变功能的解决方案,只需让它工作......

2 个答案:

答案 0 :(得分:0)

我看到的第一个问题是当你调用“visit_incr”时,它会将ptrptr更新到列表的末尾,所以你的while循环永远不会运行。

visit_incr(ptrptr);
    while (*ptrptr != NULL){

通常,您应该学习附加调试器并逐步执行代码,或者至少使用printfs,这样您才能真正看到代码正在执行的操作。否则编码会非常痛苦。

答案 1 :(得分:0)

你正在增加你的ptrptr两次!先进入

consume(), *ptrptr = (*ptrptr)->next_ptr; 

再次在

thres_erase(), ptrptr= &((*ptrptr)->next_ptr);

选择一个。

修改

在consume()函数中,您不必检查

if (*ptrptr != NULL){...}

因为ptrptr已经!= NULL,在thres_erase()

while (*ptrptr != NULL){...}

编辑:代码

在你的主要()

//Your code...
struct list *temp_ptr = NULL;
temp_ptr = head_ptr; //head_ptr points to the first node
visit_incr(&temp_ptr);

if(head_ptr != NULL){
    temp_ptr = head_ptr;

    count = thres_erase(&temp_ptr, thres); //For all nodes except the first one

    temp_ptr = head_ptr;
    if(temp_ptr->value > thres){temp_ptr = temp_ptr->next_ptr; free(head_ptr); count++;}
    head_ptr = temp_ptr;
}
else{printf("No nodes in the list \n");}

//print your list
temp_ptr = head_ptr;

while(temp_ptr != NULL){
    printf("%d ", temp_ptr->value);

    temp_ptr = temp_ptr->next_ptr;
}
//Your code...

更改thres_erase(),consume()。

int thres_erase(struct list **ptrptr, int thres){
    int count;
    struct list *temp;
    temp = *ptrptr;

    while(temp->next_ptr != NULL){
        if( (temp->next_ptr)->value > thres){
            count++;
            consume( &temp );
        }
        else{
            temp = temp->next_ptr;
        }
    }

    return count;
}

void consume (struct list ** ptrptr){
    struct list *tmp_ptr;

    tmp_ptr = (*ptrptr)->next_ptr;
    (*ptrptr)->next_ptr = ((*ptrptr)->next_ptr)->next_ptr;
    free(tmp_ptr);

    return;
}

瓦尔特