#數據結構----2.1線性表

在數據結構的學習中,線性表是最基礎、最核心的結構之一 —— 它是后續棧、隊列、鏈表等復雜結構的 “基石”。今天從 “是什么”(定義)到 “怎么用”(基本操作),徹底搞懂線性表的核心邏輯。

image-20250904160511892

一、先明確:數據結構的三要素

在聊線性表之前,必須先記住數據結構的核心三要素,這是理解所有結構的前提:

邏輯結構:數據元素之間的 “關系”(比如線性表的 “前后順序”);

數據的運算:對數據元素能做的操作(比如增、刪、改、查);

存儲結構(物理結構):數據在內存中的 “存放方式”(比如數組、鏈表)。

關鍵提醒:存儲結構不同,運算的實現方式也不同(比如數組實現和鏈表實現的 “插入” 操作,底層邏輯完全不一樣),但今天我們先聚焦 “邏輯結構” 和 “運算”。

二、線性表的定義:到底什么是線性表?

線性表是具有相同數據類型的 n(n≥0)個數據元素的有限序列,用 L 命名時可表示為:

( L = (a_1, a_2, …, a_i, a_{i+1}, …, a_n) )

我們拆解這個定義里的關鍵信息,再結合例子理解會更透徹:

1. 定義的 3 個核心特性

  • 同類型:所有元素的數據類型必須一致(比如全是整數、全是學生信息);

  • 有限性:元素個數 n 是有限的(不存在無限個元素的線性表);

  • 有序性:元素之間有明確的 “前后順序”(a? 在 a? 前面,a? 在 a? 前面,不能亂序)。

2. 幾個必須分清的術語

術語含義
表長線性表中元素的個數 n(n=0 時為空表)
表頭元素第一個元素 a?
表尾元素最后一個元素 a?
直接前驅除 a? 外,每個元素 a? 前面的那個元素(即 a???)
直接后繼除 a? 外,每個元素 a? 后面的那個元素(即 a???)
位序元素在表中的 “位置編號”(從 1 開始!和數組下標從 0 開始形成區別)

image-20250904161656732

3. 舉個例子:哪些是線性表?

  • 例 1:所有整數按遞增順序排列(1,2,3,4,…100)—— 同類型(整數)、有限(100 個)、有序(遞增),是線性表;

  • 例 2:學生信息表(如下表)—— 同類型(學生信息)、有限(10 條記錄)、有序(按學號排序),是線性表;

學號姓名專業
1120112100張三挖掘機
1120112101李四挖掘機
1120112102王玉玉數據挖掘
  • 例 3:學習計劃列表(學習《C 語言》→ 學習《數據結構》→ 學習《架構師》)—— 同類型(學習任務)、有限、有序,也是線性表。

三、線性表的基本操作:從 “創” 到 “銷” 全流程

為什么要定義基本操作?核心原因有兩個:

  1. 團隊協作:封裝好的操作能讓其他人直接用,不用重復理解底層邏輯;

  2. 減少錯誤:常用操作寫成函數,避免重復編碼導致的 bug。

線性表的操作可以按 “生命周期” 和 “功能” 分為 4 類,我們逐個拆解(重點關注 “是否需要傳引用 &”):

1. 創銷類:線性表的 “出生” 與 “消亡”

這兩類操作是線性表的基礎 —— 從 “無” 到 “有”,再從 “有” 到 “無”。

  • InitList (&L):初始化表

功能:構造一個空的線性表 L,并為其分配內存空間。

為什么傳 &L?因為要修改 L 本身(給它分配內存、設置表長為 0),需要把修改結果 “帶回來”。

  • DestroyList (&L):銷毀表

功能:銷毀線性表 L,并釋放它占用的內存空間(避免內存泄漏)。

為什么傳 &L?因為要釋放 L 指向的內存,修改 L 的狀態(比如讓 L 指向 NULL),需要帶回報錯結果。

2. 增刪類:改變線性表的 “長度”

這兩類操作會修改線性表的元素個數,是高頻操作。

  • ListInsert (&L, i, e):插入元素

功能:在表 L 的第 i 個位置,插入新元素 e(插入后表長 +1)。

傳參說明:&L(要修改表的結構)、i(插入位置,需滿足 1≤i≤表長 + 1)、e(要插入的元素)。

  • ListDelete (&L, i, &e):刪除元素

功能:刪除表 L 第 i 個位置的元素,并用 e 保存被刪除元素的值(刪除后表長 -1)。

為什么 &e?因為要把 “被刪除的元素值” 帶回來(比如用戶需要知道刪了什么)。

3. 改查類:定位元素(“改” 的前提是 “查”)

“查” 是 “改” 的基礎 —— 要修改元素,必須先找到它的位置或值。

  • GetElem (L, i):按位查找

功能:獲取表 L 第 i 個位置的元素值(i 需滿足 1≤i≤表長)。

為什么不傳 &L?因為只是 “讀取” 元素,沒有修改表的結構或內容,不需要帶回結果。

  • LocateElem (L, e):按值查找

功能:在表 L 中查找 “值等于 e” 的元素,返回它的位序(若找不到返回 0 或 NULL)。

同理,僅讀取,不傳 &L。

4. 其他常用操作:輔助功能

這些操作是對線性表的 “補充查詢”,高頻且實用:

  • Length (L):求表長:返回表 L 中元素的個數 n;

  • PrintList (L):輸出表:按前后順序打印所有元素(比如打印學生信息表);

  • Empty (L):判空:若表 L 為空(n=0)返回 true,否則返回 false。

關鍵考點:什么時候傳引用 “&”?

當對參數的修改結果需要 “帶回來” 時,必須傳引用(或指針)

比如:

  • 不傳 & 的情況:調用 test(x) 后,x 的值在主函數中不變(修改只在 test 內部生效);

    #include<stdio.h>
    void test(int x){x=1024;printf("test函數內部 x=%d\n",x);
    }
    int main(){int x=1;printf("調用test前 x=%d\n",x);test(x);printf("調用test后x=%d\n",x);
    }
    

    image-20250904162212940

    image-20250904162318877

  • 傳 & 的情況:調用 test(&x) 后,x 的值在主函數中會被修改(修改結果帶回來了)。

    #include<stdio.h>
    void test(int & x){x=1024;printf("test函數內部 x=%d\n",x);
    }
    int main(){int x=1;printf("調用test前 x=%d\n",x);test(x);printf("調用test后x=%d\n",x);
    }
    

    image-20250904163012076

    image-20250904163027336

對應到線性表操作:

需要傳 &L 的操作:InitList、DestroyList、ListInsert、ListDelete(都修改了 L 的結構或內容);

不需要傳 &L 的操作:GetElem、LocateElem、Length、PrintList、Empty(僅讀取,不修改)。

四、總結:線性表的核心要點

邏輯結構核心:同類型、有限、有序,每個元素(除首尾)有唯一前驅和后繼;

操作記憶思路:按 “創銷→增刪→改查” 的生命周期記憶,輔助 “判空、表長、打印”;

傳參關鍵:修改需 “帶回結果” 則傳 &,僅讀取則不傳;

注意細節:位序從 1 開始(和數組下標區分),函數命名要可讀(比如 InitList 比 fun1 更易理解)。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95752.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2508C++,skia動畫

gif動畫原理 先了解一下gif動畫的原理: gif動畫由一系列靜態圖像(或叫幀)組成.這些圖像按特定的順序排列,每一幀都代表動畫中的一個瞬間,幀圖像是支持透明的. 每兩幀之間有指定的時間間隔(一般小于60毫秒),gif播放器每渲染一幀靜態圖像后,即等待此時間間隔,依此邏輯不斷循環渲染…

AI + 機器人:當大語言模型賦予機械 “思考能力”,未來工廠將迎來怎樣變革?

一、引言1.1 未來工廠變革背景與趨勢在科技飛速發展的當下&#xff0c;全球制造業正站在變革的十字路口。隨著消費者需求日益多樣化、市場競爭愈發激烈&#xff0c;傳統工廠模式的弊端逐漸顯現。生產效率低下、難以適應個性化定制需求、設備維護成本高昂且缺乏前瞻性等問題&…

pinia狀態管理的作用和意義

1. 什么是狀態管理 狀態管理就是統一管理應用中的數據&#xff0c;讓數據在多個組件之間共享和同步。 // 沒有狀態管理 - 數據分散在各個組件中 // 組件A const user ref({ name: 張三, age: 25 })// 組件B const user ref({ name: 張三, age: 25 }) // 重復定義// 組件C c…

十四、STM32-----低功耗

一、電源框圖VDDA 供電區域&#xff0c;主要是 ADC 電源以及參考電壓&#xff0c;STM32 的 ADC 模塊配備獨立的供電方 式&#xff0c;使用了 VDDA 引腳作為輸入&#xff0c;使用 VSSA 引腳作為獨立地連接&#xff0c;VREF 引腳為提供給 ADC 的 參考電壓。電壓調節器是 STM32 的…

一篇文章帶你徹底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 內存管理的執行引擎&#xff0c;負責自動回收無用的對象內存。其設計核心是 權衡&#xff1a;主要是吞吐量和停頓時間之間的權衡。沒有“最好”的收集器&#xff0c;只有“最適合”特定場景的收集器。一、核心基礎&#xff1a;分代收集模型主流 HotSpot JVM 采…

服務器排故隨筆:服務器無法ssh遠程登錄

文章目錄服務器排故隨筆&#xff1a;服務器無法遠程登錄問題現象解決過程第一步&#xff1a;確認故障描述是否準確第二步&#xff1a;確認網絡是否有問題第三步&#xff1a;確認ssh服務是否有問題第四步&#xff1a;確認防火墻是否放行sshd服務第五步&#xff1a;試試萬能的“重…

Deeplizard深度學習課程(六)—— 結合Tensorboard進行結果分析

前言 Tensorboard最初是tensorflow的可視化工具&#xff0c;被用于機器學習實驗的可視化&#xff0c;后來也適配了pytorch。Tensorboard是一個前端web界面&#xff0c;&#xff0c;能夠從文件里面讀取數據并展示它&#xff08;比如損失、準確率、網絡圖&#xff09;。具體使用可…

C語言————實戰項目“掃雷游戲”(完整代碼)

無論是找工作面試&#xff0c;還是課設大作業、考研&#xff0c;都離不開實戰項目的積累&#xff0c;如果你能把一個項目搞明白&#xff0c;并且給別人熟練的講出來&#xff0c;即使你沒有過項目經歷&#xff0c;也可以說是非常加分的&#xff0c;下面來沉浸式體驗一下這款掃雷…

數據結構之加餐篇 -順序表和鏈表加餐

目錄一、鏈表分割二、隨機鏈表的復制總結一、鏈表分割 鏈表分割 題目描述的意思就如下圖&#xff1a; 也就是把1&#xff0c;2挪到前面&#xff0c;6&#xff0c;3&#xff0c;5挪到后面&#xff0c;前者的相對順序不發生改變 這里要想往后挪就要先遍歷&#xff0c;遍歷到6…

JSP與Servlet整合數據庫開發:構建Java Web應用的全棧指南

JSP與Servlet整合數據庫開發&#xff1a;構建Java Web應用的全棧指南 概述 在Java Web開發領域&#xff0c;JSP&#xff08;JavaServer Pages&#xff09;與Servlet是構建動態Web應用的核心技術組合。Servlet作為Java EE的基礎組件&#xff0c;負責處理客戶端請求、執行業務邏…

設計五種算法精確的身份證號匹配

問題定義與數據準備 我們有兩個Excel文件&#xff1a; small.xlsx: 包含約5,000條記錄。large.xlsx: 包含約140,000條記錄。 目標&#xff1a;快速、高效地從large.xlsx中找出所有其“身份證號”字段存在于small.xlsx“身份證號”字段中的記錄&#xff0c;并將這些匹配的記錄保…

Spring 框架(IoC、AOP、Spring Boot) 的必會知識點匯總

目錄&#xff1a;&#x1f9e0; 一、Spring 框架概述1. Spring 的核心功能2. Spring 模塊化結構&#x1f9e9; 二、IoC&#xff08;控制反轉&#xff09;核心知識點1. IoC 的核心思想2. Bean 的定義與管理3. IoC 容器的核心接口4. Spring Bean 的創建方式&#x1f9f1; 三、AOP…

簡單工廠模式(Simple Factory Pattern)?? 詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a; Meteors.的博客 &#x1f49e;當前專欄&#xff1a; 設計模式 ?特色專欄&#xff1a; 知識分享 &…

新電腦硬盤如何分區?3個必知技巧避免“空間浪費癥”!

剛到手的新電腦&#xff0c;硬盤就像一間空蕩蕩的大倉庫&#xff0c;文件扔進去沒多久就亂成一鍋粥&#xff1f;別急&#xff0c;本文會告訴你新電腦硬盤如何分區&#xff0c;這些方法不僅可以幫你給硬盤分區&#xff0c;還可以調整/合并分區大小等。所以&#xff0c;本文的分區…

【微知】git submodule的一些用法總結(不斷更新)

文章目錄綜述要點細節如何新增一個submodule&#xff1f;如何手動.gitmodules修改首次增加一個submodule&#xff1f;git submodule init&#xff0c;init子命令依據.gitmodules.gitmodules如何命令修改某個成員以及同步&#xff1f;如果submodule需要修改分支怎么辦&#xff1…

【Spring Cloud微服務】9.一站式掌握 Seata:架構設計與 AT、TCC、Saga、XA 模式選型指南

文章目錄一、Seata 框架概述二、核心功能特性三、整體架構與三大角色1. Transaction Coordinator (TC) - 事務協調器&#xff08;Seata Server&#xff09;2. Transaction Manager (TM) - 事務管理器&#xff08;集成在客戶端&#xff09;3. Resource Manager (RM) - 資源管理器…

AI賦能!Playwright帶飛UI自動化腳本維護

80%的自動化腳本因一次改版報廢&#xff1f; 開發隨意改動ID導致腳本集體崩潰&#xff1f;背景UI自動化在敏捷開發席卷行業的今天&#xff0c;UI自動化測試深陷一個尷尬困局&#xff1a;需求迭代速度&#xff08;平均2周1次&#xff09;&#xff1e; 腳本維護速度&#xff08;平…

Redis、Zookeeper 與關系型數據庫分布式鎖方案對比及性能優化實戰指南

Redis、Zookeeper 與關系型數據庫分布式鎖方案對比及性能優化實戰指南 1. 問題背景介紹 在分布式系統中&#xff0c;多節點并發訪問共享資源時&#xff0c;如果不加鎖或加鎖不當&#xff0c;會導致數據不一致、超賣超買、競態條件等問題。常見的分布式鎖方案包括基于Redis、Zoo…

網絡安全A模塊專項練習任務十一解析

任務十一&#xff1a;IP安全協議配置任務環境說明&#xff1a; (Windows 2008)系統&#xff1a;用戶名Administrator&#xff0c;密碼Pssw0rd1.指定觸發SYN洪水攻擊保護所必須超過的TCP連接請求數閾值為5&#xff1b;使用組合鍵winR&#xff0c;輸入regedit打開注冊表編輯器&am…

金蝶中間件適配HGDB

文章目錄環境文檔用途詳細信息環境 系統平臺&#xff1a;Microsoft Windows (64-bit) 10 版本&#xff1a;5.6.5 文檔用途 本文章主要介紹金蝶中間件簡單適配HGDB。 詳細信息 一、金蝶中間件Apusic安裝與配置 1.Apusic安裝與配置 Windows和Linux下安裝部署過程相同。 &…