数据结构之头结点链表的三种插入方式(头插法,尾插法,在pos处插入)

创建头结点

流程:首先创建头结点表指针并为其分配空间——并将头结点指向空,防止出现段错误。
代码:

//创建头结点
Node* Create_List ()
{
    //创建头结点
    Node* list = (Node*) malloc(sizeof(Node) / sizeof(char));


    if (NULL == list)   //检验创建是否成功
    {
        return FALSE;
    }

    list->next = NULL;  //防止段错误

    return list;
}

头插法

流程:判断数据传入是否正确——创建一个新结点并判断结点创建是否成功——给新结点成员变量赋值——让新结点变为链表的第一个结点
代码:

// 头插法
int Insert_Last (Node* h, LinkData data)
{
    // 判断数据传入是否正确
    if (NULL == h)
    {
        return FALSE;
    }

    // 创建新结点并判断创建是否成功
    Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
    if (NULL == node)
    {
        return FALSE;
    }

    // 给结点成员变量赋值
    node->data = data;
    node->next = h->next;   // 和头指针的不同:node->next = *h;

    // 让新结点变为链表的第一个节点
    h->next = node;

    return TRUE;
}

尾插法

流程:判断传入数据是否正确——创建一个新结点并为其分配空间,然后判断创建是否成功——给新结点成员变量赋值——找到最后一个结点并让其成为最后一个节点
代码:

//尾插
int Insert_Last(Node* h, LinkData data)
{
    if (NULL == h)
    {
        return FALSE;
    }

    Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
    if (NULL == node)
    {
        return FALSE;
    }

    node->data = data;
    node->next = NULL;

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

    tmp->next = node;

    return TRUE;
}

中间插法(在pos处插入数据)

流程:判断传入数据和pos的位置是否符题意——找到插入位置的前一个结点,找到后要判断所找的位置是否越界——创建一个新结点并为其分配空间,然后判断创建是否成功——给新结点成员变量赋值——找到最后一个结点并让其成为最后一个结点。代码:

//中间插法
int Insert_Pos(Node *h, int pos, LinkData data)
{
    if (NULL == h)
    {
        return FALSE;
    }

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

    if (NULL == tmp)
    {
        printf ("插入位置越界");
        return FALSE;
    }

    Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
    if (NULL == node)
    {
        return FALSE;
    }

    node->data = data;
    node->next = tmp->next;
    tmp->next = node;

    return TRUE;    
}

头结点的好处就在于他不用考虑空表的情况,详细的注释之前的博客有,这边我就省略了。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值