我在更改结构中指针的地址时遇到问题。 函数接收服务类型(指向结构的指针)和ID。该服务包含一个类型公寓的链接列表(指向公寓结构的指针),我想找到具有给定ID的公寓并将其从列表中删除。问题是 - 当我回到原来的功能,service-> listedApartment仍然指向与以前相同的方式..
ApartmentServiceResult serviceDeleteById(ApartmentService service, int id) {
Node previous = NULL;
Node after = NULL;
Node current = service->listedApartments;
while (current != NULL) {
after = current->next;
if (current->id == id) {
apartmentDestroy(current->apartment); //deletes the apartment
free(current);
if (previous == NULL) {
service->listedApartments = after;
} else {
previous->next = after;
service->listedApartments=previous;
}
return APARTMENT_SERVICE_SUCCESS;
}
previous = current;
current = current->next;
}
return APARTMENT_SERVICE_NO_FIT;
}
答案 0 :(得分:1)
您确定要传递参考资料吗?
使用此行,您可以按值传递结构,这意味着该函数将复制传递的参数并修改它,而不会更改外部值。
ApartmentServiceResult serviceDeleteById(ApartmentService service, int id) {
要通过引用传递,您必须明确地放置*并相应地处理引用:
ApartmentServiceResult serviceDeleteById(ApartmentService * service, int id) {
除非你使用typedef做了一些魔术,否则我想这可能是问题所在。
答案 1 :(得分:1)
删除(未在OQ中显示)typedef,并仅使用struct xx*
和struct yy*
,片段可以简化为:
ApartmentServiceResult serviceDeleteById(struct xx *service, int id) {
struct yy **pp, *p;
for (pp= &service->listedApartments; (p = *pp); pp = &p->next) {
if (p->id != id) continue;
apartmentDestroy(p->apartment);
*pp = p->next; /* steal the pointer */
free(p);
return APARTMENT_SERVICE_SUCCESS;
}
return APARTMENT_SERVICE_NO_FIT;
}
答案 2 :(得分:0)
在链接列表中,首先要记住的是,每次调用函数时都必须通过ref调用,因为您希望链接列表中的操作和函数serviceDeleteById
按值接收其参数。所以修改它并尝试运行代码。
void del(int d)
{
struct node *temp,*ptr;
temp=start;
while(temp!=NULL)
{
if(temp->link->info==d)
{
ptr=temp->link;
temp->link=ptr->link;
free(ptr);
}
temp=temp->link;
}
}
此代码示例将帮助您处理代码。您可以查看more here。