• 数据结构第一篇——线性表的逻辑结构


    ♥注:未经博主同意,不得转载。

    线性表(linear list)是最常用且最简单的数据结构。简言之,一个线性表是n个数据元素的有限序列。至于每个数据元素的具体含义,在不同的情况下各不相同。例如,26个英文字母的字母表:

    (A,B,C,D,......Z)

    线性表的抽象数据类型定义如下:

     1 ADT List
     2 {
     3     Data: D={Ai|Ai<DataSet,i=1,2,...,n, n>=0}
     4     //称n为线性表的表长
     5     //称n=0时的线性表为空表
     6     Structure: R={<A(i-1),Ai>|A(i-1),Ai∈D,i=1,2,...,0}
     7     //设线性表为(A1,A2,...,Ai,...,An)
     8     //称i为Ai在线性表中的位序
     9     
    10     Operation:
    11     {
    12         List();                            //构造一个空的线性表 
    13         Length();                        //求线性表的长度 
    14         Locate(Data x);                //查找值为x的元素 
    15         Insert(Data x ,int i);        //在i的位置上插入元素x 
    16         Delete(int i);                    //删除第i个元素 
    17         Next (Data x);                    //求值为x的前驱元素 
    18         Prior(Data x);                    //求值为x的后继元素 
    19         IsEmpty();                        //判断线性表是否为空 
    20         IsFull();                        //判断线性表是否为满 
    21         GetElem(int i);                //查找第i个元素 
    22         Print();                            //输出所有元素 
    23     } 
    24 }

    对上述定义了抽象数据类型的线性表,还可进行一些更复杂的操作,比如:
    1.将两个或两个以上的线性表合并成一个线性表:

     1 void Union(List LA, List LB)
     2 {
     3     int i=0;
     4     while(i<LB.size)
     5     {
     6         x=LB.GetElem(i);   //在LB中取一元素 
     7         k=LA.Locate(x);        //在LA中搜索它 
     8         if(k==-1)                //未找到,将它插入到LA中 
     9         {
    10             LA.Insert(x,i);
    11         }
    12         else ++i;
    13     }
    14 }
    15 //此算法时间复杂度为O(LA.size*LB.size)

    2.已知线性表LA和LB中的元素按值递增有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素值仍递增排列。例如,设
    LA=(2,3,5,8,11,15)

    LB=(4,5,6,9,15,20,24)

    LC=(2,3,4,5,5,6,8,9,11,15,15,20,24)

     1 void MergeList()
     2 {
     3     int i=j=1;        //跟随LA和LB 
     4     int k=1;            //跟随LC 
     5     while((i<LA.size)&&(j<LB.size))    //LA和LB长度范围内    
     6     {
     7         x=LA.GetElem(i);        //获取LA中元素 
     8         y=LB.GetElem(j);        //获取LB中元素 
     9         if(x<=y)
    10         {
    11             LC.Insert(x,k);
    12             ++i;
    13             ++k;
    14         }
    15         else
    16         {
    17             LC.Insert(y.k);
    18             ++j;
    19             ++k;
    20         }
    21     }
    22     while(i<LA.size)        //LB已经添加完毕 
    23     {
    24         x=LA.GetElem(i);
    25         LC.Insert(x,k);
    26         ++i;
    27         ++k; 
    28     }
    29     while(j<LB.size)        //LB已经添加完毕 
    30     {
    31         y=LB.GetElem(j);
    32         LC.Insert(y,k);
    33         ++j;
    34         ++k; 
    35     }    
    36 }
    37 //算法复杂度为O(Length(LA)+Length(LB)) 

    以上代码中关于自增运算用++i而不用i++,想要了解请转至http://www.cnblogs.com/tenjl-exv/p/7469016.html
    如要更加追求效率可写为 i+=1。

  • 相关阅读:
    初识Activity
    贝叶斯公式由浅入深大讲解—AI基础算法入门【转】
    jz2440使用openjtag+openocd+eclipse调试【学习笔记】
    win10下搭建jz2440v3(arm s3c2440)开发及gdb调试环境【转】
    Eclipse安装zylin[转]
    Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用【转】
    如何退出minicom【学习笔记】
    Python Matplotlib简易教程【转】
    anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】
    Spyder如何在弹出框绘图【转】
  • 原文地址:https://www.cnblogs.com/tenjl-exv/p/7469269.html
Copyright © 2020-2023  润新知