2012-01-26 2 views
0

Я пытаюсь понять этот код из книги Deitels 5th edition c.Как вставить новый узел в пустой список?

Если я вставляю новый узел в связанный список, почему я устанавливаю nextPtr = * sPtr. Не должен ли первый узел иметь nextPtr из NULL?

Также что означает * sPtr = newPtr?

struct listNode { 
    char data; 
    struct listNode *nextPtr; 
}; 


void insert(ListNodePtr *sPtr, char value) 
{ 

ListNodePtr newPtr; /* pointer to a new node */ 
ListNodePtr previousPtr; /* pointer to a previous a node in list */ 
ListNodePtr currentPtr; /* pointer to current node in list */ 

newPtr = malloc(sizeof(ListNode)); /* create node */ 

if (newPtr != NULL){ /* is space available */ 
    newPtr->data = value; 
    newPtr->nextPtr = NULL; 

    previousPtr = NULL; 
    currentPtr = *sPtr; 

    while (currentPtr != NULL && value > currentPtr->data){ 
     previousPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
    } 

    /* insert new node at beginning of list */ 
    if (previousPtr == NULL){ 
     newPtr->nextPtr = *sPtr; 
     *sPtr = newPtr; 
    } else { /* insert new node between previosuPtr and currentPtr */ 
     previousPtr->nextPtr = newPtr; 
     newPtr->nextPtr = currentPtr; 
    } 

} 
} 

ответ

1

У первого узла не должно быть nextPtr, установленного на NULL, это будет последний узел (после того, как вы должны будете получить от первого до второго узла). nextPtr первого узла указывает на второй узел, который имеет указатель на третий узел и так далее. Поэтому, когда вы вставляете в начало списка, вы позволяете nextPtr нового узла указывать на старое начало списка, которое равно *sPtr. Затем вы устанавливаете указатель, указывающий на начало списка, чтобы указать на новый узел, выполнив *sPtr=newPtr.

+0

Я вижу. Это начинает иметь смысл. – runners3431

+0

@ user995864: Прежде всего, я думаю, что это должно быть '(* sPtr) -> nextPtr', так как' sPtr' является указателем на listpointer. Если новое значение было вставлено в начале '(* sPtr) -> nextPtr', укажет на то, что' * sPtr' было до вставки. Для пустого списка (* sPtr) будет 'NULL' в начале вставки, поэтому в этом случае' (* sPtr) -> nextPtr' будет 'NULL' впоследствии. – Grizzly

+0

Хорошо. Я думал, что * sPtr имеет значение в списке пустых узлов. Забыл, что он был нулевым по первому вставленному значению. Это полностью разъясняет это! Спасибо! Ненависть быть новичком, но я добираюсь туда так медленно! – runners3431

1

Новый узел вставляется в начале списка, так что следующие пункты в начале списка, а начало списка устанавливается, чтобы указать на новый узел, например:

если у вас есть b-> с

И вы хотите вставить, сначала точку б a-> b-> с

затем установить список, чтобы указать на list-> а -> b-> c

1

Если вы имеете в виду строку newPtr->nextPtr = *sPtr, то это код для случая, когда новое значение данных меньше, чем что-либо еще в списке, и узел должен быть вставлен в начале. Новые узлы nextPtr должны указывать на то, что раньше было первым узлом в списке (newPtr->nextPtr = *sPtr), а начало должно измениться на новый узел (*sPtr = newPtr). Код выглядит хорошо для меня.

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