数据结构——单链表查询、逆序、排序

1、思维导图

2、查、改、删算法

复制代码
//快慢排序法找中间值
int mid_link(Link_t *plink)
{
    Link_Node_t *pfast = plink->phead;
    Link_Node_t *pslow = pfast;
    int m = 0;
    while(pfast != NULL)
    {
        pfast = pfast->pnext;
        ++m;
        if(m % 2 == 0)
        {
            pslow = pslow->pnext;
        }
    }
    printf("%d\n",pslow->data);
    printf("%p\n",pslow);
        
}


//快慢排序法查询倒数第k个
Link_Node_t *recipe_link_count(Link_t *plink)
{
    Link_Node_t *pfast = plink->phead;
    Link_Node_t *pslow = pfast;
    int m = 0;
    int n;
    scanf("%d",&n);
    while(pfast != NULL && m < n)
    {
        pfast = pfast->pnext;
        m++;
    }
    while(pfast != NULL)
    {
        pfast = pfast->pnext;
        pslow = pslow->pnext;
    }
    //printf("%d\n",pslow->data);
    //printf("%p\n",pslow);
    return pslow;
}


//删除指定节点
int pop_point_node(Link_t *plink)
{
    int n;
    int m = 0;
    printf("选择删除节点:");
    scanf("%d",&n);
    Link_Node_t *p = plink->phead;
    Link_Node_t *pdel = NULL;
    Link_Node_t *ptmp = NULL;
    if(p == NULL)
    {
        return 0;
    }
    else if(p->data == n)
    {
        pdel = p;
        plink->phead = p->pnext;
    }
    else if(p != NULL)
    {
        while(p->data != n)
        {
            ptmp = p;
            p = p->pnext;
        }
        pdel = p;
        ptmp->pnext = pdel->pnext;
    }
            free(pdel);
    return 0;
}

3、单链表逆序

复制代码
//链表逆序
int reverse_link(Link_t *plink)
{
    if(is_empty_link(plink))
        return 0;
    Link_Node_t *ptmp = plink->phead;
    Link_Node_t *pinsert = NULL;
    plink->phead = NULL;
    while(ptmp != NULL)
    {
        pinsert = ptmp;
        ptmp = ptmp->pnext;
        pinsert->pnext = plink->phead;
        plink->phead = pinsert;
    }
}

4、插入排序(从未排序部分取出一个元素,插入到已排序部分的正确位置)

复制代码
void insert_sort_link(Link_t *plink)
{
    if(is_empty_link(plink) || 1 == plink->clen)
    {
        return;
    }
    Link_Node_t *ptmp = plink->phead->pnext;
    Link_Node_t *pinsert = NULL;
    Link_Node_t *p = NULL;
    plink->phead->pnext = NULL;
    while(ptmp != NULL)
    {
    pinsert = ptmp;
    ptmp = ptmp->pnext;
    if(pinsert->data <= plink->phead->data)
    {
        pinsert->pnext = plink->phead; //头插
        plink->phead = pinsert;
    }
    else
    {
        p = plink->phead;
       while(p->pnext != NULL && p->pnext->data < pinsert->data)
       {
           p = p->pnext;
       }
        pinsert->pnext = p->pnext;  //尾插
        p->pnext = pinsert;   
    }
    }
}

双向链表------插删查改:

复制代码
#include<stdio.h>
#include"dlink.h"
#include<stdlib.h>

DLink_t *create_doulink()
{
    DLink_t *pdoulink = malloc(sizeof(DLink_t));
    if(NULL == pdoulink)
    {
        perror("fail creat");
        return NULL;
    }
    pdoulink->phead = NULL;
    pdoulink->clen = 0;
    pthread_mutex_init(&pdoulink->mutex,NULL);
    return pdoulink;
}

//判空
int is_empty_doulink(DLink_t *pdoulink)
{
    return NULL == pdoulink->phead;
}

//头插
int push_doulink_head(DLink_t *pdoulink,DataType data)
{
    DLink_Node_t *pnode = malloc(sizeof(DLink_Node_t));
    if(NULL == pnode)
    {
        perror("fail malloc");
        return -1;
    }
    pnode->ppre = NULL;
    pnode->pnext = NULL;
    pnode->data = data;
    
    if(is_empty_doulink(pdoulink))
    {
        pdoulink->phead = pnode;
    }
    else
    {
        pnode->pnext = pdoulink->phead;
        pdoulink->phead->ppre = pnode;
        pdoulink->phead = pnode;
    }
    pdoulink->clen++;
}

//遍历
void print_pdoulink(DLink_t *pdoulink,int flag)
{
    if(is_empty_doulink(pdoulink))
        return;
    DLink_Node_t *p = pdoulink->phead;
    if(flag)
    {
        while(p != NULL)
        {
            printf(" %d %s %d\n",p->data.id,p->data.name,p->data.score);
            p = p->pnext;
        }
    }
    else
    {
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        while(p != NULL)
        {
            printf(" %d %s %d\n",p->data.id,p->data.name,p->data.score);
            p = p->ppre;
        }
    }
    
}

//尾插
int push_doulink_tail(DLink_t *pdoulink ,DataType data)
{
    DLink_Node_t *pnode = malloc(sizeof(DLink_Node_t));
    if(pnode == NULL)
    {
        perror("fail malloc");
        return -1;
    }
    pnode->data = data;
    pnode->ppre = NULL;
    pnode->pnext = NULL;
    if((is_empty_doulink(pdoulink)))
    {
        push_doulink_head(pdoulink,data);
        free(pnode);
    }
    else
    {
        DLink_Node_t *p = pdoulink->phead;
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        p->pnext = pnode;
        pnode->ppre = p;
    }

}

//头删
int pop_head(DLink_t *pdoulink)
{
    if(is_empty_doulink(pdoulink))
    {
        return 0;
    }
    DLink_Node_t *p = pdoulink->phead;
    pdoulink->phead = p->pnext;
    if(p->pnext != NULL)
    {
        p->pnext->ppre = NULL;
    }
    free(p);
}

//尾删
int pop_tail(DLink_t *pdoulink)
{
    DLink_Node_t *p = pdoulink->phead;
    if(is_empty_doulink(pdoulink))
    {
        return 0;
    }
    else if(p->pnext == NULL)
    {
        pop_head(pdoulink);
    }
    else
    {
        while(p->pnext->pnext != NULL)
        {
            p = p->pnext;
        }
        free(p->pnext);
        p->pnext = NULL;
    }
}

//查找 name
DataType *find_dliink_data(DLink_t *pdoulink,char *data)
{
    if(is_empty_doulink(pdoulink))
        return NULL;
    DLink_Node_t *p = pdoulink->phead;
    while(p != NULL)
    {
        if(strcmp(p->data.name,data) == 0)
        {
            return &(p->data);
        }
        p = p->pnext;
    }
    return NULL;
}

//修改(根据name查找)
void update_dlink_data(DLink_t *pdoulink,char *old_data,char *new_data)
{
    if(is_empty_doulink(pdoulink))
        return;
    DLink_Node_t *p = pdoulink->phead;
    while(p != NULL)
    {
        if(strcmp(p->data.name,old_data) == 0)
        {
            strcpy(p->data.name,new_data);
            break;
        }
        p = p->pnext;
    }
    
}

//销毁

void destory_dlink(DLink_t *pdoulink)
{
        while(!(is_empty_doulink(pdoulink)))
        {
            pop_head(pdoulink);
        }
        free(pdoulink);
}
相关推荐
HugoStudio_SWAN1 天前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆1 天前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
阳明山水1 天前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技1 天前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
wuyk5551 天前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
-dzk-1 天前
【链表】LC 138.随机链表的复制
数据结构·链表
Tongzhi20261 天前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
eBest数字化转型方案1 天前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
洋不写bug1 天前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
residual_fan1 天前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析