数据结构之单链表(头结点)的一些常用操作(增删改查逆)

删除指定结点

流程:判断传入数据和pos的位置是否符题意——找到删除位置的前一个结点,找到后要判断所找的位置是否越界——删除指定结点。代码:

//删除指定结点
int Delete_Pos(Node* h, int pos)
{
    if (NULL == h || pos < 1)
    {
        return FALSE;
    }

    Node* tmp = h;
    int i;
    for (i = 0; i < pos - 1; i++)
    {
        if (NULL == tmp->next)
        {
            break;
        }
        tmp = tmp->next;
    }
    if (NULL == tmp)
    {
        printf ("删除位置越界");
        return FALSE;
    }

    Node* p = tmp->next;
    tmp->next = p->next;
    free(p);

    return TRUE;    
}

和头指针的区别:不需要考虑空表的情况。

逆序

流程:先后判断传入数据是否正确,是否为空表,是否只有一个结点——从前往后,3个为一组,将前两个指向调换,以此为循环向后遍历直到结束,结束标志为一组中第二个为NULL——最后一步,将逆序后的最后一个指向NULL,头指针 h 指向逆序后的第一个。(原理和头指针一样,由于头结点的存在导致代码略有不同)
代码:

//逆序
int Reverse_List(Node* h)
{
    if (NULL == h || NULL == h->next
     || NULL == h->next->next)
    {
        return FALSE;
    }

    Node* pre = h->next;
    Node* cur = h->next->next;
    Node* tmp;

    while (cur)
    {   
        tmp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = tmp;
    }

    //最终操作略有差异
    h->next->next = NULL;   
    h->next = pre;

    return TRUE;    
}

删除数据

流程:判断传入数据的准确性——保存头结点的地址,寻找所要删除的数据,并记录下tmp->next——判断记录的是否为空,不为空则删除那个结点
代码:

//删除数据
int Delete_Data(Node* h, LinkData data)
{
    if (NULL == h)
    {
        return FALSE;
    }

    Node* tmp = h;
    while (tmp->next)
    {
        if (data == tmp->next->data)
        {
            break;
        }
        tmp = tmp->next;
    }

    if (NULL == tmp->next)
    {
        return FALSE;
    }

    Node* p = tmp->next;
    tmp->next = p->next;
    free(p);

    return TRUE;
}

查找元素

流程:判断传入数据是否正确——保存第一个结点的地址,遍历知道找到所要找的元素,保存下标。没找到则返回FALSE。代码:

//寻找元素
int Find_Element(Node* h, LinkData data, int* x)
{
    if (NULL == h)
    {
        return FALSE;
    }

    Node* tmp = h->next;
    int k = 1;
    while (tmp)
    {
        if (data == tmp->data)
        {
            *x = k;
        }
        k++;
        tmp = tmp->next;
    }

    return FALSE;
}

获取顺序表中的元素:通过位置获取

流程:判断传入数据的准确性——遍历到pos位置处,将pos处的数据保存到*x中。代码:

// 获取顺序表中的元素:通过位置获取
int Get_Element(Node* h, int pos, int *x)
{
    if (NULL == h || pos < 1)
    {
        return FALSE;
    }

    Node* tmp = h;
    int i;
    for (i = 0; i < pos; i++)
    {
        if (NULL == tmp)
        {
            break;
        }
        tmp = tmp->next;
    }

    //判断tmp是否为空
    if (NULL == tmp)
    {
        return FALSE;
    }
    else
    {
        *x = tmp->data;
    }

    return TRUE;
}

获取长度

流程:判断传入数据是否正确——从第一个节点遍历到最后一个结点,计算共有多少结点。代码:

//获取长度
int Get_Len(Node * h)
{
    if (NULL == h)
    {
        return FALSE;
    }

    int count = 0;
    Node* tmp = h;
    while (tmp->next)
    {
        count++;
        tmp = tmp->next;
    }

    return count;
}

清除列表

流程:利用Delete_Pos一个一个清除。代码:

int Clean_List(Node * h)
{
    if (NULL == h)
    {
        return FALSE;
    }

    Node *tmp = h;
    while (tmp->next)
    {
        Delete_Pos(h, 1);
    }

    return 0;
}

输出显示

// 输出显示
void Display(Node *h)
{
    if (NULL == h)
    {
        return;
    }

    int count = 0;
    Node *tmp = h->next;
    while (tmp)
    {
        printf (++count % 4 ? "%8d" : "%8d\n", tmp->data);

        tmp = tmp->next;
    }
    printf ("\n");
}

销毁链表

原理:利用Clean_List销毁,最后要释放空间,防止内存泄露

//销毁链表
int Destroy(Node *h)
{
    if (NULL == h)
    {
        return FALSE;
    }

    Clean_List(h);
    free(h);

    return TRUE;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值