>我注意到在创建它的第一个重复检查后,接下来两者都指向同一个哺乳动物,所以当我调用great_circle计算出两者之间的距离时,我得到了一个 0 的列表,因为它正在比较相同的哺乳动物。
void remove_duplicates() {
int i,j;
double distance;
Mammal *next=head2.pointer;
for(i=0;i<list_length2-1;i++) {
Mammal *check=next->pointer;
Duplicate *d=malloc(sizeof(Duplicate));
d->mampointer=NULL;
d->number_of=0;
for(j=0;j<(list_length2-i)-1;j++) {
distance=great_circle(next->location, check->location);
if(distance<=0.02 && next->species==check->species) {
Mammal *a=next;
Mammal *b=check;
a->pointer=d->mampointer;
d->mampointer=a;
b->pointer=d->mampointer;
d->mampointer=b;
d->number_of++;
d->number_of++;
}
printf("%fn",distance);
if (check->pointer!=NULL) {
check=check->pointer;
}
}
if(d->mampointer!=NULL) {
add_duplicate(create_duplicate(d));
}
if (next->pointer!=NULL) {
next=next->pointer;
}
}
}
似乎检查指向与下一个相同的内存,这不应该发生,检查应该始终在下一个之后。
编辑:我试图解决的问题是:
有几种哺乳动物具有经纬度坐标,
一些哺乳动物已被多次报道,但坐标略有不同,
我必须找到这些重复项,并用具有"错误"坐标平均值的单个哺乳动物替换它们。
看看这个链接:http://www.cprogramdevelop.com/2252274/这将帮助您遍历链表,而无需像head2
等冗余(和令人困惑)的指针。
乍一看,Kozmik 的评论似乎check->pointer
应该check->next
是正确的 - 但同样,尽量避免多余的指针,除非它使代码可读。
我发现遍历链表的一种优雅方法是在cur_node->next == NULL
时停止,而不是允许"空"节点并必须检查是否cur_node->next->item == NULL
(我假设cur_node->pointer
指的是您存储在该节点中的项目)。
例如:
typedef struct node_s {
void * item; // the item you are storing in this node
node_s * next; // the next node
} Node;
typedef struct list_s {
void * head;
/* maybe some extra info like size etc */
} List;
然后遍历很容易:
List * list = malloc(sizeof *list);
list->head = NULL;
/*
create your first node etc, add to list in the obvious way.
...
add more nodes
...
*/
//traversal
Node ** head = &list->head;
while (*head) { //we have a non-null node so keep going...
Node *cur_node = *head;
head = &cur_node->next;
/* do stuff with current node (even delete it!). */
}
这样非常简单,只需要担心两个指针(head
和cur_node
)。