2016-04-14 2 views
-3

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

Заранее спасибо.

Node* Delete(Node *head, int position) 
{ 
    int count=0; 
    Node* temp, *temp1, *temp2; 
    temp = head ; 
if(head==NULL){ 
    return 0; 
    } 
else if(position == 0) 
    { 

    head = head->next; 
    free(temp); 
    return head; 
} 
    else{ 
     while(count!= position-1) 
     { 
     temp = temp->next; 
     count++; 
    } 
    temp1 = temp->next; 
    temp->next = temp1->next; 

    free(temp1); 
    return temp; 
} 

return head; 
} 
+0

* Как это не работает? Вы получаете ошибки сборки? Сбои? Вы пробовали работать в отладчике? Пройдя через код по строкам, чтобы увидеть, где он ошибается? –

+0

Пожалуйста, определите желаемое поведение. Какова должна быть обратная стоимость? – MikeCAT

+2

Мое предположение: 'return temp;' следует удалить. – MikeCAT

ответ

1

Заменить return temp; с return head; также включает в себя логику для обработки, если есть узлы меньше, чем положение.

3

Во-первых, правильно отформатируйте свой код.

Затем удалите return temp; так, чтобы прежняя часть списка не была потеряна.

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

Node* Delete(Node *head, int position) 
{ 
    int count=0; 
    Node *temp, *temp1, *temp2; 
    temp = head; 
    if(head==NULL){ 
    return NULL; 
    } 
    else if(position == 0) 
    { 
    head = head->next; 
    free(temp); 
    } 
    else{ 
    while(count!= position-1) 
    { 
     temp = temp->next; 
     count++; 
    } 
    temp1 = temp->next; 
    temp->next = temp1->next; 

    free(temp1); 
    } 

    return head; 
} 

Обратите внимание, что return 0; справедливо, поскольку 0 является нулевой константный указатель (N1256 6.3.2.3 указатели) и преобразование его в указатель определен, но с использованием NULL лучше, потому что он будет делать это ясно, что он имеет дело с указателем.

1

Я просто хотел бы добавить ответ MikeCAT. Вы также должны обработать условие, когда количество узлов меньше, чем позиция.

Один из способов сделать это может быть:

while(count!= position-1) { temp = temp->next; if(temp == NULL) return head; count++; }

0

Удалить return temp и писать return head. Кроме того, проверьте условие, если позиция больше, чем количество узлов в связанном списке. Также перед освобождением указателя я бы предложил добавить temp1->next=NULL, а затем free(temp1).

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