栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构04 ------线性表(双向链表)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构04 ------线性表(双向链表)

为了弥补单向链表的缺陷:发明出了双向链表

双向链表:它有两个指针域,一个指向其前面的节点,另外一个指向其后面的节点

双向链表:


    struct link{
        datatype data;            //数据域
        struct link *prev;        //指针域 前面那个节点的地址
        struct link *next;        //指针域 后面那个节点的地址
    };

双向链表的实现: 实现增 删 改 查:


#include

#include

typedef int datatype;

typedef struct link{
    datatype data;
    struct link *prev;
    struct link *next;
} link_t,*plink_t;


static plink_t create_node(datatype d)
{
    // 在堆中开空间
    plink_t node = (plink_t)malloc(sizeof(link_t));
    if(node == NULL){
        perror("malloc error");
        return NULL; 
    }
    
    // 成员赋值
    node->data = d;
    node->prev = NULL;
    node->next = NULL;
    
    //将新的节点返回
    return node;
}


static void insert_behind(plink_t p,plink_t node)
{
    node->next = p->next;
    node->prev = p;
    if(p->next!=NULL)
        p->next->prev = node;
    p->next = node;
}



static void cut_node(plink_t node)
{
    node->prev->next = node->next;
    if(node->next!=NULL)
        node->next->prev = node->prev;
    
    node->next = NULL;
    node->prev = NULL;
}


void replace(plink_t old,plink_t new)
{
    new->prev = old->prev;
    new->next = old->next;
    new->prev->next = new;
    if(new->next!=NULL)
        new->next->prev = new;

}


void link_init(plink_t *p)
{
//    *p = create_node(-2); //可以这样子

    // 在堆中开空间
    *p = (plink_t)malloc(sizeof(link_t));
    if(*p == NULL){
        perror("malloc error");
        return; 
    }
    
    // 成员赋值
    (*p)->prev = NULL;
    (*p)->next = NULL;

}



void link_insert_head(plink_t p,datatype d)
{
    //通过数据d创建新的节点
    plink_t node = create_node(d);
    if(node == NULL)
        return;
    
    //把新节点插入到头节点的后面
    insert_behind(p,node);
}



void link_insert_tail(plink_t p,datatype d)
{
    //通过数据d创建新的节点
    plink_t node = create_node(d);
    if(node == NULL)
        return;
    
    //跳到尾巴上
    while(p->next!=NULL)
        p = p->next;
    
    //把新节点插入到尾巴的后面
    insert_behind(p,node);
}



void link_del(plink_t p,datatype d)
{
    plink_t node = NULL;
    
    //通过数据d 查询 其 节点 
    while(p->next!=NULL){
        node = p->next;
        if(node->data == d){  
            // 找到该节点,做删除操作
            cut_node(node);
            free(node);
            continue;
        }
        p = p->next;
    }
}



void link_update(plink_t p,datatype old_data,datatype new_data)
{
    // 通过 old_data 找到节点 
    plink_t node = NULL;
    
    plink_t new_node = NULL;
    
    //通过数据d 查询 其 节点 
    while(p->next!=NULL){
        node = p->next;
        if(node->data == old_data){  
            // 通过new_data 创建新的节点 
            new_node = create_node(new_data);
            if(new_node==NULL)
                return;
            
            // 新的节点 替换 旧 的节点
            replace(node,new_node);
            node->next = NULL;
            node->prev = NULL;
            free(node);
        }
        p = p->next;
    }
}


void display(plink_t p)
{
    printf("正序遍历结果:");
    while(p->next!=NULL){
        p = p->next;
        printf("%d ",p->data);
    }
    printf("n");
}


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886883.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号