leiyahui

纸上得来终觉浅,绝知此事要躬行
线性表

一 线性表的定义

  线性表(Linear List)包含若干个相同类型的数据元素的一个线性序列,记为L=(a0,.........ai-1,ai,ai+1,....an)

二 线性表的逻辑结构和特征

  线性表的逻辑结构可用形式化语言描述如下

  L(D,R)

  即L为包含数据元素集合D和D上关系集合R的二元组,其中

    D{ai|ai belongs Datatype,i=0,1,2,3,n-1,n>-1}

    R{<ai,ai+1>|ai,ai+1 belongs Datatype,-1<i<n-3}

    关系符<ai,ai+1>在这里成为有序数对,表示表中任意两个相邻元素是一种先后次序关系,这种关系中称ai-1位ai的直接前驱,ai+1为ai的直接后继

三 线性表的抽象数据类型表示

  ADT List{

    数据元素集:D{ai|ai belongs Datatype,i=0,1,2,3,n-1,n>-1}

    数据关系集:R{<ai,ai+1>|ai,ai+1 belongs Datatype,-1<i<n-3}

    基本操作集:P

  ListInit(&L)

    操作结果:构造一个空的线性表L

  ListDestroy(&L)

      初始条件:线性表L存在

    操作结果:撤销线性表L  

  ListClear(&L)  

    初始条件:线性表L存在

    操作结果:将L设置为一张空表

  ListLengt(&L)

      初始条件:线性表L存在

    操作结果:返回线性表的个数,即表长n

  IsListEmpty(&L)

    初始条件:线性表存在

      操作结果:如果线性表存在返回true,否则返回false

  GetElem(L,i)

    初始条件:线性表存在,0<=i<=n-1

    操作结果:返回线性表中第i个元素(或指针)

  LocateElem(L,e)  

    操作条件:线性表存在,e belongs Datatype

    操作结果:若e存在线性表返回e的序号,否则返回不在表中的信息

  ListInert(&L,i,e)

    操作条件:线性表L存在;

    操作结果:若0<=i<=n-1将e插在第i个元素之前返回true,若i=n将e插在第n个位置并返回true,否则返回false

  ListDel(&L,i)

    操作条件:线性表L存在,0<=i<=n-1

    操作结果:若0<=i<n-1返回true,否则返回false

  ListTraverse(L)

    初始条件:L存在

    操作结果:依次对表中的结果进行访问

    }

以上是在逻辑层面是建立的抽象数据类型

 习题

  (1)设线性表La(a1,a2,a3....),Lb(b1,b2,b3),求量表合并的操作La并Lb->La

  void Union(list* La,list *Lb)

    {

      Int i,k; 

      dataType x;

      for(i=0;i<ListLength(*Lb);i++)

        {

           x=GetElem(*Lb,i)

           k=LoacateElem(*Lb,x)

           if(k==-1)

           ListInsert(*La,ListLength(*La),x)

        }

    }

  (2)清除L中重复的元素

    void Purge(List* L)
{
    int i, j;
    datetype x, y;
    for (i = 0; i < ListLength(*L); i++)
    {
        x=GetElem((*L), i);
        for (j = i + 1; j < ListLength(*L); j++)
        {
            y = GetElem(*L, j);
            if
                (y == x) ListDel(*L, j);
            else
                j++;
        }
    }
}

                            

posted on 2015-11-13 19:50  雷大叔  阅读(144)  评论(0)    收藏  举报