• 元素链表数据结构:静态链表


    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下元素链表

        首先我们让数组的元素都是由两个数据域成组,data和cur。也就是说,数组的每个标下都对应一个data和一个cur。

        数据域data用来寄存数据元素,也就是平日我们要理处的数据;而游标cur相当于单链表中的next针指,

        寄存该元素的后继在数组中的标下。我们把这类用数组描述的链表叫做态静链表。

        数组的第一个元素,即标下为0的元素的cur就寄存用备链表的第一个结点的标下;而数组的最后一个元素的cur

        则寄存第一个有数值的元素的标下,相当于单链表的头节点作用,当个整链表为空时,则为0,示表无指向。

        

        示例代码:(改编自《谎话数据结构》)

        

        每日一道理
    当浮华给予我们过多欺骗,现实中的虚假几乎让我们忘却了真的存在,是真情唤回了迷离的心,是真情带给了我们最纯、最真的感觉,它流露的是美的誓言,渗透的是永恒执著的真爱。

        

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    #include<iostream>
    using  namespace std;

    #define MAXSIZE  100

    typedef  int ElemType;
    /* 线性表的态静链表存储结构 */
    typedef  struct Node
    {
        ElemType data;
         int cur;  //为0时示表无指向
    } StaticLinkList[MAXSIZE];

    /* 将一维数组array中各分量链成一个用备链表,array[0].cur为头针指,"0"示表空针指 */
    bool InitList(StaticLinkList array)
    {
        cout <<  "InitList..." << endl;
         for ( int i =  0; i < MAXSIZE -  1; i++)
        {
            array[i].cur = i +  1;
        }

        array[MAXSIZE -  1].cur =  0; /* 前目态静链表为空,最后一个元素的cur为0 */

         return  true;
    }
    /* 若用备空间链表非空,则返回配分的结点标下,否则返回0 */
    int Malloc_SLL(StaticLinkList array)
    {
         int k = array[ 0].cur;
         if (k)
            array[ 0].cur = array[k].cur; /* 下一个分量用来做用备 */

         return k;
    }
    /*  将标下为pos的闲暇结点回收到用备链表 */
    void Free_SLL(StaticLinkList array,  int pos)
    {
        array[pos].cur = array[ 0].cur;  /* 把第一个元素的cur值赋给要删除的分量cur */
        array[ 0].cur = pos;  /* 把要删除的分量标下赋值给第一个元素的cur */
    }

    int ListLength(StaticLinkList array)
    {
         int i = array[MAXSIZE -  1].cur;
         int j =  0;
         while(i)
        {
            i = array[i].cur;
            ++j;
        }
         return j;
    }
    /*  在array中第pos个元素之前入插新的数据元素Elem  */
    bool ListInsert(StaticLinkList array,  int pos, ElemType Elem)
    {
        cout <<  "Insert List from pos: " << pos <<  " Item " << Elem << endl;
         if (pos <  1 || pos > ListLength(array) +  1)
             return  false;

         int k = MAXSIZE -  1;
         int i = Malloc_SLL(array);  /* 取得闲暇分量的标下 */

         if (i)
        {
            array[i].data = Elem;

             for ( int l =  1; l <= pos -  1; l++)
                k = array[k].cur;

            array[i].cur = array[k].cur; /* 把第pos个元素之前的cur赋值给新元素的cur */
            array[k].cur = i; /* 把新元素的标下赋值给第pos个元素之前元素的cur */
             return  true;
        }

         return  false;
    }
    /*  删除在array中第pos个数据元素   */
    bool ListDelete(StaticLinkList array,  int pos)
    {
        cout <<  "Delete List from pos: " << pos << endl;
         if (pos <  1 || pos > ListLength(array))
             return  false;

         int k = MAXSIZE -  1;

         for ( int l =  1; l <= pos -  1; l++)
            k = array[k].cur;

         int j = array[k].cur;
        array[k].cur = array[pos].cur;

        Free_SLL(array, j);

         return  true;
    }

    bool ListTraverse(StaticLinkList array)
    {
        cout <<  "List Traverse : " << endl;
         int k = MAXSIZE -  1;
         while (array[k].cur !=  0)
        {
            k = array[k].cur;
            cout << array[k].data <<  ' ';
        }

        cout << endl;
         return  true;
    }


    int main( void)
    {
        StaticLinkList SSL;
        InitList(SSL);
         for ( int i =  1; i <  5; i++)
            ListInsert(SSL, i, i);
        ListTraverse(SSL);

        ListDelete(SSL,  3);
        ListTraverse(SSL);
        cout <<  "List Length : " << ListLength(SSL) << endl;

         return  0;
    }

    出输为:

        

        

        态静链表在入插和删除操纵时不须要动移元素,只须要改修游标,从而改进了在顺序存储结构中入插和删除操纵须要动移

        量大元素的点缺;但并没有决解连续配分存储带来的表长难以确定的题问;并且失去了顺序存储结构随机存取的性特。

    文章结束给大家分享下程序员的一些笑话语录: 小沈阳版程序员~~~ \n程序员其实可痛苦的了......需求一做一改,一个月就过去了;嚎~ \n需求再一改一调,一季度就过去了;嚎~ \n程序员最痛苦的事儿是啥,知道不?就是,程序没做完,需求又改了; \n程序员最最痛苦的事儿是啥,知道不? 就是,系统好不容易做完了,方案全改了; \n程序员最最最痛苦的事儿是啥,知道不? 就是,系统做完了,狗日的客户跑了; \n程序员最最最最最痛苦的事儿是啥,知道不? 就是,狗日的客户又回来了,程序给删没了!

  • 相关阅读:
    Linux就该这么学——新手必须掌握的命令之文件目录管理命令组
    Linux就该这么学——新手必须掌握的命令之文件编辑命令组
    Linux就该这么学——新手必须掌握的命令之工作目录切换命令组
    Linux就该这么学——新手必须掌握的命令之系统状态检测命令组
    Linux就该这么学——新手必须掌握的命令之常用的系统工作命令
    Linux就该这么学——新手必须掌握的命令之我的第一个命令
    Linux就该这么学——安装配置VM虚拟机
    thinkphp6下无法获取header头中的Authorization(apache版)
    字符串转数组(php版)
    python3 第二十二章
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3036008.html
Copyright © 2020-2023  润新知