从简单链表中删除节点
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;
}
如果我有这些结构:
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;
}