2013-03-29 2 views
1
Status ListDelete(LinkList *L, int i, int *e) 
{ 
    int j=0; 
    LinkList p=L,q; 
    while(p->next && j > i-1) 
    { 
    p = p->next; 
    j++; 
    } 

    if(!p->next||j>i-1) 
    return ERROR; 
    q=p->next; 
    p->next=q->next; 
    *e=q->data; 
    free(q); 
    return OK; 
} 

Код указан верно, но мне нужно пояснить изменение позиции указателя p.

Мой вопрос:
, если я хочу, чтобы удалить второй (i=2) элемент в linklist, то условие в while() впервые должен быть (j<i-1 => 0<2-1), поэтому на самом деле, это время выполнять только один раз, но р в то время цикл уже указывает на второй элемент, поэтому я считаю, что q->next должен указывать на третий элемент.

Когда я выполняю код, он работает хорошо, если вход i = 2, он удалит второй элемент, но в моем понимании он должен удалить третий элемент. Зачем?Неисправности положения указателя указателя (указателя)

+0

'LinkList p = L' ->' LinkList * p = L' – BLUEPIXY

ответ

0

Вторая часть условия цикла сообщает код, сколько элементов цикл должен пропустить перед удалением. Когда вам нужно удалить второй элемент, вам нужно пропустить один элемент перед ним. В общем случае, чтобы удалить номер элемента N, вам нужно пропустить элементы N-1.

+0

Я пропустил одно важное условие, этот linklist имеет элемент заголовка. поэтому третье положение должно содержать второй элемент. – albert

+0

@albert Это имеет смысл: поэтому код удаляет 'q', который установлен в' q = p-> next', а не 'p'. – dasblinkenlight

0

Из-за i-1, что делает i = 1, что указывает на второй элемент в списке. НТН.

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