數據結構——考研筆記(三)線性表之單鏈表

文章目錄

      • 2.3 單鏈表
        • 2.3.1 知識總覽
        • 2.3.2 什么是單鏈表
        • 2.3.3 不帶頭結點的單鏈表
        • 2.3.4 帶頭結點的單鏈表
        • 2.3.5 不帶頭結點 VS 帶頭結點
        • 2.3.6 知識回顧與重要考點
        • 2.3.7 單鏈表的插入和刪除
          • 2.3.7.1 按位序插入(帶頭結點)
          • 2.3.7.2 按位序插入(不帶頭結點)
          • 2.3.7.3 指定結點的后插操作
          • 2.3.7.4 指定結點的前插操作
          • 2.3.7.5 按位序刪除(帶頭結點)
          • 2.3.7.6 知識回顧與重要考點
        • 2.3.8 單鏈表的查找
          • 2.3.8.1 按位查找
          • 2.3.8.2 按值查找
          • 2.3.8.3 知識回顧與重要考點
        • 2.3.9 單鏈表的建立
          • 2.3.9.1 尾插法
          • 2.3.9.2 頭插法


2.3 單鏈表

2.3.1 知識總覽

image-20240715163504480

2.3.2 什么是單鏈表

image-20240715163622432

  • 順序表

    • 優點:可隨機存取,存儲密度高
    • 缺點:要求大片連續空間,改變容量不方便
  • 單鏈表

    • 優點:不要求大片連續空間,改變容量方便
    • 缺點:不可隨機存取,要消耗一定空間存放指針
  • 用代碼實現單鏈表

image-20240715164545122

typedef struct LNode{			//定義單鏈表結點類型ElemType data;		//每個節點存放一個數據元素struct LNode* next;  //指針指向下一個節點
}LNode,*LinkList;
2.3.3 不帶頭結點的單鏈表
#include <stdlib.h>typedef struct LNode {	//定義單鏈表結點類型int data;			//每個節點存放一個數據元素struct LNode* next; //指針指向下一個節點
}LNode,*LinkList;//初始化一個空的單鏈表
bool InitList(LinkList& L) {L = NULL;	//空表,暫時還沒有任何結點return true;
}//判斷單鏈表是否為空
bool Empty(LinkList L) {if (L == NULL)return true;elsereturn false;
}void test() {LinkList L;	//聲明一個指向單鏈表的指針//初始化一個空表InitList(L);//……后續代碼……
}
2.3.4 帶頭結點的單鏈表

image-20240715171402035

#include <stdlib.h>typedef struct LNode {	//定義單鏈表結點類型int data;			//每個節點存放一個數據元素struct LNode* next; //指針指向下一個節點
}LNode, * LinkList;//初始化一個空的單鏈表
bool InitList(LinkList& L) {L = (LNode*)malloc(sizeof(LNode));	//分配一個頭節點if (L == NULL)			//內存不足,分配失敗return false;L->next = NULL;			//頭結點之后暫時還沒有節點return true;
}//判斷單鏈表是否為空
bool Empty(LinkList L) {if (L->next == NULL)return true;elsereturn false;
}void test() {LinkList L;	//聲明一個指向單鏈表的指針//初始化一個空表InitList(L);//……后續代碼……
}
2.3.5 不帶頭結點 VS 帶頭結點

image-20240715171704621

  • 不帶頭結點:寫代碼更麻煩對第一個數據結點和后續數據結點的處理需要用不同的代碼邏輯對空表和非空表的處理需要用到不同的代碼邏輯
  • 帶頭結點:寫代碼更方便。
2.3.6 知識回顧與重要考點

image-20240715171817961

2.3.7 單鏈表的插入和刪除

image-20240715172017835

2.3.7.1 按位序插入(帶頭結點)
  • ListInsert(&L,i,e):插入操作。在表L中的第i個位置上插入指定元素e。

image-20240715172337653

  • 代碼展示

image-20240715174709999

#include <stdlib.h>typedef struct LNode {	//定義單鏈表結點類型int data;			//每個節點存放一個數據元素struct LNode* next; //指針指向下一個節點
}LNode, * LinkList;//初始化一個空的單鏈表
bool InitList(LinkList& L) {L = (LNode*)malloc(sizeof(LNode));	//分配一個頭節點if (L == NULL)			//內存不足,分配失敗return false;L->next = NULL;			//頭結點之后暫時還沒有節點return true;
}//判斷單鏈表是否為空
bool Empty(LinkList L) {if (L == NULL)return true;elsereturn false;
}//在第i個位置插入元素e(帶頭結點)
bool ListInsert(LinkList& L, int i, int e) {if (i < 1)return false;LNode* p;	//指針p指向當前掃描到的結點int j = 0;	//當前p指向的是第幾個結點p = L;		//L指向頭結點,頭結點是第0個結點(不存數據)while (p != NULL && j < i - 1) {	//循環找到第i-1個結點p = p->next;j++;}if (p == NULL)	//i值不合法return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;	//將結點s連到p之后return true;	//插入成功
}void main() {LinkList L;	//聲明一個指向單鏈表的指針//初始化一個空表InitList(L);//……后續代碼……
}
2.3.7.2 按位序插入(不帶頭結點)

image-20240715175632081

  • 代碼展示
#include <stdlib.h>typedef struct LNode {	//定義單鏈表結點類型int data;			//每個節點存放一個數據元素struct LNode* next; //指針指向下一個節點
}LNode, * LinkList;//初始化一個空的單鏈表
bool InitList(LinkList& L) {L = (LNode*)malloc(sizeof(LNode));	//分配一個頭節點if (L == NULL)			//內存不足,分配失敗return false;L->next = NULL;			//頭結點之后暫時還沒有節點return true;
}//判斷單鏈表是否為空
bool Empty(LinkList L) {if (L == NULL)return true;elsereturn false;
}//在第i個位置插入元素e(帶頭結點)
bool ListInsert(LinkList& L, int i, int e) {if (i < 1)return false;if (i = 1) {	//插入第1個結點的操作與其它結點的操作不同LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;		//頭指針指向新節點return true;}LNode* p;	//指針p指向當前掃描到的結點int j = 1;	//當前p指向的是第幾個結點p = L;		//L指向頭結點,頭結點是第0個結點(不存數據)while (p != NULL && j < i - 1) {	//循環找到第i-1個結點p = p->next;j++;}if (p == NULL)	//i值不合法return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;	//將結點s連到p之后return true;	//插入成功
}void main() {LinkList L;	//聲明一個指向單鏈表的指針//初始化一個空表InitList(L);//……后續代碼……
}
2.3.7.3 指定結點的后插操作

image-20240715180832621

//后插操作:在p結點之后插入元素e
bool InsertNextNode(LNode* p, int e) {if (p == NULL)return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL)	//內存分配失敗return false;s->data = e;	//用結點s保存數據元素es->next = p->next;p->next = s;	//將結點s連到p之后return true;
}
2.3.7.4 指定結點的前插操作

image-20240715181828300

  • 代碼展示
//前插操作:在p結點之前插入元素e
bool InsertPriorNode(LNode* p, int e) {if (p == NULL)		//內存分配失敗return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;p->next = s;		//新結點s連到p之后s->data = p->data;	//將p中元素復制到s中p->data = e;		//p中元素覆蓋為ereturn true;
}
2.3.7.5 按位序刪除(帶頭結點)
  • ListDelete(&L,i,&e):刪除操作。刪除表L中第i個位置的元素,并用e返回刪除元素的值。

image-20240715183805791

  • 代碼展示
//刪除表中第i個元素
bool ListDelete(LinkList& L, int i, int& e) {if (i < 1)return false;LNode* p;		//指針p指向當前掃描到的結點int j = 0;		//當前p指向的是第幾個結點p = L;			//L指向頭結點,頭結點是第0個結點(不存數據)while (p != NULL && j < i - 1) {	//循環找到第i-1個結點p = p->next;j++;}if (p == NULL)	//i值不合法return false;if (p->next == NULL)	//第i-1個結點之后無其他結點return false;LNode* q = p->next;		//令q指向被刪除結點e = q->data;			//用e返回元素的值p->next = q->next;		//將*q結點從鏈中“斷開”free(q);				//釋放結點的存儲空間return true;			//刪除成功
}
2.3.7.6 知識回顧與重要考點

image-20240715190156270

2.3.8 單鏈表的查找

image-20240715190606364

  • GetElem(L,i):按位查找操作。獲取表L中第i個位置的元素的值。
  • LocalteElem(L,e):按值查找。在表L中查找具有給定關鍵字值的元素。
2.3.8.1 按位查找
  • 代碼展示
//按位查找,返回第i個元素(帶頭結點)
LNode* GetElem(LinkList L, int i) {if (i < 0)return false;LNode* p;		//指針p指向當前掃描到的結點int j = 0;		//當前p指向的是第幾個結點p = L;			//L指向頭節點,頭結點是第0個結點(不存數據)while (p != NULL && j < i) {	//循環找到第i個結點p = p->next;j++;}return p;
}
2.3.8.2 按值查找
  • 代碼展示
//按值查找,找到數據域==e的結點
LNode* LocateElem(LinkList L, int e) {LNode* p = L->next;//從第1個結點開始查找數據域為e的結點while (p != NULL && p->data != e)p = p->next;return p;	//找到后返回該結點指針,否則返回NULL
}
2.3.8.3 知識回顧與重要考點

image-20240715192241414

2.3.9 單鏈表的建立

image-20240715192343150

如果給你很多個數據元素(ElemType),要把它們存到一個單鏈表里邊,怎么辦呢?

step1:初始化一個單鏈表

step2:每次取一個數據元素,插入到表尾/表頭

2.3.9.1 尾插法
  • 代碼展示
//尾插法
LinkList List_TailInsert(LinkList& L) {	//正向建立單鏈表int x;								L = (LinkList)malloc(sizeof(LNode));//建立頭結點LNode* s, * r = L;					//r為表尾指針scanf("%d", &x);					//輸入結點的值while (x != 9999) {					//輸入9999表示結束s = (LNode*)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;							//r指向新的表尾結點scanf("%d", &x);}r->next = NULL;						//尾結點指針置空return L;
}
2.3.9.2 頭插法
  • 代碼展示
//頭插法
LinkList List_HeadInsert(LinkList& L) {LNode* s;int x;L = (LNode*)malloc(sizeof(LNode));	//建立頭結點L->next = NULL;						//初始化空鏈表scanf_s("%d", &x);					//輸入結點的值while (x != 9999) {					//輸入9999表示結束s = (LNode*)malloc(sizeof(LNode));//創建新結點s->data = x;s->next = L->next;L->next = s;					//將新結點插入表中,L為頭指針scanf_s("%d", &x);}return L;
}

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

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

相關文章

spring事務 @Transactional

文章目錄 1. 簡介1.1 什么是事務1.2 什么是Spring事務管理1.3 Transactional注解的作用 2. Transactional注解的使用2.1 如何在Spring中使用Transactional2.2 Transactional的屬性配置 3. Transactional的工作原理3.1 Spring如何管理事務3.2 Transactional的底層實現 4. Transa…

數學建模·灰色關聯度

灰色關聯分析 基本原理 灰色關聯分析可以確定一個系統中哪些因素是主要因素&#xff0c;哪些是次要因素&#xff1b; 灰色關聯分析也可以用于綜合評價&#xff0c;但是由于數據預處理的方式不同&#xff0c;導致結果 有較大出入 &#xff0c;故一般不采用 具體步驟 數據預處理…

wps批量刪除空白單元格

目錄 原始數據1.按ctrlg鍵2.選擇“空值”&#xff0c;點擊“定位”3. 右擊&#xff0c;刪除單元格修改后的數據 原始數據 1.按ctrlg鍵 2.選擇“空值”&#xff0c;點擊“定位” 如圖所示&#xff0c;空值已被選中 3. 右擊&#xff0c;刪除單元格 修改后的數據

微軟Office PLUS辦公插件下載安裝指南

微軟OfficePLUS插件下載安裝指南 簡介&#xff1a; OfficePLUS微軟官方出品的Office插件 &#xff0c;OfficePLUS擁有30萬高質量模板素材&#xff0c;能幫助Word、Excel、Powerpoint、PDF等多種辦公軟件提升效率&#xff0c;具有智能化、模板質量高、運行快、穩定性強等優點。…

抽象工廠模式與工廠方法(簡單工廠)的區別

在軟件開發中&#xff0c;簡單工廠模式和工廠方法模式是兩種常用的創建型設計模式。盡管它們都用于創建對象&#xff0c;但它們的實現方式和應用場景有所不同。本文將詳細探討這兩種模式的區別&#xff0c;幫助你更好地理解和應用它們。 簡單工廠模式 簡單工廠模式&#xff0…

昇思25天學習打卡營第11天|RNN實現情感分類

概述 情感分類是自然語言處理中的經典任務&#xff0c;是典型的分類問題。本節使用MindSpore實現一個基于RNN網絡的情感分類模型&#xff0c;實現如下的效果&#xff1a; 輸入: This film is terrible 正確標簽: Negative 預測標簽: Negative輸入: This film is great 正確標…

Mongodb復合索引

學習mongodb&#xff0c;體會mongodb的每一個使用細節&#xff0c;歡迎閱讀威贊的文章。這是威贊發布的第90篇mongodb技術文章&#xff0c;歡迎瀏覽本專欄威贊發布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題&#xff0c;歡迎在文章下面點個贊&#xff0c;或者關…

【計算機畢業設計】002基于weixin小程序家庭記賬本

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

【實戰:python-Django發送郵件-短信-釘釘通知】

一 Python發送郵件 1.1 使用SMTP模塊發送郵件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from 306334678qq.com # 發送方郵箱 passwd luzdikipwhjjbibf # 填入發送方郵箱的授權碼(填入自己的授權碼&#xff0c;相當于郵箱…

鴻蒙語言基礎類庫:【@ohos.uitest (UiTest)】 測試

UiTest UiTest提供模擬UI操作的能力&#xff0c;供開發者在測試場景使用&#xff0c;主要支持如點擊、雙擊、長按、滑動等UI操作能力。 該模塊提供以下功能&#xff1a; [By]&#xff1a;提供控件特征描述能力&#xff0c;用于控件篩選匹配查找。[UiComponent]&#xff1a;代…

實驗四:圖像的銳化處理

目錄 一、實驗目的 二、實驗原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小對濾波的影響 三、實驗內容 四、源程序和結果 (1) 主程序(matlab) (2) 函數GrayscaleFilter (3) 函數MatrixAbs 五、結果分析 1. 拉普拉斯濾波 2. Sobel濾波 3. 不同大小模板的濾波…

單點登陸思路及流程

單點登錄&#xff08;Single Sign-On&#xff0c;簡稱SSO&#xff09;是一種流行的身份驗證和授權機制&#xff0c;允許用戶通過一次登錄獲得對多個應用程序或系統的訪問權限。實現單點登錄可以提高用戶體驗、簡化用戶管理和減少密碼重復輸入等問題。下面是一種常見的單點登錄實…

昇思25天學習打卡營第7天 | 基于MindSpore的GPT2文本摘要

本次打卡基于gpt2的文本摘要 數據加載及預處理 from mindnlp.utils import http_get# download dataset url https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt path http_get(url, ./)from mindspore.dataset impor…

以太坊(以太坊solidity合約)

以太坊&#xff08;以太坊solidity合約&#xff09; 1&#xff0c;以太坊2&#xff0c;開發名詞解釋&#xff08;1&#xff09;錢包&#xff08;2&#xff09;Solidity&#xff08;3&#xff09;Ether&#xff08;以太幣&#xff09;&#xff08;4&#xff09;Truffle&#xff…

Redis 7.x 系列【23】哨兵模式

有道無術&#xff0c;術尚可求&#xff0c;有術無道&#xff0c;止于術。 本系列Redis 版本 7.2.5 源碼地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目錄 1. 概述2. 工作原理2.1 監控2.2 標記下線2.3 哨兵領袖2.4 新的主節點2.5 通知更新 3. …

請求響應(后端必備)

一、請求 1.簡單參數 原始方式&#xff1a; 在原始的web程序中&#xff0c;獲取請求參數&#xff0c;需要通過HttpServletRequest對象手動獲取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫價內期權?直接帶你了解期權價內期權怎么使用?!

今天帶你了解什么叫價內期權&#xff1f;直接帶你了解期權價內期權怎么使用&#xff1f;&#xff01;價內期權是具有內在價值的期權。期權持有人行權時&#xff0c;對看漲期權而言&#xff0c;行權價格低于標的證券結算價格&#xff1b;對看跌期權而言&#xff0c;標的證券結算…

js 請求blob:https:// 圖片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue組件化實踐:自定義加載組件的探索與應用

在前端開發領域&#xff0c;隨著業務邏輯復雜度的提升和系統規模的不斷擴大&#xff0c;傳統的開發方式逐漸暴露出效率低下、維護困難等問題。為了解決這些挑戰&#xff0c;組件化開發作為一種高效、靈活的開發模式&#xff0c;受到了越來越多開發者的青睞。本文將結合實踐&…

Java基礎及進階

JAVA特性 基礎語法 一、Java程序的命令行工具 二、final、finally、finalize 三、繼承 class 父類 { //代碼 }class 子類 extends 父類 { //代碼 }四、Vector、ArrayList、LinkedList 五、原始數據類型和包裝類 六、接口和抽象類 JAVA進階 Java引用隊列 Object counter ne…