線性表的定義

2021-07-23 13:30:08 字數 3715 閱讀 3401

線性表:

零個或多個資料元素的有限序列。

3.1開場白

今天我們要開始學習資料結構中最常用和最簡單的一種結構,在介紹它之前先講個例子。

我經常下午去幼兒園接送兒子,每次都能在門口看到老師帶著小朋友們,乙個拉著另乙個的衣服,依次從教室出來。而且我發現很有規律的是,每次他們的次序都是一樣。比如我兒子排在第5個,每次他都是在第5個,前面同樣是那個小女孩,後面一直是那個小男孩。這點讓我很奇怪,為什麼一定要這樣?

有一天我就問老師原因。她告訴我,為了保障小朋友的安全,避免漏掉小朋友,所以給他們安排了出門的次序,事先規定好了,誰在誰的前面,誰在誰的後面。這樣養成習慣後,如果有誰沒有到位,他前面和後面的小朋友就會主動報告老師,某人不在。即使以後如果要外出到公園或博物館等情況下,老師也可以很快地清點人數,萬一有人走丟,也能在最快時間知道,及時去尋找。

我一想,還真是這樣。小朋友們始終按照次序排隊做事,出意外的情況就可能會少很多。畢竟,遵守秩序是文明的標誌,應該從娃娃抓起。而且,真要有人丟失,小孩子反而是最認真負責的監督員。

再看看門外的這幫家長們,都擠在大門口,哪個分得清他們誰是誰呀。與小孩子們的井然有序形成了鮮明的對比。哎,有時大人的所作所為,其實還不如孩子。

這種排好隊的組織方式,其實就是今天我們要介紹的資料結構:線性表。

3.2線性表的定義

線性表,從名字上你就能感覺到,是具有像線一樣的性質的表。在廣場上,有很多人分散在各處,當中有些是小朋友,可也有很多大人,甚至還有不少寵物,這些小朋友的資料對於整個廣場人群來說,不能算是線性表的結構。但像剛才提到的那樣,乙個班級的小朋友,乙個跟著乙個排著隊,有乙個打頭,有乙個收尾,當中的小朋友每乙個都知道他前面乙個是誰,他後面乙個是誰,這樣如同有一根線把他們串聯起來了。就可以稱之為線性表。

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

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

首先它是乙個序列。也就是說,元素之間是有順序的,若元素存在多個,則第乙個元素無前驅,最後乙個元素無後繼,其他每個元素都有且只有乙個前驅和後繼。如果乙個小朋友去拉兩個小朋友後面的衣服,那就不可以排成一隊了;同樣,如果乙個小朋友後面的衣服,被兩個甚至多個小朋友拉扯,這其實是在打架,而不是有序排隊。

然後,線性表強調是有限的,小朋友班級人數是有限的,元素個數當然也是有限的。事實上,在計算機中處理的物件都是有限的,那種無限的數列,只存在於數學的概念中。

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

若將線性表記為(a1,…,ai-1,ai,ai+1,…,an),則表中ai-1領先於ai,ai+1領先於ai,稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素。當i=1,2,…,n-1時,ai有且僅有乙個直接後繼,當i=2,3,…,n時,ai有且僅有乙個直接前驅。如圖3-2-1所示。

圖3-2-1

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

我現在說一些資料集,大家來判斷一下是否是線性表。

先來乙個大家最感興趣的,一年裡的星座列表,是不是線性表呢?如圖3-2-2所示。

圖3-2-2

當然是,星座通常都是用白羊座打頭,雙魚座收尾,當中的星座都有前驅和後繼,而且一共也只有十二個,所以它完全符合線性表的定義。

公司的組織架構,總經理管理幾個總監,每個總監管理幾個經理,每個經理都有各自的下屬和員工。這樣的組織架構是不是線性關係呢?

不是,為什麼不是呢?哦,因為每乙個元素,都有不只乙個後繼,所以它不是線性表。那種讓乙個總經理只管乙個總監,乙個總監只管乙個經理,乙個經理只管乙個員工的公司,俗稱皮包公司,崗位設定等於就是在忽悠外人。

班級同學之間的友誼關係,是不是線性關係?哈哈,不是,因為每個人都可以和多個同學建立友誼,不滿足線性的定義。嗯?有人說愛情關係就是了。胡扯,難道每個人都要有乙個愛的人和乙個愛自己的人,而且他們還都不可以重複愛同乙個人這樣的情況出現,最終形成乙個班級情感人物串聯?這怎麼可能,也許網路**裡可能出現,但現實中是不可能的。

班級同學的點名冊,是不是線性表?是,這和剛才的友誼關係是完全不同了,因為它是有限序列,也滿足型別相同的特點。這個點名冊(如表3-2-1所示)中,每乙個元素除學生的學號外,還可以有同學的姓名、性別、出生年月什麼的,這其實就是我們之前講的資料項。在較複雜的線性表中,乙個資料元素可以由若干個資料項組成。

表3-2-1

一群同學排隊買演唱會門票,每人限購一張,此時排隊的人群是不是線性表?是,對的。此時來了三個同學要插當中乙個同學a的隊,說同學a之前拿著的三個書包就是用來佔位的,書包也算是在排隊。如果你是後面早已來排隊的同學,你們願不願意?肯定不願意,書包怎麼能算排隊的人呢,如果這也算,我渾身上下的衣服褲子都在排隊了。於是不讓這三個人進來。

這裡用線性表的定義來說,是什麼理由?嗯,因為要相同型別的資料,書包根本不算是人,當然排隊無效,三個人想不勞而獲,自然遭到大家的譴責。看來大家的線性表學得都不錯。

3.3 線性表的抽象資料型別

前面我們已經給了線性表的定義,現在我們來分析一下,線性表應該有一些什麼樣的操作呢?

還是回到剛才幼兒園小朋友的例子,老師為了讓小朋友有秩序地出入,所以就考慮給他們排乙個隊,並且是長期使用的順序,這個考慮和安排的過程其實就是乙個線性表的建立和初始化過程。

一開始沒經驗,把小朋友排好隊後,發現有的高有的矮,隊伍很難看,於是就讓小朋友解散重新排——這是乙個線性表重置為空表的操作。

排好了隊,我們隨時可以叫出隊伍某一位置的小朋友名字及他的具體情況。比如有家長問,隊伍裡第五個孩子,怎麼這麼調皮,他叫什麼名字呀,老師可以很快告訴這位家長,這就是封清揚的兒子,叫封雲卞。我在旁就非常扭捏,看來是我給兒子的名字沒取好,兒子讓班級"風雲突變"了。這種可以根據位序得到資料元素也是一種很重要的線性表操作。

還有什麼呢,有時我們想知道,某個小朋友,比如麥兜是否是班裡的小朋友,老師會告訴我說,不是,麥兜在春田花花幼兒園裡,不在我們幼兒園。這種查詢某個元素是否存在的操作很常用。

而後有家長問老師,班裡現在到底有多少個小朋友呀,這種獲得線性表長度的問題也很普遍。

顯然,對於乙個幼兒園來說,加入乙個新的小朋友到佇列中,或因某個小朋友生病,需要移除某個位置,都是很正常的情況。對於乙個線性表來說,插入資料和刪除資料都是必須的操作。

所以,線性表的抽象資料型別定義如下:

adt 線性表(list)

data

線性表的資料物件集合為,每個元素的型別均為datatype。

其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,

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

資料元素之間的關係是一對一的關係。

operation

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

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

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

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

如果查詢成功,返回該元素在表中序號表示成功;

仔細分析一下這個操作,發現我們只要迴圈集合b中的每個元素,判斷當前元素是否存在a中,若不存在,則插入到a中即可。思路應該是很容易想到的。

void unionl(list *la, list lb)

} 這裡,我們對於union操作,用到了前面線性表基本操作listlength、getelem、locateelem、listinsert等,可見,對於複雜的個性化的操作,其實就是把基本操作組合起來實現的。

注意乙個很容易混淆的地方:當你傳遞乙個引數給函式的時候,這個引數會不會在函式內被改動決定了使用什麼引數形式。如果需要被改動,則需要傳遞指向這個引數的指標,如果不用被改動,可以直接傳遞這個引數。

線性表 定義

線性表分類 線性表分為兩種 1.順序儲存 順序表 2.鏈式儲存 單鏈表雙鏈表 迴圈鍊錶 靜態鍊錶 其中單鏈表,雙鏈表,迴圈鍊錶都是由指標實現,而靜態鍊錶由陣列實現 線性表的基本概念 線性表的特點 線性表中元素個數是有限的 表中具有邏輯上的順序性,表中元素有其先後次序 表中元素都是資料元素,每個元素都...

線性表定義 線性表順序儲存結構

線性表 由零個或多個資料元素組成的有限序列。簡單的說,就像排隊一樣,具有先一樣性質的結構。關鍵 資料元素的個數稱為線性表的長度,當線性表長度為零時,稱為空表。表起始位置稱表頭,表結束位置稱表尾。線性表有兩種物理儲存結構 順序儲存結構和鏈式儲存結構。物理上的儲存方式事實上就是在記憶體中找個初始位址,然...

線性表的型別定義

線性表一種最常用且最簡單的資料結構 線性表是乙個相當靈活的資料結構,它的長度可根據需要增長或縮短,即對線性表的資料元素 不僅可以進行訪問還可以進行插入刪除等操作。抽象資料型別線性表的定義如下 演算法2.1 void union list la,list lb union例2 2已知線性表la和lb中...