2016-10-12 2 views
0

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

Спасибо за помощь!

int main() { 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeListMembers(head); 
    freeListHead(&head); 

    return 0; 
} 

int createList(struct node **head) { 
    //create list 
    return 0; 
} 

void freeListMembers(struct node *head){ 
    while(head->next != NULL){ 
     head->next = NULL; 
     free(head->next); 
    } 
    return; 
} 

void freeListHead(struct node **head) { 
    *head = NULL; 
    free(*head); 
    return; 
} 

вот код, который я хочу работать, но нет. проблема, которую я вижу, является ошибкой для «* head-> next;» где ВОФК «выражение должно иметь указатель на структуру типа или союзное»

int main() { 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeAllListMembers(&head); 

    return 0; 
} 

int createList(struct node **head) { 
    //create list 
    return 0; 
} 

void freeAllListMembers(struct node **head){ 
    while (head != NULL) { 
     struct node *temp = *head->next; 
     free(*head); 
     *head = temp ; 
    } 
    return; 
} 
+0

Вы * сделать * есть функция, которая освобождает голову и всех членов. Он называется 'main()'. Ваш вопрос будет более ясным и предоставит больше возможностей для ответов, если вы представите что-то, что вы попробовали, и поэтому оно имеет форму, которую вы хотите, но это не работает для вас. –

+0

@JohnBollinger Спасибо! Я добавил код, который я хочу работать выше – skevthedev

ответ

1

Из кода:

void freeListMembers(struct node *head){ 
    while(head->next != NULL){ 
     head->next = NULL; 
     free(head->next); 
    } 
    return; 
} 

Это освободив NULL, а не ваш узел *.

Освобождение списка так же просто, как использование временного указателя на следующий узел.

while (head) { 
    node* next = head->next; 
    free(head); 
    head = next; 
} 

С вашего редактирования:

void freeAllListMembers(struct node **head){ 
    while (head != NULL) { 
     struct node *temp = *head->next; 
     free(*head); 
     *head = temp ; 
    } 
    return; 
} 

Есть несколько ошибок с этим. Это должно быть while (*head != NULL) и (*head)->next. Первая - логическая ошибка, потому что голова всегда будет не-NULL, а вторая является синтаксической ошибкой, потому что вам нужно разыменовать указатель головы перед тем, как перейти к следующему указателю.

+0

Спасибо @MarcD, я изначально пробовал ваши предложения, но это не сработало, я добавил свой код в свой выше поток с небольшим количеством информации – skevthedev

+0

Я отредактировал свой ответ, чтобы показать вам, что было не так с кодом, который вы пробовали. – MarcD

+0

это сработало! спасибо, (head! = NULL) была просто опечаткой, но (* head) -> следующая была той частью, которую я отсутствовал, для чего вам нужны паратенсы? что именно это делает? Я также думал об установке * head = NULL; перед свободным (* голова) ;. Я прочитал, что лучше всего установить указатель на нуль, прежде чем освободить его, будет ли это правильно и для моей ситуации? – skevthedev

0

Это будет работать. Вы просто установите следующую голову в нулевую и освобожденную голову. Теперь мы не можем перейти к второму элементу. Таким образом, мы не сможем освободить узлы. Также проверьте базовое условие. Я надеюсь, что это помогает

void freeListmembers(node *head){ 
node *temp=head; 
if(head==NULL)//Base condition 
return; 
while(head->next!=NULL){ 
temp=head;//Moved temp to head. we will move head to next and free the previous node 
head=head->next; 
free(temp); 
} 
free(head); 
return; 

}

+0

Это не очень четкий или сжатый способ освободить список. Это работает, но очень круто. – MarcD

+0

Согласен. Но я пробовал модифицировать, думая о человеке, который задал вопрос. Чтобы он мог знать, что он делает. –