Я практикую связанные списки, и этот код предоставлен нам нашим лектором из книги Пирсона.
struct listNode {
char data;
struct listNode *nextPtr;
};
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
...
char delete( ListNodePtr *sPtr, char value )
{
ListNodePtr previousPtr;
ListNodePtr currentPtr;
ListNodePtr tempPtr;
/* delete first node */
if ( value == ( *sPtr )->data ) {
tempPtr = *sPtr;
*sPtr = ( *sPtr )->nextPtr;
free ( tempPtr );
return value;
}
else{
previousPtr = *sPtr;
currentPtr = ( *sPtr )->nextPtr;
/* loop to find correct location in the list */
while ( currentPtr != NULL && currentPtr->data != value ) {
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}
/* delete node at currentPtr */
if ( currentPtr != NULL ) {
tempPtr = currentPtr;
previousPtr->nextPtr = currentPtr->nextPtr;
free ( tempPtr );
return value;
}
}
return '\0';
}
Я не понимаю, почему мне нужно использовать «tempPtr». Не могу я просто сделать:
/* delete first node */
if ( value == ( *sPtr )->data ) {
*sPtr = ( *sPtr )->nextPtr;
free ( *sPtr );
return value;
}
и
if ( currentPtr != NULL ) {
previousPtr->nextPtr = currentPtr->nextPtr;
free ( currentPtr );
return value;
}
(то, что передается в функцию delete
, это объект LinkedListPtr
, определенный в main
и переданный ссылка. Ответственный за хранение адреса первого элемента в списке.)