2013-12-20 4 views
0

Ниже приведен код для вставки узла в двусвязный список.Двунаправленный список указателей Путаница

struct dllist 
{ 
    int data; 
    struct dllist *prev, *next; 
}; 


void DLLInsert(struct dllist **head, int position, int data) 
{ 
    int k = 1; 
    struct dllist *temp, *newNode; 
    newNode = (struct dllist *)malloc(sizeof(struct dllist)); 
    if (!newNode) 
    { 
     printf("Memory Error\n"); 
    } 
    newNode->data = data; 
    if (position == 1) 
    { 
     newNode->next = *head; 
     newNode->prev = NULL; 
     *head = newNode; 
     return; 
    } 
    else 
    { 
     temp = *head; 
     while (temp->next != NULL && k < position - 1) 
     { 
      k++; 
      temp = temp->next; 
     } 
     if (temp->next == NULL) 
     { 
      temp->next = newNode; 
      newNode->prev = temp; 
      newNode->next = NULL; 
     } 
     else 
     { 
      newNode->prev = temp; 
      newNode->next = temp->next; 
      temp->next = newNode; 
      temp->next->prev = newNode; 
     } 
    } 
} 

Я немного запутался в основных операциях указателя, являющихся новичком. Голова передается на функцию, чтобы изменить ее. Но в случае, когда позиция> 1, копия * head (temp) используется для изменения списка по сравнению со случаем, когда позиция == 1. Может ли кто-нибудь объяснить мне, почему это так?

Благодаря

+1

В одном случае вам нужно только изменить то, на что указывает указатель '* head'. В другом случае вам нужно изменить сам указатель. (Нарисуйте два случая на бумаге с помощью ящиков и стрелок, и вы поймете, почему.) –

ответ

1

Когда позиция> 1, температура устанавливается на *head, и итерацию код temp через связанный список с узлом в индексе position. Фактически вы изменяете узел по индексу position.

Когда позиция = 1, вы изменяете головной узел, поэтому вам не нужно итерации.

+0

@ unlephant-Спасибо за объяснение. Таким образом, это означает, что я могу изменить элементы структуры (а именно данные, следующий и предыдущий), передав * head функции, но чтобы изменить * head, мне нужно передать ** head. Я прав? –

+0

Да, но я не вижу, как это связано с этим вопросом о связанных списках. Чтобы использовать 'DLLInsert()', вы всегда будете передавать 'struct dlllist **' как 'head'. – irrelephant

1

В случае position==1 ваш новый элемент станет новой головой. Вы уже точно знаете, где это. В противном случае вам нужно найти позицию.

temp = *head; 
     while (temp->next != NULL && k < position - 1) 

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

temp = temp->next; 

Первый элемент присваиваемое temp является head, но он заменяется на следующий элемент в каждой итерации.

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