數據結構與算法學習筆記02_1(線性表)

數據結構與算法學習筆記02_1(線性表)

 

抽象數據類型的標準格式:

ADT 抽象數據類型名

Data

       數據元素之間邏輯關係的定義

Operation

       操作

endADT

 

線性表應該有什麼樣的基本操作?

 

ADT 線性表(List)

Data

    線性表的數據對象集合爲{a1,a2,…,an},每個元素的類型均爲DataType。

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

    數據元素之間的關係是一對一的關係。

Operation

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

    ListEmpty(L): 判斷線性表是否爲空表,若線性表爲空,返回true,否則返回false。

    ClearList(*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): 返回線性表L的元素個數。

endADT

 

並集原理

 

其實仔細思考一下,我們只需要循環遍歷集合B中的每個元素,判斷當前元素是否存在A中,弱不存在,則插入A中即可。

綜合分析,我們需要運用到幾個基本的操作組合即可:

ListLength(L);

GetElem(L,i,*e);

LocateElem(L,e);

ListInsert(*L,i,e);

 

實現代碼:

//La表示A集合,Lb表示B集合。
void unionL(List* La, List Lb){
	int La_len, Lb_len, i;
	ElemType e;
	La_len = ListLength(*La);
	Lb_len = ListLength(Lb);

	for (i = 0; i < Lb_len;i++)
	{
		GetElem(Lb,i,&e);
		if (!LocationElem(*La,e))
		{
			listInsert(La,++La_len,e);
		}
	}
}
 

1、線性表的順序存儲結構

 

實現代碼:

#defineMAXSIZE20   

typedefint ElemType;

 

typedefstruct

{

       ElemType data[MAXSIZE];

       int length;   // 線性表當前長度

} SqList;

 

總結下,順序存儲結構封裝需要三個屬性:

存儲空間的起始位置,數組data,它的存儲位置就是線性表存儲空間的存儲位置。

線性表的最大存儲容量:數組的長度MaxSize。

線性表的當前長度:length。

 

注意,數組的長度與線性表的當前長度需要區分一下:

數組的長度是存放線性表的存儲空間的總長度,一般初始化後不變。

而線性表的當前長度是線性表中元素的個數,是會變化的。

 

刪除操作

思路:

如果刪除位置不合理,拋出異常;

取出刪除元素;

從刪除元素位置開始遍歷到最後一個元素位置,分別將它們都向前移動一個位置;

表長-1。

 

//初始條件:順序線性表L已經存在,1=i<=ListLength(L)

//操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度-1

Status ListDelete(SqList *L, int i, ElemType *e){
	int k;
	if (L->length==0)
	{
		return ERROR;
	}
	if (i<1||i>l->length)
	{
		return ERROR;
	}
	*e = L->data[i - 1];
	if (i<L->length)
	{
		for (k = i; k < L->length;k++)
		{
			L->data[k - 1] = L->data[k];
		}
	}
	L->length--;
	return Ok;
}

插入和刪除的時間複雜度。

 

最好的情況:插入和刪除操作剛好要求在最後一個位置操作,因爲不需要移動任何元素,所以此時的時間複雜度爲O(1)。

最壞的情況:如果要插入和刪除的位置是第一個元素,那就意味着要移動所有的元素向後或者向前,所以這個時間複雜度爲O(n)。

 

至於平均情況,就取中間值O((n-1)/2),簡化後還是O(n)。

 

線性表順序存儲結構的優缺點

 

線性表的順序存儲結構,在存、讀數據時,不管是哪個位置,時間複雜度都是O(1)。而在插入或刪除時,時間複雜度都是O(n)。

這就說明,它比較適合元素個數比較穩定,不經常插入和刪除元素,而更多的操作是存取數據的應用。

那我們接下來給大家簡單總結下線性表的順序存儲結構的優缺點:

 

優點:

無須爲表示表中元素之間的邏輯關係而增加額外的存儲空間。

可以快速地存取表中任意位置的元素。

 

缺點:

插入和刪除操作需要移動大量元素。

當線性表長度變化較大時,難以確定存儲空間的容量。

容易造成存儲空間的“碎片”。

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