数据结构---单向链表

单向链表

cs 复制代码
//链表的创建
Link_t *create_link()
{
    Link_t *plink = malloc(sizeof(Link_t));
    if(NULL == plink)
    {
        perror("fail plink");
        return NULL;
    }
    plink->phead = NULL;
    plink->clen = 0;
    return plink;
}
cs 复制代码
//头插
int push_link_head(Link_t *plink, DataType data)
{
    Link_Node_t *pnode = malloc(sizeof(Link_Node_t));
    if(NULL == pnode)
    {
        perror("fail malloc");
        return -1;
    }
    pnode->data = data;
    pnode->pnext = NULL;

    pnode->pnext = plink->phead;
    plink->phead = pnode;
    plink->clen++;

    return 0;
}
cs 复制代码
//尾插
int push_link_end(Link_t *plink, DataType data)
{
    Link_Node_t *p = plink->phead;
    if(p == NULL)
    {
        push_link_head(plink, data);
    }
    else
    {
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        Link_Node_t *pnode = malloc(sizeof(Link_Node_t));
        if(NULL == pnode)
        {
            perror("fail pnode");
            return -1;
        }
        p->pnext = pnode;
        pnode->pnext = NULL;
        pnode->data = data;
        plink->clen++;
    }
    return 0;
}
cs 复制代码
//头删
int push_head_pop(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    if(p == NULL)
    {
        return 0;
    }
    else
    {
        plink->phead = p->pnext;
        free(p);
    }
    plink->clen--;
    return 1;
}
cs 复制代码
//尾删
int push_end_pop(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    if(p == NULL)
    {
        return 0;
    }
    else if(p->pnext == NULL)
    {
        push_head_pop(plink);
    }
    else
    {
        while(p->pnext->pnext != NULL)
        {
            p = p->pnext;
        }
        free(p->pnext);
        p->pnext = NULL;
    plink->clen--;
    }
    return 1;
}

在进行排序时,一次遍历结束指针指到了结尾,要重新把指针归到头节点,否则排序不成功。

cs 复制代码
//排序
void push_sort(Link_t *plink)
{
    if(1 == plink->clen || plink->phead == NULL)
    {
        return;
    }
    Link_Node_t *pinsert = NULL;
    Link_Node_t *ptmp = plink->phead->pnext;
    plink->phead->pnext = NULL;
    while(ptmp != NULL)
    {
    Link_Node_t *p = plink->phead;
        pinsert = ptmp;
        ptmp = ptmp->pnext;
        if(p->data > pinsert->data)
        {
            pinsert->pnext = plink->phead;
            plink->phead = pinsert;
        }
        else
        {
            while(p->pnext != NULL && p->pnext->data < pinsert->data)
            {
                p = p->pnext;
            }
            pinsert->pnext = p->pnext;
            p->pnext = pinsert;
        }
    }
}
相关推荐
码匠许师傅6 分钟前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试
依然鸣15 分钟前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试
QCodingDev28 分钟前
Spring AI Alibaba ReAct Agent实战:从Tool Calling到Agent,企业AI复杂业务该如何设计?
java·人工智能·agent·ai编程·spring ai
RainCity40 分钟前
Java Swing 自定义组件库分享(十六)
java·笔记·后端
Brilliantwxx1 小时前
【算法从零到千】【51-54】逆序对(分治+递归算法)
数据结构·算法·排序算法
小星星闪亮登场1 小时前
2026河南萌新联赛第四场--南阳理工学院
数据结构·算法·贪心算法·动态规划·哈希算法·广度优先
土司大王1 小时前
LeetCode hot100——两数之和
数据结构·算法·leetcode
赵广陆2 小时前
企业实战:Markdown图片检索
android·java·开发语言
C++、Java和Python的菜鸟2 小时前
第3章 从0开始用若依
java·开发语言
wabs6662 小时前
关于字符串【力扣344.反转字符串的思考】
数据结构·算法·leetcode