zoukankan      html  css  js  c++  java
  • 算法学习记录双链表

    单链表缺点是每次都要从头开始索引,不能往回索引,很自然就会想一个办法,希望能够往回索引。这有双链表就产生了。

    0.双链表结构:

    typedef struct lNode{
        int data;
        struct lNode* pri;
        struct lNode* next;
    }ltNode,*ptNode;

    增加了一个前驱指针,这有就可以向回索引了。

    1.双链表的初始化

    //1.双向链表的init
    void dlist_init(ptNode* head)
    {
        *head = (ptNode)malloc(sizeof(ltNode));
        (*head)->data = 0;
        (*head)->pri  = NULL;
        (*head)->next = NULL;
    }

    2.双链表的插入

    通过画图

    //2.双向链表的插入
    int dlist_insert(ptNode list,int index,int elem)
    {
        int len = list->data;
        if(len < index)            //如果插入的位子超出范围,按增加链表处理。
        {
            dlist_add(list,elem);
            return 0;
        }
    
        ptNode n = (ptNode)malloc(sizeof(ltNode));
        n->data = elem;
        n->pri = NULL;
        n->next = NULL;
    
        ptNode pos = list;
        while(index > 0)
        {
            pos=pos->next;
            index--;
        }
        n->next = pos;                //(1)
        n->pri = pos->pri;            //(2)
        pos->pri->next = n;            //(3)
        pos->pri = n;                //(4)
        
    
        list->data = list->data+1;
        return 1;
    }

    对照程序 (1)(2)(3)(4)和图中过程看。
    其中,如果插入在最后的位置,则调用

    dlist_add(list,elem);

    调用和结果:

    用insert函数创建一个表:

       int ary[10] = {2,6,55,34,45,19,82,9,36,12};
        ptNode list = NULL;
    
    
        dlist_init(&list);
        prt_list(list);
        getchar();
        
        int i=0;
        printf("create!\n");
        for (i=0;i<10;i++)
        {
            dlist_insert(list,i+1,ary[i]);
        }
        prt_list(list);
        getchar();
    


    运行后:

    printf("insert:\n");
    dlist_insert(list,1,99);
    prt_list(list);
    
    dlist_insert(list,9,88);
    prt_list(list);

    然后再调用插入:


     

    3.双链表的删除

    画图过程:

     

    //3.双向链表的删除
    int dlist_delete(ptNode list,int index)
    {
        int len = list->data;
        if(len < index)
        {
            printf("error:over range\n");
            return 0;
        }
    
        ptNode pos = list;
        while(index > 0)
        {
            pos=pos->next;
            index--;
        }
        pos->pri->next = pos->next;   //(1)
    pos
    ->next->pri = pos->pri;   //(2) free(pos);            //(3)        list->data = list->data-1; return 1; }


     主函数调用:

    printf("delete:\n");
    dlist_delete(list,1);
    prt_list(list);
    
    dlist_delete(list,5);
    prt_list(list);

    结果:

    完成插入和删除操作后面,基本功能都能够实现。

  • 相关阅读:
    MEAN: AngularJS + NodeJS的REST API开发教程
    什么是MEAN全堆栈javascript开发框架
    fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题
    React 高德地图画点画区域放大缩小
    React 拖动布局
    React+TypeScript搭建项目
    js 运算符优先级
    for...in 与 for...of
    前端面试点记录
    Vue 高德地图 路径规划 画点
  • 原文地址:https://www.cnblogs.com/jsgnadsj/p/3402113.html
Copyright © 2011-2022 走看看