資料結構與演算法(003) 線性表 概述

2021-09-21 05:55:36 字數 4311 閱讀 2311

先讓我我們通過來感受一下,線性表的特性吧。

大家姑且可以把這幅圖想象為老師組織同學們外出野營。因為學生隊伍強大,要老師記住每位學生並區分還真不是一件容易的事。

所以咱想到了乙個辦法,讓大家按照乙個約定排成一隊,以後大家要怎麼記住自己的位置呢?沒錯,大家只需要記住自己前邊的學生即可。

老師也可以很快的清點人數,萬一有人走丟,也能在最快時間內知道是誰不見了,因為只需要問哪位學生的「前驅」不見啦即可。

線性表,從剛才的描述中我們可以很容易感受到是像排隊一樣,具有線一樣性質的結構。

線性表(list):由零個或多個資料元素組成的有限序列。

這裡需要強調幾個關鍵的地方:

首先它是乙個序列,也就是說元素之間是有個先來後到的,像剛才的小蝌蚪就沒有順序。

若元素存在多個,則第乙個元素無前驅,而最後乙個元素無後繼,其他元素都有且只有乙個前驅和後繼。

另外,線性表強調是有限的,事實上無論計算機發展到多強大,它所處理的元素都是有限的。

如果用數學語言來進行定義,可如下:

若將線性表記為(a1,…,ai-1,ai,ai+1,…an),則表中ai-1領先於ai,ai領先於ai+1,稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素。

所以線性表元素的個數n(n>=0)定義為線性表的長度,當n=0時,稱為空表。

請問公司的組織架構是否屬於線性關係?

分析:一般公司的總經理管理幾個總監,每個總監管理幾個經理,每個經理都有各自的下屬和員工。

那這樣的組織架構是不是線性關係呢?

當然不是啦!注意線性關係的條件是如果存在多個元素,則「第乙個元素無前驅,而最後乙個元素無後繼,其他元素都有且只有乙個前驅和後繼。」

那麼班級裡同學之間的友誼呢?

當然也不是,因為每個人都會跟許多同學建立純純的友誼關係。

好,再來一題,那如果是情侶間的愛情關係呢?

哈,還是扯淡,這要是線性關係還**容得下第三者?!

最後乙個問題,乙個班級裡的點名冊,是不是線性表?

嗯,這個就是了。

學號

姓名

性別

職位1

張三男班長2

李四男副班長3王舞女

**課代表4張柳

女學生5趙六

男小組長

那在介紹抽象資料型別之前,我們應該了解資料型別的定義是什麼?

資料型別:是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。

例如很多程式語言的整型,浮點型,字元型這些指的就是資料型別。

當年那些設計計算機語言的人,為什麼會考慮到資料型別呢?

比如,大家都需要住房子,也都希望房子越大越好。但顯然,沒有多少錢的話考慮房子是沒啥意義的。

於是商品房就出現了各種各樣的房型,有別墅的,有錯層的,有單間的,甚至在北京還出現了膠囊公寓——只有兩平方公尺的房間。

這樣子就滿足了大家的不同需求。

同樣,在計算機中,記憶體也不是無限大的,你要計算入1+1=2這樣的整型數字的加減乘除運算,顯然不需要開闢很大的記憶體空間。

而如果要計算1.23456789+2.987654321這樣帶大量小數的,就需要開闢比較大的空間才存放的下。

於是計算機的研究者們就考慮,要對資料型別進行分類,分出多種資料型別來適合各種不同的計算條件差異。

例如在c語言中,按照取值的不同,資料型別可以分為兩類:

原子型別:不可以再分解的基本型別,例如整型、浮點型、字元型等。

結構型別:由若干個型別組合而成,是可以再分解的,例如整型陣列是由若干整型資料組成的。

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

我們對已有的資料型別進行抽象,就有了抽象資料型別。

抽象資料型別(abstract data type,adt)是指乙個數學模型及定義在該模型上的一組操作。

抽象資料型別的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關。

比如1+1=2這樣乙個操作,在不同cpu的處理上可能不一樣,但由於其定義的數學特性相同,所以在計算機程式設計者看來,它們都是相同的。

「抽象」的意義在於資料型別的數學抽象特性。

而且,抽象資料型別不僅僅指那些已經定義並實現的資料型別,還可以是計算機程式設計者在設計軟體程式時自己定義的資料型別。

例如乙個3d遊戲中,要定位角色的位置,那麼總會出現x,y,z三個整型資料組合在一起的座標。我們就可以定義乙個point的抽象資料型別,它擁有x,y,z三個整型變數,這樣我們就可以方便的對乙個角色的位置進行操作。

為了便於在之後的講解中對抽象資料型別進行規範的描述,我們給出了描述抽象資料型別的標準格式:

adt 抽象資料型別名

data

資料元素之間邏輯關係的定義

operation

操作endadt

上節課我們講到了線性表的定義,講到了所謂抽象資料型別就是把資料型別和相關操作**在一起。

那麼我們接下來分析一下,線性表應該有什麼樣的相關操作呢?

還是回到組織大家春遊的例子,老師把學生們按照規律安排成一隊,並且是長期使用這樣的順序排隊,大家只需要記住自己的前驅學生就可以了。那麼這個考慮和安排的過程其實就是乙個線性表的建立和初始化過程。

一開始老師沒經驗呀,把同學們按照名字第乙個字母的規律排隊,發現排到最後有的高有的矮,導致隊伍很難看,於是讓同學們解散重新按照從矮到高排。

上邊這麼描述的過程其實就是線性表重置為空表的操作過程,接著給大家描述下刪除資料。

排好隊後,尼瑪,發現小明童鞋由於昨晚吃太多麻辣燙,今天鬧肚子來不了春遊。那麼由原來排在小明後邊的小花開始往前挪。

當然有刪除資料就有插入資料,小明童鞋下午肚子**了,又回來了。小明童鞋說記得是排在小陽後邊的,所以讓從小陽後邊的小花開始往後退乙個位置,小明就可以插回自己的位置上了。

噢,我們活動開始了不久,隔壁來了春田花花旅遊團都是美眉啊,各種調戲有木有?然後老師被她們的導遊投訴了有木有?!導遊說你們隊伍裡第八個那個傢伙老是調戲我們隊裡的小舞,他叫什麼名字?老師查了下名單說,噢,他叫胖虎。

好吧,這就是根據位序得到資料元素的例子。

好了,剩下的還有很多大家可以自己想象。

adt 線性表(list)

data

線性表的資料物件集合為,每個元素的型別均為datatype。其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。資料元素之間的關係是一對一的關係。

operation

initlist(*l): 初始化操作,建立乙個空的線性表l。

listempty(l): 判斷線性表是否為空表,若線性表為空,返回true,否則返回false。

clearlist(*l): 將線性表清空。

getelem(l,i,*e): 將線性表l中的第i個位置元素值返回給e。

listdelete(*l,i,*e): 刪除線性表l中第i個位置元素,並用e返回其值。

listlength(l): 返回線性表l的元素個數。

endadt

對於不同的應用,線性表的基本操作是不同的,上述操作是最基本的,對於實際問題中涉及的關於線性表的更複雜操作,完全可以用這些基本操作的組合來實現。

舉個例子?好吧,比如要實現兩個線性表a、b的並集操作,即要使得集合a=a∪b。

解釋下「a=a∪b」:說白了,就是把存在集合b中但不存在集合a中的元素插入到a中即可。

其實仔細思考一下,我們只需要迴圈遍歷集合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)}}

資料結構 線性表演算法

1.線性表 線性表是n個具有相同特性的資料元素的有限序列。線性表的主要儲存結構 順序儲存結構 順序表 鏈式儲存結構 鍊錶 2.順序儲存 儲存空間連續,用一組連續的儲存單元依次存放資料元素 即邏輯上相鄰的元素,其物理位置也相鄰。優點 隨機訪問 缺點 插入刪除結點困難 擴充套件不靈活 3.鏈式儲存 儲存...

資料結構與演算法 線性表

概念 一種資料結構,每個結點最多只有乙個前驅結點和乙個後繼結點 類別 順序表 定長 鍊錶 變長 棧 棧頂刪除 彈棧 棧頂插入 壓棧 後進先出 lifo 佇列 隊頭刪除 出隊 隊尾插入 入隊 先進先出 fifo 線性表的抽象資料型別定義 c 1.template2.class list 棧的抽象資料型...

資料結構與演算法 線性表

n維向量 x1,x2,xn 是乙個長度為n的線性表 英文小寫字母表 a,b,c,z 是乙個長度為26的線性表 一年中的四個季節 春,夏,秋,冬 是乙個長度為4的線性表 矩陣是乙個比較複雜的線性表 學生情況登記表是乙個複雜的線性表 由若干資料項組成的資料元素稱為記錄 由多個記錄構成的線性表又稱為檔案 ...