在结构中链接List

时间:2016-04-09 12:19:05

标签: c pointers struct linked-list

我在更改结构中指针的地址时遇到问题。 函数接收服务类型(指向结构的指针)和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;
}

3 个答案:

答案 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