数据结构:链表(删除,C语言实现)

链表的删除和插入一样是链表的重要的操作之一,也是链表相对于顺序表的方便之处。

void deletelinkedlist(LINKED_LIST* list, int index) {  
    if (index < 0 || index >= list->size) {  
        printf("INVALID\n");  
        return;  
    }  
    if (index == 0) {  
        LINK_NODE next = list->head->next;  
        free(list->head);  
        list->head = next;  
    } else {  
        LINK_NODE current = list->head;  
        for (int i = 0; i < index-1; i++) { // 循环应该到达要删除的节点的前一个节点  
            current = current->next; // 移动到下一个节点  
        }  
        LINK_NODE temp = current->next; // temp 指向要删除的节点  
        current->next = temp->next; // 更新 current 的 next 指针以跳过 temp 指向的节点  
        free(temp); // 释放要删除的节点内存空间  
    }  
    list->size--; // 更新链表大小信息  
} 

如果没看过之前的插入操作的uu可以去看看之前有图的插入操作详解,这里有了插入的基础,删除理解起来就更加容易一些。

首先还是对下标的合法性进行判断,然后先定义一个操作指针current来遍历链表,定义next指针为current->next->next。这里的current相当于是要被删除的节点的前驱的地址,current->next(temp)相当于是待删除节点的地址,current->next->next(temp->next)相当于是待删除节点的后继的地址,我们要做的首先是把temp->next赋值给current->next,然后,把待删除节点(也就是NODE index)的内存给释放掉,也就是把前驱和后继连接起来,这样就好了。注意,由于要释放内存,因此要先把后继的地址current->next->next存储到新的变量里面,并且先对待删除节点进行操作。

这样就完成了一次链表的删除过程。哦,最后别忘了把链表的长度减一和对index=0进行单独讨论。

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值