从简单链表中删除节点

Deleting a node from a simle linked list

如果我有这些结构:

typedef struct item 
{
type data;
struct item *next;
} Item;
typedef struct list 
{
Item *head;
} List;

以及指向我要删除的节点的指针:Item * toDelete,属于列表 List lst, 我可以使用以下函数删除节点吗?:

void delete(Item * toDelete, List * lst){
   Item * tmp=lst->head;
   while (tmp->next!=toDelete){
       tmp=tmp->next;
   }
   tmp->next=toDelete->next;
   free(toDelete);
}

或者换句话说,比较两个结构指针是否合法?

对于初学者这个函数

void delete(Item * toDelete, List * lst){
   Item * tmp=lst->head;
   while (tmp->next!=toDelete){
       tmp=tmp->next;
   }
   tmp->next=toDelete->next;
   free(toDelete);
}

可以调用未定义的行为,因为在 while 循环中没有检查 tmp 是否等于 NULL。其次该函数忽略了要删除的节点等于头节点的情况。

函数可以这样定义

int delete( Item *toDelete, List *lst )
{
    Item **current = &lst->head;

    while ( *current && *current != toDelete )
    {
        current = &( *current )->next;
    }

    int success = *current != NULL;

    if ( success )
    {
        *current = ( *current )->next;
        free( toDelete );
    }

    return success;
}