我需要编写一个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否......)
它应该如何运作的一个例子:
这是我编写的代码,但实际上它不起作用,我认为指针存在一些问题:
功能:
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);
}
}
我正在寻找一种不会彻底改变功能的解决方案,只需让它工作......
答案 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;
}
瓦尔特