日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大话数据结构:线性表(1)

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话数据结构:线性表(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.線性表概述

線性表,從名字上可以感覺到,就是具有像線一樣的性質的表。具體表述為:零個或多個數據元素的有限序列。需要強調的是,首先線性表是一個序列,也就是說,元素之間是有順序的,若元素存在多個,則第一個元素無前驅,最后一個元素無后繼,其他每個元素都有且只有一個前驅和后繼。然后,線性表強調是有限的。 根據線性表的定義,我們可以猜測到線性表應該有一些什么樣的操作。如線性表重置為空表的操作、根據位序得到數據元素、查找某個元素是否存在、線性表長度、插入數據和刪除數據等。 所以,線性表的抽象數據類型定義如下:
<span style="font-size:18px;">ADT 線性表(List) Data每個元素的類型均為DataType,其中,除第一個元素外,每個元素幽囚只有一個直接的前驅元素;除最后一個元素外,每一個元素有且僅有一個直接后繼元素 OperationInitList(*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</span>
對于不同的應用,線性表的基本操作是不同的,上述操作是最基本的。對于實際問題中涉及的關于線性表的操作更加復雜,完全可以用上述基本操作的組合來實現。 比如,要實現兩個線性表集合A和集合B的并集操作。即要使得A=A∪B。說白了,就是把存在集合B中但是不存在A中的數據元素插入到A中即可。 則實現的代碼如下: //將所有的在線性表Lb中但是不在La中的數據元素插入到La中 void Union(List *La, List Lb) {int La_Len,Lb_Len;ElemType e;La_Len = ListLength( La );Lb_Len = ListLength( Lb );for (int i = 1; i<=Lb_Len;i++){GetElem(Lb,i,e);if ( !LocateElem(La,e,equal) )ListInsert(La, ++La_Len,e);} }

2.線性表的順序存儲結構

2.1 順序存儲定義

線性表的順序存儲結構,指的是用一段地址連續的存儲單元依次存儲線性表的數據元素。 線性表的順序村相互示意圖如下:

2.2 順序存儲方式

線性表的順序存儲結構,說白了就只在內存中找塊地址,通過占位的形式,把一定內存空間給占了,然后把相同數據類型的數據元素依次存放在這塊空地上。那么,有感而發,我們可以利用C語言中的一維數組來實現順序存儲結構,即把第一個數據元素存到數組下標為0的位置中,接著把線性表相鄰的元素存儲在數組中相鄰位置。為了建立一個線性表,內存塊的第一個位置就非常關鍵,他是存儲空間的起始位置。 順序存儲的結構代碼: <span style="font-size:18px;">#define MAXSIZE 20 //存儲空間初始分配量 typedef int ElemType; typedef struct {ElemType data[MAXSIZE];int Length }SqList</span>我們可以描述順序存儲結構需要三個屬性: (1)存儲空間的起始位置:數組data,它的存儲位置就是存儲空間的存儲位置。 (2)線性表的最大存儲容量:數組長度MAXSIZE。 (3)線性表的當前長度:Length。 我們應該區別數據長度與線性表長度區別,數組的長度是存放線性表的存儲空間的長度,存儲分配后這個量一般是不變的。線性表的長度是線性表中數據元素的個數,隨著線性表插入和刪除操作的進行,這個量是變化的。但是,我們應該注意到,線性表的長度應該小于等于數組的長度。

3.順序存儲結構的插入與刪除

3.1 獲得元素操作

對于線性表的順序存儲結構來說,如果我們要實現GetElem操作,即將線性表L中的第i個位置元素值返回,其實非常簡單的。 實現代碼: <span style="font-size:18px;">#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedefine int Statue; Status GetElem( SqList L, int i, ElemType* e) {if( L.length ==0 || i<1 || i>L.length)return ERROR;*e = L.data[i-1];return OK; }</span>

3.2 插入操作

插入算法的思路: (1)如果插入位置不合適,拋出異常; (2)如果線性表長度大于等于數組長度,則拋出異?;騽討B增加容量; (3)從最后一個元素開始向前遍歷到第i個位置,分別將他們都向后移動一個位置; (4)將要插入元素填入位置i處; (5)表長加1. 實現代碼如下: <span style="font-size:18px;">Statue ListInsert( SqList* L, int i, ElemType e) {int k;if ( L->length == MAXSIZE )return ERROR;if ( i<1 || i>L->length+1)return ERROR;if ( i<L->length ){for( k=L->length-1;k>=i-1;k--)L->data[k+1] = L->data[k];}L->data[i-1] = e;L->length++;return OK; }</span>

3.3 刪除操作

刪除算法的思路: (1)如果刪除位置不合理,拋出異常; (2)取出刪除元素; (3)從刪除元素位置開始遍歷到最后一個元素位置,分別將他們都向前移動一個位置; (4)表長減一。 <span style="font-size:18px;">Statue ListDelete( SqList* L, int i, ElemType* e) {int k;if ( L->length == 0 )return ERROR;if ( i<1 || i>L->length)return ERROR;if ( i<L->length ){for ( k=i; k<L->length; k++)L->data[k-1] = L->data[k];}L->length--;return OK; }</span>接下來可以分析一下,插入和刪除的時間復雜度。先考慮最好的情況,如果元素要插入到最后一個位置,或者刪除最后一個元素,此時時間復雜度為O(1)。因為這并不需要移動元素。最壞的情況呢,如果元素要插入到第一個位置或者刪除第一個元素,此時的時間復雜度是O(n)。

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

經過上面分析,我們可以知道:線性表的順序存儲結構在存、讀數據時,不管是哪個位置,時間復雜度都是O(1); 而插入或刪除時,時間復雜度都是O(n)。 優點:無須為表示表中元素之間的邏輯關系而增加額外的存儲空間;可以快速地存取表中任意位置的元素。 缺點:插入和刪除操作需要移動大量元素;當線性表長度變化大時,難以確定存儲空間的容量;造成成存儲空間的碎片。

總結

以上是生活随笔為你收集整理的大话数据结构:线性表(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。