C 从简单链接列表中删除节点

C 从简单链接列表中删除节点,c,pointers,linked-list,singly-linked-list,function-definition,C,Pointers,Linked List,Singly Linked List,Function Definition,如果我有这些结构: 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; whi

如果我有这些结构:

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;
}

如果它们是同一类型的,那是合法的。那么,在你的情况下,我也可以这样写吗?void deleteItem*toDelete,List*lst{Item*tmp=lst->head;如果toDelete==lst->head{lst->head=lst->head->next;freetoDelete;}否则{while tmp&&tmp->next!=toDelete{tmp=tmp->next;}`tmp->next=toDelete->next;`freetoDelete;}