в этой функции правильный указатель не возвращается к вызывающей функции - PullRequest
2 голосов
/ 26 марта 2019

проблема в том, что когда я печатаю список после удаления узла, функция печати печатает 0 вместо удаленного узла ..... но я хотел, чтобы он ничего не печатал.

// the function call is delete_from_key(&head,i);
//node is struct linked_list
void delete_from_key(node *head, int key)
{
    node *new, *temp;
    if(head == NULL)
    {
        printf("nothing to delete . the list is empty.\n");
        return;
    }
    else if(head->num == key)
    {
        temp=head;
        head=temp->next;
        free(temp);
        return;
    }
    new=search_key(head, key);//search_key returns pointer node holding the key.
    if(new != NULL)
    {
        temp = new;
        new = new->next;
        free(temp);
        return;
    }
}

пример:

список 1-> 2-> 3-> 4-> 5->
если бы я вызвал эту функцию с ключом 2
ожидаемый результат 1-> 3-> 4-> 5->
вместо этого фактический результат равен 1-> 0-> 3-> 4-> 5->

Ответы [ 2 ]

4 голосов
/ 26 марта 2019

Вам необходимо обновить next предыдущего узла, так как он next удаляется.

prev_node=search_key(head, key);//search_key returns pointer to the node just before the node holding the key.

if(prev_node!= NULL)
{
    // prev_node->next is the one that needs to be deleted
    temp = prev_node->next; 

    //Make the prev node point to the next node of the one that's getting deleted
    prev_node->next = temp->next; 

    free(temp);
    return;
}
3 голосов
/ 26 марта 2019

Первая ошибка

head=temp->next;

Поскольку head является локальным параметром, это назначение изменяет этот локальный параметр. Вам нужно изменить указатель, переданный функции, поэтому ваш код должен быть:

void delete_from_key(node **head, int key)
    //...
    *head=temp->next;
    //...

2-й жук

new = new->next;

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

Если search_key действительно возвращает указатель на узел до найденного ключа, который вам нужен

temp = new->next;
new->next = new->next->next;
free(temp);
...