• 算法学习记录双链表


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

    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);

    结果:

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

  • 相关阅读:
    docker从零开始 存储(三)bind mounts
    docker从零开始 存储(二)volumes 挂载
    docker从零开始 存储(一)存储概述
    docker从零开始网络(七) 配置daemon和容器
    docker从零开始网络(六)Macvlan
    docker从零开始网络(五)null网络
    docker从零开始网络(四 ) host网络
    docker从零开始网络(三) overly(覆盖)网络
    docker从零开始网络(二)桥接网络
    docker从零开始网络(一)概述
  • 原文地址:https://www.cnblogs.com/jsgnadsj/p/3402113.html
Copyright © 2020-2023  润新知