单双链表的增加删除

1>单链表

增加操作:
int list_insert_head(LinkListPtr L, datatype e)
{
    //判断逻辑
    if(NULL == L)
    {
        printf("所给链表不合法\n");
        return 0;
    }

    //调用申请结点封装数据
    LinkListPtr p = node_buy(e);
    if(NULL==p)
    {
        return 0;
    }

    //结点已经准备好,头插逻辑
    p->next = L->next;
    L->next = p;

    //表的变化
    L->len++;

    printf("插入成功\n");
    return 1;
}

删除操作:
int list_delete_head(LinkListPtr L)
{
    //判断逻辑
    if(NULL==L || list_empty(L))
    {
        printf("删除失败\n");
        return 0;
    }

    //删除逻辑
    //1、标记要删除的结点
    LinkListPtr p = L->next;
    //2、孤立要删除的结点
    L->next = p->next;  //L->next = L->next->next;
    //释放要删除的结点
    free(p);
    p = NULL;

    //表长变化
    L->len--;
    printf("删除成功\n");
    return 1;
}

2>双向链表

增加:
int list_insert_head(DoubleLinkPtr L, datatype e)
{
    //判断逻辑
    if(NULL==L)
    {
        printf("所给链表不合法\n");
        return 0;
    }

    //申请结点封装数据
    DoubleLinkPtr p = node_buy(e);
    if(NULL == p)
    {
        return 0;
    }

    //头插操作
    if(list_empty(L))
    {
        //链表为空,执行插入
        p->prio = L;
        L->next = p;

    }else
    {
        //链表非空
        p->next = L->next;
        p->prio = L;
        L->next->prio = p;
        L->next = p;
    }

    //表长变化
    L->len++;

    printf("插入成功\n");
    return 1;
}

删除:
int list_delete_pos(DoubleLinkPtr L, int pos)
{
    //判断逻辑
    if(NULL==L || list_empty(L) || pos<1 || pos>L->len)
    {
        printf("删除失败\n");
        return 0;
    }

    //找到要删除的结点
    DoubleLinkPtr q = list_search_pos(L, pos);

    //判断是否是最后一个结点
    if(q->next == NULL)
    {
        q->prio->next = NULL;
    }else
    {
        q->prio->next = q->next;
        q->next->prio = q->prio;
    }

    //释放自己
    free(q);
    q = NULL;

    //表长变化
    L->len--;
    printf("删除成功\n");
    return 1;
}

你可能感兴趣的:(链表,c语言)