2016-04-09 2 views
0

У меня возникла проблема с изменением адреса указателя в структуре. Функция получает тип услуги (указатель на структуру) и идентификатор. Услуга содержит связанный список квартир типа (указатель на структуру квартиры), и я хочу найти квартиру с данным ID и удалить ее из списка. Проблема это- когда я вернуться к исходной функции, сервис-> 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

@wildplasser - Если вы заметили, что есть возвращение в конце этого оператора if. Поэтому это не должно быть проблемой –

+0

К сожалению, я смутился тем, что '{}', как мне кажется. И насыпь вспомогательных переменных, и конечный 'p = p.next; ' , – wildplasser

ответ

1

Вы уверены, что вы передаете ссылку?

С помощью этой строки вы передаете свою структуру по значению, что означает, что функция сделает копию переданного параметрирования и изменит ее, не изменяя значение снаружи.

ApartmentServiceResult serviceDeleteById(ApartmentService service, int id) { 

Чтобы пройти по ссылке, вы должны явно поставить * и обработать ссылку соответственно:

ApartmentServiceResult serviceDeleteById(ApartmentService * service, int id) { 

Если вы не сделали некоторые магии с ЬурейиМ, я предполагаю, что это могло бы быть проблемой.

+0

Дело в том, что сервис уже является указателем на структуру. @Denilson Mello – shira

+0

О, радости типизированных указателей! – wildplasser

+0

Радость колледжа. – shira

1

Удаление (не показано на OQ) определений типов, и используя только 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; 
} 
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.

Смежные вопросы