数据结构之头指针链表的逆序、输出和指定位置的删除

头指针链表指定位置的删除
实现:1,先判断传入的数据是否正确,然后再判断是否为空表,最后判断pos的值是否满足题意 2,分删除位置为1和不为1讨论:为1时,直接将h指向第二个节点并释放第一个节点的空间(定义一个tmp指向第一个节点);不为1时,找到插入位置的前一个节点(利用tmp遍历),其中需要考虑pos的值是否会造成越界 3,最后删除pos处的节点,注意释放空间防止内存泄漏。

// 删除pos处的节点
int Delete_Pos(Node** h, int pos)
{
    // 判断传入数据是否正确、是否为空表、pos是否合题意
    if (NULL == h || NULL == *h || pos < 1)
    {
        return FALSE;
    }

    Node* tmp = *h;     // 用于保存指针
    // 如果删除的第一个
    if (1 == pos)
    {
        *h = tmp->next;         // h指向第二个节点
        free(tmp);  // 释放空间
    }
    else
    {
        int i;
        for (i = 0; i < pos - 2; i++)  // tmp遍历到pos前一个节点
        {
            // 如果tmp->next不为空,那tmp也不为空
            if (NULL == tmp->next)
            {
                break;
            }
            tmp = tmp->next;
        }

        if (NULL == tmp->next)  // 如果tmp->next为空则结束
        {
            printf ("删除位置越界\n");
            return FALSE;
        }

        Node* p = tmp->next;    // p用来保存删除位置的指针,释放空间用
        tmp->next = p->next;    //pos处节点一处链表
        free(p);                // 释放删除节点的空间
    }

    return TRUE;
}

头指针链表的逆序
实现:先判断传入数据的正确性,然后判断是否是空表,最后判断是否只有一个节点——从前往后,3个为一组,将前两个指向调换,以此为循环向后遍历直到结束,结束标志为一组中第二个为NULL——最后一步,将逆序后的最后一个指向NULL,头指针 h 指向逆序后的第一个。

// 逆序
int Reverse_List(Node** h)
{
    //  *h==NULL代表空表  (*h)->next代表只有一个节点
    if (NULL == h || NULL == *h ||NULL == (*h)->next)
    {
        return FALSE;
    }

    // 定义3个指针来实现逆序
    Node* pre = *h;
    Node* cur = (*h)->next;
    Node* tmp;

    while (cur)             // 从前往后依次逆序
    {
        tmp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = tmp;
    }

    // 头尾的处理
    (*h)->next = NULL;      // 将第一个节点指向NULL
    *h = pre;               // 头指针 h 指向最后一个节点

    return TRUE;
}

头指针链表的输出

//输出函数
void Display(Node* h)
{
    if (NULL == h)      //判断传入数据是否正确
    {
        return;
    }

    int count = 0;      //计数初始化
    while (h)
    {
        printf (++count % 4 ? "%8d" : "%8d\n", h->data);
        h = h->next;
    }
    putchar ('\n');
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值