二分圖基本存儲結構
① 圖的存儲結構是什麼
由於圖的結構比較復雜,任意兩個頂點之間都可能存在關系(邊),無法通過存儲位置表示這種任意的邏輯關系,所以,圖無法採用順序存儲結構。這一點同其他數據結構(如線性表、樹)不同。考慮圖的定義,圖是由頂點和邊組成的,所以,分別考慮如何存儲頂點和邊。圖常用的存儲結構有鄰接矩陣、鄰接表、十字鏈表和鄰接多重表。
② 二叉樹的存儲結構是怎樣的有哪些類型的存儲結構對應的c語言描述是
樓上回答的是樹的存儲,不是二叉樹的存儲,主要如下:
1、順序存儲:適用於完全二叉樹,如果根從1開始編號,則第i結點的左孩子編號為2i,右孩子為2i+1,雙親編號為(i/2)下取整,空間緊密
2、二叉鏈表:適用於普通二叉樹,每個結點除了數據外,還有分別指向左右孩子結點的指針,存儲n個結點有n+1個空指針域,存儲密度小於順序存儲,但是適用范圍廣,缺陷是正常遍歷只能從雙親向孩子,退回來一般需要藉助棧(或者用遞歸,其實也是棧)
3、三叉鏈表:同樣適用於普通二叉樹,結點除了數據外,還有左右孩子與雙親的指針,存儲密度低於二叉鏈表,但是可以非常方便地在二叉樹中遍歷,不需要其他輔助工具
③ 熟悉計算機基礎,會資料庫的,幫忙做題
基本要求 ⒈具有計算機及其應用的基礎知識。 ⒉熟悉計算機操作系統、軟體工程和資料庫的原理及其應用。 ⒊具有計算機體系結構、系統組成和性能評價的基礎及應用知識。 ⒋具有計算機網路和通信的基礎知識。 ⒌具有計算機應用項目開發的分析設計和組織實施的基本能力。 ⒍具有計算機應用系統安全和保密性知識。 考試內容 一、計算機系統組成及工作原理⒈計算機系統組成: ⑴計算機的發展。 ⑵計算機的分類及應用。 ⑶計算機硬體結構。 ⑷主要部件功能。 ⑸計算機軟體的功能與分類。 ⑹系統軟體與應用軟體。 ⒉計算機工作原理: ⑴計算機中數的表示。 ⑵運算器。 ⑶控制器。 ⑷存儲器。 ⑸輸入與輸出系統。 ⒊計算機的主要性能: ⑴計算機系統性能指標。 ⑵處理機指標。 ⑶存儲容量能力。 ⑷I/O匯流排能力。 ⑸系統通信能力。 ⑹聯機事務處理能力。 ⑺軟體支持。 二、數據結構與演算法 ⒈基本概念: ⑴數據結構的基本概念。 ⑵演算法的描述與分析。 ⒉線性表: ⑴線性表的邏輯結構。 ⑵線性表的順序存儲結構。 ⑶線性表的鏈式存儲結構。 ⒊數組: ⑴數組的定義與運算。 ⑵數組的順序存儲結構。 ⑶矩陣的壓縮存儲。 ⒋棧與隊列: ⑴棧的定義和運算。 ⑵棧的存儲結構。 ⑶隊列的定義和運算。 ⑷鏈隊列與循環隊列。 ⒌串: ⑴串及其操作。 ⑵串的存儲結構。 ⒍樹和二叉樹: ⑴樹的定義。 ⑵二叉樹的定義及性質。 ⑶二叉樹與樹的轉換。 ⑷二叉樹的存儲。 ⑸遍歷二叉樹與線索二叉樹。 ⒎圖: ⑴圖及其存儲結構。 ⑵圖的遍歷。 ⑶圖的連通性。 ⑷有向無環圖。 ⑸最短路徑。 ⑹拓撲排序。 ⒏查找: ⑴線性表查找。 ⑵樹形結構與查找。 ⑶散列查找。 ⒐排序: ⑴插入排序。 ⑵交換排序。 ⑶選擇排序。 ⑷歸並排序。 ⑸基數排序。⒑文件組織: ⑴順序文件。 ⑵索引文件。 ⑶散列文件。三、離散數學 ⒈數理邏輯: ⑴命題及其符號化。 ⑵命題公式及其分類。 ⑶命題邏輯等值演算。 ⑷範式。 ⑸命題邏輯推理理論。 ⑹謂詞與量詞。 ⑺謂詞公式與解釋。 ⑻謂詞公式的分類。 ⑼謂詞邏輯等值演算與前束範式。 ⑽謂詞邏輯推理理論。 ⒉集合論: ⑴集合及其表示。 ⑵集合的運算。 ⑶有序對與笛卡爾積。 ⑷關系及其表示法。 ⑸關系的運算。 ⑹關系的性質。 ⑺關系的閉包。 ⑻復合關系與逆關系。 ⑼等價關系與偏序關系。 ⑽函數及其性質。 ⑾反函數與復合函數。 ⒊代數系統: ⑴代數運算及其性質。 ⑵同態與同構。 ⑶半群與群。 ⑷子群與陪集。 ⑸正規子群與商群。 ⑹循環群與置換群。 ⑺環與域。 ⑻格與布爾代數。 ⒋圖論: ⑴無向圖與有向圖。 ⑵路、迴路與圖的連通性。 ⑶圖的矩陣表示。 ⑷最短路徑與關鍵路徑。 ⑸二部圖。 ⑹歐拉圖與哈密爾頓圖。 ⑺平面圖。 ⑻樹與生成樹。 ⑼根樹及其應用。四、操作系統 ⒈操作系統的基本概念: ⑴操作系統的功能。 ⑵操作系統的基本類型。 ⑶操作系統的組成。 ⑷操作系統的介面。 ⒉進程管理: ⑴進程、線程與進程管理。 ⑵進程式控制制。 ⑶進程調度。 ⑷進程通信。 ⑸死鎖。 ⒊作業管理: ⑴作業與作業管理。 ⑵作業狀態及其轉換。 ⑶作業調度。 ⑷作業控制。 ⒋存儲管理: ⑴存儲與存儲管理。 ⑵虛擬存儲原理。 ⑶頁式存儲。 ⑷段式存儲。 ⑸段頁式存儲。 ⑹局部性原理與工作集概念。 ⒌文件管理: ⑴文件與文件管理。 ⑵文件的分類。 ⑶文件結構與存取方式。 ⑷文件目錄結構。 ⑸文件存儲管理。 ⑹文件存取控制。 ⑺文件的使用。 ⒍設備管理: ⑴設備與設備分類。 ⑵輸入輸出控制方式。 ⑶中斷技術。 ⑷通道技術。 ⑸設備分配技術與SPOOLING系統。⑹磁碟調度。⑺設備管理。 ⒎一種典型操作系統(DOS/Unix/Windows)的使用: ⑴DOS的特點與使用。 ⑵UNIX的特點與使用。 ⑶Windows的特點與使用。 五、軟體工程1.軟體工程基本概念: ⑴軟體與軟體危機。 ⑵軟體生命周期與軟體工程。 ⑶軟體開發技術與軟體工程管理。 ⑷軟體開發方法與工具、環境。 2.結構化生命周期方法: ⑴瀑布模型。 ⑵可行性研究與可行性研究報告。 ⑶軟體計劃與進度安排。 ⑷軟體需求分析。
④ 圖的存儲結構有哪些
最常見的:
順序查找:適合順序結構和鏈式結構
二分查找:適合順序結構
其他的二叉查找樹、B-樹之類有自己的數據結構
⑤ 二分查找法只適用什麼存儲結構的線性表,且數據元素必須為什麼
說」二分查找法只適用於順序存儲的有序表「是正確的。
說」指線性表中的元素按值非遞減排列(即從小到大,但允許相鄰元素值相等)「是為了程序的確定性,實際上只要有序就可以,按遞減排序也可以用二分法。
⑥ 關於計算機4級考試
不分。具體如下:
計算機四級考試大綱
基本要求
1、具有計算機及其應用的基礎知識。
2、熟悉計算機操作系統、軟體工程和資料庫的原理及其應用。
3、具有計算機體系結構、系統組成和性能評價的基礎及應用知識。
4、具有計算機網路和通信的基礎知識。
5、具有計算機應用項目開發的分析設計和組織實施的基本能力。
6、具有計算機應用系統安全和保密知識。 考試內容
一、計算機系統組成及工作原理
1、計算機系統組成:
(1)計算機的發展。(2)計算機的分類及應用。(3)計算機硬體結構。(4)主要部件功能。(5)計算機軟體的功能與分類。(6)系統軟體與應用軟體。
2、計算機工作原理:
(1)計算機機中數的表示。 (2)運算器。 (3)控制器。 (4)存儲器。 (5)輸入與輸出系統。
3、計算機的主要性能:
(1)計算機系統性能指標。 (2)處理機指標。 (3)存儲容量指標。 (4)I/O匯流排能力。 (5)系統通信能力。 (6)聯機事務處理能力。 (7)軟體支持。
二、數據結構與演算法
1、基本概念:
(1)數據結構的基本概念。 (2)演算法的描述與分析。
2、線性表:
(1)線性表的邏輯結構。 (2)線性表的順序存儲結構。 (3)線性表的鏈式存儲結構。
3、數組:
(1)數組的定義與運算。(2)數組的順序存儲結構。 (3)矩陣的壓縮存儲。
4、棧與隊列:
(1)棧的定義和運算。 (2)棧的存儲結構。 (3)隊列的定義和運算。 (4)鏈隊列與循環隊列。
5、串:
(1)串及其操作。 (2)串的存儲結構。
6、樹和二叉樹:
(1)樹的定義。 (2)二叉樹的定義及性質。 (3)二叉樹與樹的轉換。(4)二叉樹的存儲。(5)遍歷二叉樹與線索二叉樹。
7、圖:
(1)圖及其存儲結構。 (2)圖的遍歷。 (3)圖的連通性。 (4)有向無環圖。 (5)最短路徑。 (6)拓撲排序。
8、查找:
(1)線性表查找。 (2)樹形結構與查找。 (3)散列查找。
9、排序:
(1)插入排序。 (2)交換排序。 (3)選擇排序。 (4)歸並排序。 (5)基數排序。
10、文件組織:
(1)順序文件。 (2)索引文件。 (3)散列文件。
三、離散數學
1、數理邏輯:
(1)命題及其符號化。 (2)命題公式及其分類。 (3)命題邏輯等值演算。 (4)範式。 (5)命題邏輯推理理論。 (6)謂詞與量詞。 (7)謂詞公式與解釋。 (8)謂詞公式的分類。 (9)謂詞邏輯等值演算與前束範式。 (10)謂詞邏輯推理理論。
2、集合論:
(1)集合及其表示。 (2)集合的運算。 (3)有序對與笛卡爾積。 (4)關系及其表示法。 (5)關系的運算。 (6)關系的性質。 (7)關系的閉包。 (8)復合關系與逆關系。 (9)等價關系與偏序關系。 (10)函數及其性質。 (11)反函數與復合函數。
3、代數系統:
(1)代數運算及其性質。 (2)同態與同構。 (3)半群與群。 (4)子集與陪集。 (5)正規子群與商群。 (6)循環群與置換群。 (7)環與域。 (8)格與布爾代數。
4、圖論:
(1)無向圖與有向圖。 (2)路、迴路與圖的連通性。 (3)圖的矩陣表示。 (4)最短路徑與關鍵路徑。 (5)二部圖。 (6)歐拉圖與哈密爾頓圖。 (7)平面圖。 (8)樹與生成樹。 (9)根樹及其應用。
四、操作系統
1、操作系統的基本概念:
(1)操作系統的功能。 (2)操作系統的基本類型。 (3)操作系統的組成。 (4)操作系統的介面。
2、進程管理:
(1)進程、線程與進程管理。 (2)進程式控制制。 (3)進程調度。 (4)進程通信。 (5)死鎖。
3、作業管理:
(1)作業與作業管理。 (2)作業狀態及其轉換。 (3)作業調度。 (4)作業控制。
4、存儲管理:
(1)存儲與存儲管理。 (2)虛擬存儲原理。 (3)頁式存儲。 (4)段式存儲。 (5)段頁式存儲。 (6)局部性原理與工作集概念。
5、文件管理:
(1)文件與文件管理。 (2)文件的分類。 (3)文件結構與存取方式。 (4)文件目錄結構。 (5)文件存儲管理。 (6)文件存取控制。 (7)文件的作用。
6、設備管理:
(1)設備與設備分類。 (2)輸入輸出控制方式。 (3)中斷技術。 (4)通道技術。 (5)緩沖技術。 (6)設備分配技術與SPOOLing系統。 (7)磁碟調度。 (8)設備管理。
7、一種典型操作系統(DOS/Unix/Windows)的使用:
(1)DOS的特點與使用。 (2)UNIX的特點與使用。 (3)Windows的特點與使用。
五、軟體工程
1、軟體工程基本概念:
(1)軟體與軟體危機。 (2)軟體生命周期與軟體工程。 (3)軟體開發技術與軟體工程管理。 (4)軟體開發方法與工具、環境。
2、結構化生命周期方法:
(1)瀑布模型。 (2)可行性研究與可行性研究報告。 (3)軟體計劃與進度安排。 (4)軟體需求分析。 (5)數據流程圖(DFD)、數據字典(DD)。 (6)軟體需求說明書。 (7)系統設計。 (8)概要設計與詳細設計。 (9)模塊結構設計與數據結構設計。 (10)介面設計與安全性設計。 (11)系統設計說明書。 (12)程序設計。 (13)程序設計語言。 (14)結構化程序設計。
3、原型化方法:
(1)原型化的基本原理。 (2)原型化的生命周期。 (3)原型化的人員與工具。 (4)原型化的實施。 (5)原型化的項目管理。 (6)原型化方法與結構化方法的關系。
4、軟體測試:
(1)軟體測試基本概念。 (2)軟體測試方法。 (3)軟體測試計劃。 (4)單元測試、集成測試與系統測試。 (5)測試用例設計。 (6)測試分析報告。
5、軟體維護:
(1)軟體可維護性。 (2)校正性維護。 (3)適應性維護。 (4)完善性維護。
6、軟體開發工具與環境:
(1)軟體開發工具。 (2)軟體開發環境。 (3)計算機輔助軟體工程(CASE)。
7、軟體質量評價:
(1)軟體質量的度量與評價模型。 (2)軟體復雜性的度量。 (3)軟體可靠性的評價。 (4)軟體性能的評價。 (5)軟體運行評價。
8、軟體管理:
(1)軟體管理職能。 (2)軟體開發組織。 (3)軟體計劃管理。 (4)標准化管理。 (5)軟體工程國家標准。 (6)軟體配置管理。 (7)軟體產權保護。
六、資料庫
1、資料庫基本概念:
(1)數據與數據模型。 (2)資料庫體系結構。 (3)資料庫管理系統與資料庫系統。 (4)資料庫工程與應用。
2、關系資料庫:
(1)關系資料庫的基本概念。 (2)關系數據模型。 (3)關系定義、關系模型、關系模式與關系子模式。 (4)數據操縱語言。 (5)關系代數。 (6)集合運算(並,差,交,笛卡爾積)與關系運算(投影,選擇,連接)。 (7)關系演算。 (8)元組關系演算與域關系演算。 (9)資料庫查詢語言。 (10)SQL語言。
3、關系資料庫設計理論:
(1)關系數據理論。 (2)函數依賴。 (3)關系模式分解。 (4)關系模式的範式。
4、資料庫設計:
(1)資料庫設計目標。 (2)資料庫設計方法。 (3)資料庫的設計步驟。 (4)資料庫規劃。 (5)需求分析。 (6)概念設計。 (7)邏輯設計。 (8)物理設計。 (9)資料庫的實現與維護。
5、資料庫的保護:
(1)資料庫恢復。 (2)資料庫的完整性。 (3)資料庫的並發控制。 (4)資料庫的安全性。
6、一種資料庫管理系統(FoxPro/Oracle)應用:
(1)FoxPro DBMS的結構、特點及應用。 (2)Oracale DBMS的結構、特點及應用。
七、計算機體系結構
1、體系結構的基本概念:
(1)體系結構的定義。 (2)系統的功能層次。 (3)系統的分類。 (4)體系結構的繼承與發展。 (5)系統的安全性。
2、指令系統:
(1)指令格式及其優化。 (2)指令系統的復雜化。 (3)RISC技術。 (4)MIPS與MFLOPS。
3、存儲體系:
(1)存儲層次。 (2)虛存工作原理。 (3)Cache工作原理。
4、通道及新型匯流排:
(1)I/O方式的發展。 (2)通道工作原理。 (3)EISA與MCA。 (4)局部匯流排:VFSA與PCI。
5、並行處理技術:
(1)流水線技術。 (2)超流水線與超標量技術。 (3)向量處理機。 (4)多機系統。
6、系統性能評價:
(1)性能評價的概念。 (2)測試程序的分類。 (3)Benchmark的舉例。
八、計算機網路與通信
1、計算機網路的基本概念:
(1)網路的定義。 (2)網路的分類。 (3)網路的功能。 (4)網路拓撲。 (5)典型計算機網路組成。
2、數據通信技術:
(1)數據通信的基本概念。 (2)數據通信系統的組成。 (3)傳輸介質的類型與特點。 (4)數據傳輸方式。 (5)數據編碼方式。 (6)同步方式。 (7)線路復用技術。 (8)數據交換方式。 (9)差錯控制方法。
3、網路體系結構:
(1)網路體系結構的基本概念。 (2)ISO/OSIRM。 (3)物理層協議。 (4)數據鏈路層協議。 (5)網路層協議與X.25網層次。 (6)傳輸層協議。 (7)高層協議。
4、區域網技術:
(1)區域網拓撲。 (2)區域網傳輸介質。 (3)IEEE802模型與標准。 (4)CSMA/CD工作原理。 (5)Token Bus工作原理。 (6)Token Ring工作原理。 (7)FDDI工作原理。 (8)局部網互連與TCP/IP協議。 (9)區域網操作系統。 (10)區域網組網技術。 (11)區域網應用系統的安全性設計。
5、網路技術的發展:
(1)高速區域網。 (2)ISDN與B-ISDN。 (3)城域網。 (4)幀中繼。 (5)ATM技術。 (6)智能大廈與網路綜合布線技術。 (7)Clinent/Server的應用技術。 (8)ISO網路管理概念與標准。
上機測試內容
1、計算機操作能力。
2、C語言程序設計能力。
3、項目開發能力。
4、開發工具的使用能力。
上機測試說明
1、考試形式包括課堂筆試(180分鍾)和上機測試(60分鍾)。
2、試題包括選擇題和論述題兩種類型。
3、筆試中的選擇題用中、英兩種文字命題,其中英文題約佔三分之一,論述題用中文命題。
⑦ 常用的存儲架構有
順序存儲方法它是把邏輯上相鄰的結點存儲在物理位置相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接關系來體現,由此得到的存儲表示稱為順序存儲結構。順序存儲結構是一種最基本的存儲表示方法,通常藉助於程序設計語言中的數組來實現。
鏈接存儲方法它不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關系是由附加的指針欄位表示的。由此得到的存儲表示稱為鏈式存儲結構,鏈式存儲結構通常藉助於程序設計語言中的指針類型來實現。
順序存儲和鏈接存儲的基本原理
順序存儲和鏈接存儲是數據的兩種最基本的存儲結構。
在順序存儲中,每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過數組下標位置簡單計算出來的線性表的順序存儲,若一個元素存儲在對應數組中的下標位置為i,則它的前驅元素在對應數組中的下標位置為i-1,它的後繼元素在對應數組中的下標位置為i+1。在鏈式存儲結構中,存儲結點不僅含有所存元素本身的信息,而且含有元素之間邏輯關系的信息。
數據的鏈式存儲結構可用鏈接表來表示。
其中data表示值域,用來存儲節點的數值部分。Pl,p2,…,Pill(1n≥1)均為指針域,每個指針域為其對應的後繼元素或前驅元素所在結點(以後簡稱為後繼結點或前驅結點)的存儲位置。通過結點的指針域(又稱為鏈域)可以訪問到對應的後繼結點或前驅結點,若一個結點中的某個指針域不需要指向其他結點,則令它的值為空(NULL)。
在數據的順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同;而在數據的鏈接存儲中,由於每個元素的存儲位置保存在它的前驅或後繼結點中,所以只有當訪問到其前驅結點或後繼結點後才能夠按指針訪問到,訪問任一元素的時間與該元素結點在鏈式存儲結構中的位置有關。
儲存器方面的儲存結構
儲存系統的層次結構為了解決存儲器速度與價格之間的矛盾,出現了存儲器的層次結構。
程序的局部性原理
在某一段時間內,CPU頻繁訪問某一局部的存儲器區域,而對此范圍外的地址則較少訪問的現象就是
程序的局部性原理。層次結構是基於程序的局部性原理的。對大量典型程序運行情況的統計分析得出的結論是:CPU對某些地址的訪問在短時間間隔內出現集中分布的傾向。這有利於對存儲器實現層次結構。
多級存儲體系的組成
目前,大多採用三級存儲結構。
即:Cache-主存-輔存,如下圖:
3、多級存儲系統的性能
考慮由Cache和主存構成的兩級存儲系統,其性能主要取決於Cache和貯存的存取周期以及訪問它們的
次數。(存取周期為: Tc,Tm ;訪問次數為: Nc,Nm)
(1)Cache的命中率 H= Nc / (Nc+Nm)
(2)CPU訪存的平均時間 Ta= H * Tc+ (1-H) Tm
Cache-主存系統的效率
e= Tc / Ta
=1/H+(1-H)Tm/Tc
根據統計分析:Cache的命中率可以達到90%~98%
當Cache的容量為:32KB時,命中率為86%
64KB時,命中率為92%
128KB時,命中率為95%
256KB時,命中率為98%
⑧ 圖的存儲結構——所存儲的信息有哪些
一、鄰接矩陣存儲方法
鄰接矩陣是表示頂點之間相鄰關系的矩陣。
設G=(V,E)是具有n(n>0)個頂點的圖,頂點的順序依次為0~n-1,則G的鄰接矩陣A是n階方陣,其定義如下:
(1)如果G是無向圖,則:
A[i][j]=1:若(i,j)∈E(G) 0:其他
(2)如果G是有向圖,則:
A[i][j]=1:若<i,j>∈E(G) 0:其他
(3)如果G是帶權無向圖,則:
A[i][j]= wij :若i≠j且(i,j)∈E(G) 0:i=j ∞:其他
(4)如果G是帶權有向圖,則:
A[i][j]= wij :若i≠j且<i,j>∈E(G) 0:i=j∞:其他
注意:帶權圖和不帶權圖表示的元素類型不同。
帶權圖(不論有向還是無向圖)A[i][j]用double表示,不帶權圖(不論有向還是無向圖)A[i][j]用int表示。
用一維數組G[ ]存儲有4個頂點的無向圖如:G[ ] = { 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 }
則頂點2和頂點0之間是有邊的。
如:
鄰接矩陣的特點如下:
(1)圖的鄰接矩陣表示是唯一的。
(2)無向圖的鄰接矩陣一定是一個對稱矩陣。因此,按照壓縮存儲的思想,在具體存放鄰接矩陣時只需存放上(或下)三角形陣的元素即可。
(3)不帶權的有向圖的鄰接矩陣一般來說是一個稀疏矩陣。因此,當圖的頂點較多時,可以採用三元組表的方法存儲鄰接矩陣。
(4)對於無向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的度。
(5)對於有向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的出度(或入度)。
(6)用鄰接矩陣方法存儲圖,很容易確定圖中任意兩個頂點之間是否有邊相連。但是,要確定圖中有多少條邊,則必須按行、按列對每個元素進行檢測,所花費的時間代價很大。這是用鄰接矩陣存儲圖的局限性。
鄰接矩陣的數據類型定義如下:
#define MAXV <最大頂點個數>
typedef struct
{ int no; //頂點編號
InfoType info; //頂點其他信息
} VertexType; //頂點類型
typedef struct //圖的定義
{ int edges[MAXV][MAXV]; //鄰接矩陣
int n,e; //頂點數,弧數
VertexType vexs[MAXV]; //存放頂點信息
} MGraph; //圖的鄰接矩陣表示類型
二、 鄰接表存儲方法
圖的鄰接表存儲方法是一種順序分配與鏈式分配相結合的存儲方法。
在鄰接表中,對圖中每個頂點建立一個單鏈表,第i個單鏈表中的節點表示依附於頂點i的邊(對有向圖是以頂點i為尾的邊)。每個單鏈表上附設一個表頭節點。
其中,表節點由三個域組成,adjvex指示與頂點i鄰接的點在圖中的位置,nextarc指示下一條邊或弧的節點,info存儲與邊或弧相關的信息,如權值等。
表頭節點由兩個域組成,data存儲頂點i的名稱或其他信息,firstarc指向鏈表中第一個節點。
typedef struct ANode
{ int adjvex; //該邊的終點編號
struct ANode *nextarc; //指向下一條邊的指針
InfoType info; //該邊的相關信息
} ArcNode; //邊表節點類型
typedef struct Vnode
{ Vertex data; //頂點信息
ArcNode *firstarc; //指向第一條邊
} VNode; //鄰接表頭節點類型
typedef VNode AdjList[MAXV]; //AdjList是鄰接表類型
typedef struct
{ AdjList adjlist; //鄰接表
int n,e; //圖中頂點數n和邊數e
} ALGraph; //完整的圖鄰接表類型
鄰接表的特點如下:
(1)鄰接表表示不唯一。這是因為在每個頂點對應的單鏈表中,各邊節點的鏈接次序可以是任意的,取決於建立鄰接表的演算法以及邊的輸入次序。
(2)對於有n個頂點和e條邊的無向圖,其鄰接表有n個頂點節點和2e個邊節點。顯然,在總的邊數小於n(n-1)/2的情況下,鄰接表比鄰接矩陣要節省空間。
(3)對於無向圖,鄰接表的頂點i對應的第i個鏈表的邊節點數目正好是頂點i的度。
(4)對於有向圖,鄰接表的頂點i對應的第i個鏈表的邊節點數目僅僅是頂點i的出度。其入度為鄰接表中所有adjvex域值為i的邊節點數目。
例, 給定一個具有n個節點的無向圖的鄰接矩陣和鄰接表。
(1)設計一個將鄰接矩陣轉換為鄰接表的演算法;
(2)設計一個將鄰接表轉換為鄰接矩陣的演算法;
(3)分析上述兩個演算法的時間復雜度。
解:
(1)在鄰接矩陣上查找值不為0的元素,找到這樣的元素後創建一個表節點並在鄰接表對應的單鏈表中採用前插法插入該節點。
void MatToList(MGraph g,ALGraph *&G)
//將鄰接矩陣g轉換成鄰接表G
{ int i,j,n=g.n; ArcNode *p; //n為頂點數
G=(ALGraph *)malloc(sizeof(ALGraph));
for (i=0;i<n;i++) //給所有頭節點的指針域置初值
G->adjlist[i].firstarc=NULL;
for (i=0;i<n;i++) //檢查鄰接矩陣中每個元素
for (j=n-1;j>=0;j--)
if (g.edges[i][j]!=0)
{ p=(ArcNode *)malloc(sizeof(ArcNode));
//創建節點*p
p->adjvex=j;
p->nextarc=G->adjlist[i].firstarc;
//將*p鏈到鏈表頭
G->adjlist[i].firstarc=p;
}
G->n=n;G->e=g.e;
}
(2)在鄰接表上查找相鄰節點,找到後修改相應鄰接矩陣元素的值。
void ListToMat(ALGraph *G,MGraph &g)
{ int i,j,n=G->n;ArcNode *p;
for (i=0;i<n;i++)
{ p=G->adjlist[i].firstarc;
while (p!=NULL)
{ g.edges[i][p->adjvex]=1;
p=p->nextarc;
}
}
g.n=n;g.e=G->e;
}
(3)演算法1的時間復雜度均為O(n2)。演算法2的時間復雜度為O(n+e),其中e為圖的邊數。
⑨ 表示圖的兩種基本存儲結構是什麼
鄰接矩陣和鄰接表
⑩ 圖的兩種存儲結構是什麼
二樓說錯了,方向有誤。
這兩個分別叫剖面符號和斷面符號,他們剖段的方向都是縱向的,觀察的方向是指向數字的方向,從網頁上來看,就是L1是從左往右,而1┃則表示從右往左看。
這兩種符號的區別是斷面圖與剖面圖的區別在於:
斷面圖只畫形體被剖開後斷面的投影,而剖面圖要畫出形體被剖開後整個餘下部分的投影如圖。
1)剖面圖是形體剖切之後剩下部分的投影,是體的投影。斷面圖是形體剖切之後斷面的投影,是面的投影。 剖面圖中包含斷面圖。
2)剖面圖用剖切位置線、投射方向線和編號來表示。斷面圖則只畫剖切位置線與編號,用編號的注寫位置來代表投射方向。
3)剖面圖可用兩個或兩個以上的剖切平面進行剖切,斷面圖的剖切平面通常只能是單一的。