程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 線性表抽象數據類型

線性表抽象數據類型

編輯:C++入門知識

1.定義:
線性表表示0個或者多個數據元素的有限序列

線性表的特性有:

除第一個元素外,每一個元素均有一個直接前驅

出最後一個元素外,每一個元素均有一個直接後繼

2.線性表抽象數據類型
ADT List

 Data

         /*線性表的數據對象集合為{a1,a2,...,an},每個元素的類型均為DataType.其中,除第一個元素a1外,

  每一個元素有且只有一個直接前驅元素,除了最後一個元素an外,每一個元素有且只有一個直接後繼元素。

  數據元素直接是一對一的關系。*/

 Operation

         InitList(*L);//初始化操作,建立一個空的線性表

         ListEmpty(L);//若線性表為空,返回true,否則返回false

         ClearList(*L);//清空線性表

         GetElem(L,i,*e);//查找線性表中的第i個位置的元素值,並賦值給e

         LocateElem(L,e);//查找線性表L中與給定值e相等的元素,如果查找成功,則返回第一個相同的元素在L

                       //中的下標;否則,返回0表示失敗

         ListInsert(*L,i,e);//在線性表L的第i個位置插入元素e

         ListDelete(*L,i,*e);//刪除線性表L中第i個位置元素,並用e返回其值

         ListLength();//返回線性表L的長度

end ADT

 

 

實現線性表La和線性表Lb的並集操作,結果保存在La中的偽代碼如下所示:


[cpp]
//實現線性表La和線性表Lb的並集操作,結果保存在La中  
    void UnionList(*La,Lb) 

    //計算Lb長度  
    int lblength = ListLength(Lb); 
    //計算La長度  
    int laLength = ListLength(La); 
    int i ; 
    //便利Lb中所有元素,判斷其是否在La中,若不在,則插入La中  
    for (i=0;i<length;i++) 
    { 
        ElemType temp = GetElem(Lb,i,*e); 
        if (LocateElem(La,temp)==0) 
        { 
            ListInsert(La,++laLength,temp); 
        } 
    } 

//實現線性表La和線性表Lb的並集操作,結果保存在La中
 void UnionList(*La,Lb)
{
 //計算Lb長度
 int lblength = ListLength(Lb);
 //計算La長度
 int laLength = ListLength(La);
 int i ;
 //便利Lb中所有元素,判斷其是否在La中,若不在,則插入La中
 for (i=0;i<length;i++)
 {
  ElemType temp = GetElem(Lb,i,*e);
  if (LocateElem(La,temp)==0)
  {
   ListInsert(La,++laLength,temp);
  }
 }
}

 

3.順序存儲結構
3.1順序存儲結構的定義

線性表的順序存儲結構,指的是用一段地址連續的存儲單元依次存儲線性表的數據元素。

3.2 數據結構
[cpp]
//線性表的順序存儲結構  
#define MAXSIZE 20;//存儲空間初始分配量為20  
typedef int ElemType;//數據類型為int  
type struct 

    ElemType data[MAXSIZE];//數組存儲數據元素  
    intlength;//線性表長度  
}; 

//線性表的順序存儲結構
#define MAXSIZE 20;//存儲空間初始分配量為20
typedef int ElemType;//數據類型為int
type struct
{
 ElemType data[MAXSIZE];//數組存儲數據元素
 intlength;//線性表長度
};


3.3 數組長度與線性表長度的區別
數組的長度是存放線性表的存儲空間的長度,存儲空間分配後這個量一般是不變的。

線性表的長度是線性表中數據元素的個數,隨著線性表的插入和刪除,這個量是變化的。

3.4 地址計算方法
由於順序存儲結構是按照順序存儲的,所以每個數據元素的地址都可以根據第一個元素的地址推算出來。

LOC(ai) = LOC(a1)+ (i-1)*c

 \
 


4.順序存儲結構的操作
4.1 獲取元素操作
[cpp]
//////////////////////////////////////////////////////////////////////////  
//獲取順序鏈表中第i個元素,並賦值給e  
int GetElem(SqList L,int i, ElemType * e) 

    //線性表長度等於0或者獲取元素位置錯誤返回0  
    if (L.Length == 0 || i < 0 || i > L.Length) 
    { 
        return 0; 
    } 
 
    返回第i個元素 
    *e = L.data[i-1]; 
    return 1; 

//////////////////////////////////////////////////////////////////////////
//獲取順序鏈表中第i個元素,並賦值給e
int GetElem(SqList L,int i, ElemType * e)
{
 //線性表長度等於0或者獲取元素位置錯誤返回0
 if (L.Length == 0 || i < 0 || i > L.Length)
 {
  return 0;
 }

 返回第i個元素
 *e = L.data[i-1];
 return 1;
}

4.2插入操作
插入操作算法的思路是:
1.如果插入位置不合理,拋出異常.
2.如果線性表長度大於等於數組長度,則拋出異常或者增加數組長度

3.從最後一個元素開始像前便利到第i個位置,分別將它們像後移動一個位置

4.第i個元素位置插入e
5.表長度加1
[cpp]
//在線性表L的第i個位置插入元素e  
int ListInsert(Sqlist *L, int i, ElemType e) 

    //插入位置錯誤,返回0  
    if (i < 0 || i > L.Length) 
    { 
        return 0; 
    } 
 
    //線性表的長度大於等於數組的最大長度,返回0  
    if (L.Length >= MAXSIZE) 
    { 
        return 0; 
    } 
 
    int j = L.Length -1; 
    //從第i個元素到最後一個元素,每個元素後移一位  
    while (j >= i) 
     { 
         L.data[j+1] = L.data[j]; 
         j--; 
     } 
 
    //第i個元素的位置放入e  
    L.data[i] = e; 
 
    //線性表長度加1  
    L.Length ++; 
 

//在線性表L的第i個位置插入元素e
int ListInsert(Sqlist *L, int i, ElemType e)
{
 //插入位置錯誤,返回0
 if (i < 0 || i > L.Length)
 {
  return 0;
 }

 //線性表的長度大於等於數組的最大長度,返回0
 if (L.Length >= MAXSIZE)
 {
  return 0;
 }

 int j = L.Length -1;
 //從第i個元素到最後一個元素,每個元素後移一位
 while (j >= i)
  {
   L.data[j+1] = L.data[j];
   j--;
  }

 //第i個元素的位置放入e
 L.data[i] = e;

 //線性表長度加1
 L.Length ++;

}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved