初識線性表和抽象數據類型

線性表

線性表是什麼,簡單來說線性表就如同生活中的排隊一樣,具有線一樣性質的數據結構.線性表有0個(當數據元素爲0時,稱該線性表爲空表)或者多個數據元素組成

  • 線性表有以下幾個特點
    • 線性表是一個序列,即各數據元素之間有一定的前後關係
    • 若線性表不爲空表,則第一個元素無前驅,最後一個元素無後繼,其他元素有且只有一個前驅或者後繼
    • 線性表中數據元素是有限的,因爲無論計算計多強大,發展到多先進的程度,計算機能夠處理的數據永遠不可能是無限的

前驅和後繼(數學語言描述)
若將線性表記爲a1.a2,…ai-1,ai,ai+1,…,an,則表中ai-1領先於ai,ai領先於ai+1,則稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素

可以看出,區別於很多計算機高級語言,線性表的序列是從1開始的,也因此,我們將線性表的元素個數n定義爲線性表的長度

數據結構分析圖
上面這個圖中可以看出總經理下分了別的職位,而總監下又分了別的職位,從線性表的特點:若線性表不爲空表,則第一個元素無前驅,最後一個元素無後繼,其他元素有且只有一個前驅或者後繼,由於該圖中一個數據元素有多個後繼,所以我們可以判斷該表不是線性表。

抽象數據類型

數據類型

數據類型[^1]指一組性質相同的值得集合以及定義在此集合上的一些操作的總稱

  • 在C語言中,數據類型按照取值的不同,可以分爲
    • 原子類型:不可再分解的基本類型,比如注1中的幾種類型
    • 結構類型:若干個類型組合而成,可以再分解的,比如整形數組(若干個整型數據組成)、結構體…

[^1]比如編程語言中的整形,浮點型,字符型

抽象

什麼是抽象?抽象就是抽取出事物具有的普遍性的本質,它要求抽出問題的特徵而忽略非本質的細節(對具體事務的一個概括),抽象是一種思考問題的方式,它隱藏了繁雜的細節。

比如,髒活累活交給男人來幹,男人就是抽象,它不具體指是哪一個人。

抽象數據類型

對已有的數據類型進行抽象,就有了抽象數據類型(Abstract Data Type,ADT),指一個數學模型及定義在該模型上的一組操作。

抽象數據類型的定義僅僅取決於它的一組邏輯特性,與其在計算機內部如何表示無關,例如1+1=2,在不同CPU的處理可能不一樣,由於其數學特性相同,所以在計算機編程者眼中,它們相同。
“抽象”意義在於數學類型上的數學抽象特性。抽象數據類型不僅指已經定義並實現的數據類型,還可以是計算機變成這自己定義的數據類型,例如以後要學習的線性表。

抽象數據類型的標準格式

   ADT  (抽象數據類型名)
   Data
       數據元素之間邏輯關係的定義
   Operation
       操作
    endADT

線性表的抽象數據類型定義

  ADT線性表(List)
  Data
       線性表數據對象集合爲{a~1~.a~2~,...a~i-1~,a~i~,a~i+1~,...,a~n~}
       並且每個元素類型均爲DataType,
       除a~1~外,每個元素有且只有一個直接前驅元素,
       除a~n~外,每個元素有且只有一個直接後繼元素
       元素之間關係:一一對應
  Operation
       InitList(*L);             //初始化,建立一個空的線性表L
       ListEmpty(L);         //判斷L是否爲空表,爲空,返回true,否則返回false
       ClearList(*L);         //清空線性表L
       GetElem(L,i,*e);     //將線性表L第i個元素返回給e
       locateElem(L,e);    //在線性表L中查找查找與給定值e相等的元素,若查找成功,返回該元素在表中序號,表示成功,否則返回0表示失敗
       ListInsert(*L,i,e);     //在線性表L中第i個位置前插入新元素e
       ListDelete(*L,i,*e);   //刪除線性L表中第i個元素,並且用e返回其值
       ListLength(L);          //返回線性表的元素個數
    endADT

有了上面的定義,我們就可以方便的實現一些操作,例如下面的求兩表並集(A=A∪B):

/*要實現兩表並集,只需要遍歷一表每一個元素,而後判斷另一表是否有該元素,若有,忽略,沒有插入*/
List *unionL(List *La,List Lb)
{
    int lengtha=ListLength(*La);   //獲得La的長度
    int lengthb=Listlength(Lb);    //獲得Lb的長度
    ElemType *e;                   //接收表Lb的值
    /*表Lb爲空表,直接返回表La*/
    if(lengthb==0)
    {
      return La;
    }
    else
    {
       for(int i=1;i<=lengthb;i++)     //遍歷Lb
          {
              GetElem(Lb,i,*e);        //將Lb第i個元素賦值給e
              if(!(locateElem(*La,e)))    //判斷La中是否有e,若沒有在表a末尾插入e
              {
                 ListInsert(*La,(lengtha+1)++,*e);
              }
           }
     }
     return La;
}

可見,定義了一個抽象數據類型,將其封裝之後,我們將能夠更方便快捷的解決一些實際問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章