【问题标题】:Deleting a node from a simle linked list从简单链表中删除节点
【发布时间】:2020-07-26 11:36:14
【问题描述】:

如果我有这些结构:

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

或者换句话说,在结构的两个指针之间进行比较是否合法?

【问题讨论】:

  • 如果它们是相同的类型是合法的。所以,你的情况是合法的

标签: c pointers linked-list singly-linked-list function-definition


【解决方案1】:

对于初学者来说这个功能

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 delete(Item * toDelete, List * lst){ 项目 * tmp=lst->head; if (toDelete==lst->head){ lst->head=lst->head->next;免费(删除); } else{ while (tmp&&tmp->next!=toDelete){ tmp=tmp->next; } ` tmp->next=toDelete->next;` free(toDelete); }
猜你喜欢
  • 2020-08-11
  • 2020-02-04
  • 2023-03-15
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多