删除单链表的非尾结点

删除单链表的非尾节点(不能遍历链表)

思路:由于单链的的特性,在不遍历链表的情况下,很难找到要删除节点(Cur)的前一个节点(Pre),在删除该节点(Cur)后,没有办法将该节点之前的节点和之后的节点连接起来,因此我们采用替换删除的方法,就是将该节点(Cur)的下一个节点(Next)得到,然后将下一个节点(Next)的值赋给该节点(Cur),再将下一个节点(Next)删除,该节点(Cur)链接上删除节点(Next)的下一个节点(Next->_Next)就完成删除了,这个方法要求要删除的节点不是尾节点。如果是尾节点那该节点(Cur)的下一个节点(Next)为NULL,不能够进行访问,就不能进行赋值,因此不能是尾节点。

代码实现


编译环境:(Visual Studio 2017)

  • 函数
void DeleteNonEnd(PNode pos)
{
    PNode Del = NULL; 
    if (NULL != pos->_pNext)
    {
        Del = pos->_pNext;
        pos->_data = Del->_data;
        pos->_pNext = Del->_pNext;
        free(Del);
    }
}
  • 测试函数
// 删除单链表的非尾结点 测试
void DeleteNonEnd_test()
{
    PNode pHead = NULL;
    SListInit(&pHead);//初始化函数
    printf("-----非尾节点删除测试-----------------\n");
    printf("原始链表: ");
    SListPushBack(&pHead, 0);//单链表尾插函数
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPrint(pHead);//单链表打印函数

    printf("测试结果: ");
    DeleteNonEnd(Find(pHead, 2)); //Find() 查找函数
    DeleteNonEnd(Find(pHead, 0));
    DeleteNonEnd(Find(pHead, 1));
    DeleteNonEnd(Find(pHead, 4));
    DeleteNonEnd(Find(pHead, 3));
    SListPrint(pHead);
    printf("\n");
}

以上单链表基础操作函数可以在单链表中找到。

  • 测试结果

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值