考研數據結構Part1——單鏈表知識點總結

?一、前言

? ? ? ? 單鏈表是線性表的鏈式存儲結構,作為數據結構中最基礎也是最重要的線性結構之一,在考研數據結構科目中占有重要地位。本文將總結帶頭結點單鏈表的各項基本操作,包括初始化、插入、刪除、查找等,并附上完整C語言實現代碼,幫助大家系統掌握這一重要知識點。本文基于王道考研做的知識點總結和代碼復現。

二、基本操作

1. 初始化單鏈表(帶頭結點)

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;
//初始化,帶頭結點
bool InitLinkList(LinkList &L){L=(LNode*)malloc(sizeof(LNode));L->next=NULL;return true;
}

2. 創建單鏈表

//頭插法
LinkList List_HeadInsert(LinkList &L){LNode *s;ElemType x;scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);	}return L;
}//尾插法
LinkList List_TailInsert(LinkList &L){LNode *r=L,*s;ElemType x;scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;//r指向新的尾節點scanf("%d",&x);}r->next=NULL;return r;
}

3.??查找、插入與刪除操作

//求長度--O(n)
int Length(LinkList L){int len=0;LNode *p=L->next;while(p!=NULL){len++;p=p->next;}return len;
}
//按位查找--O(n)
LNode *GetElem(LinkList L,int i){LNode *p=L;int j=0;while(p!=NULL&&j<i){p=p->next;j++;}return p;		
}
//按值查找--O(n)
LNode *LocateElem(LinkList L,ElemType e){LNode *p=L->next;while(p!=NULL&&p->data!=e)p=p->next;return p;
}
//插入某元素到鏈表的指定位置--O(n)
bool ListInsert(LinkList &L,int i,ElemType &e){LNode *p=L;int j=0;while(p->next!=NULL && j<i-1){p=p->next;j++;}if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;
}//刪除某元素到鏈表的指定位置--O(n)
bool ListDelete(LinkList &L,int i,ElemType &e){LNode *p=L;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;}if(p==NULL||p->next==NULL){return false;}LNode *q=p->next;e=q->data;p->next=q->next;free(q);return true;	
}

4.?判斷兩鏈表是否有相同節點

//判斷兩個鏈表是否有相同節點
LNode *getSimilar(LNode *A,LNode *B){LNode *a=A->next,*b=B->next;int ab=Length(A)-Length(B);if(ab>0){while(ab){a=a->next;ab--;}}else if(ab<0){while(ab){b=b->next;ab++;}}while(a&&b){if(a->data==b->data) return a;a=a->next;b=b->next;}return NULL;
}

三、主函數測試代碼

int main()
{//創建鏈表A,BLinkList A,B;InitLinkList(A); InitLinkList(B);printf("創建鏈表A(按9999退出):");List_TailInsert(A);printf("創建鏈表B(按9999退出):");List_TailInsert(B);//統計表長,查詢指定的值int len_A,len_B;len_A=Length(A);len_B=Length(B);printf("A,B的長度分別是%d和%d\n",len_A,len_B);printf("按位查詢A的第2個節點是,%d\n",GetElem(A,2)->data);if(LocateElem(B,2)->data != NULL)printf("按值查詢B中是否有節點值為2,有\n");elseprintf("按值查詢B中是否有節點值為2,沒有\n");//打印鏈表A,Bprintf("打印鏈表A:");LNode *p=A->next,*q=B->next;while(p!=NULL){printf("%d\t ",p->data);p=p->next;}	printf("\n打印鏈表B:");while(q!=NULL){printf("%d\t ",q->data);q=q->next;}//查找A,B是否有相同的節點if(getSimilar(A,B)!=NULL) printf("\nA,B中有相同值的節點,%d\n",getSimilar(A,B)->data);else printf("\nA,B中沒有相同值的節點\n");//刪除鏈表A,Bint x,y;for(int i=0;i<=len_A;i++)ListDelete(A,i,x);for(int j=0;j<=len_B;j++)ListDelete(B,j,y);printf("刪除A,B的最后兩個元素是%d,%d",x,y);return 0;
}

基于上述的代碼進行測試,結果如下圖所示:

四、練習模板

萬丈高樓的搭建,也離不開簡單的一磚一瓦,堅實的基礎才是拿下大題的關鍵。

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;
//初始化,帶頭結點
bool InitLinkList(LinkList &L){}
//頭插法
LinkList List_HeadInsert(LinkList &L){}
//尾插法
LinkList List_TailInsert(LinkList &L){}
//求長度--O(n)
int Length(LinkList L){}
//按位查找--O(n)
LNode *GetElem(LinkList L,int i){}
//按值查找--O(n)
LNode *LocateElem(LinkList L,ElemType e){}
//插入某元素到鏈表的指定位置--O(n)
bool ListInsert(LinkList &L,int i,ElemType &e){}
//刪除某元素到鏈表的指定位置--O(n)
bool ListDelete(LinkList &L,int i,ElemType &e){}
//判斷兩個鏈表是否有相同節點
LNode *getSimilar(LNode *A,LNode *B){}
int main(){
//可用上面的main函數替換該部分的內容
}

五、總結

????????掌握帶頭結點單鏈表的各項操作是數據結構學習的基礎,也是考研的重點內容。帶頭結點的鏈表相比普通鏈表有以下優勢:

  • 統一操作:無論鏈表是否為空,操作方式一致
  • 簡化代碼:不需要特殊處理第一個結點的情況
  • 提高效率:某些操作如頭插法更加高效

六、附錄

鏈表操作-易錯點總結
操作代碼模板注意事項
頭插法s->next=L->next; L->next=s兩句順序不能反
尾插法r->next=s; r=s;最后指針要置NULL
結點刪除p->next = q->next; free(q);需要臨時保存q的data
鏈表遍歷while(p!=NULL){...p=p->next;}結束條件勿用p->next!=NULL

????????💡 應試技巧
1. 畫圖!用不同顏色標注指針變化
2. 先寫邊界條件(空表、單結點表)
3. 檢查循環結束后尾結點是否為NULL

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

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

相關文章

筆試——Day15

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 平方數 思路 判斷?個數開根號之后左右兩個數的平?&#xff0c;哪個最近即可 代碼 第二題 題目&#xff1a; 分組 思路 枚舉所有的結果&#xff0c;找到第一個復合要…

物聯網全流程開發記錄

問題 有數據采集設備&#xff0c;服務器&#xff0c;上位機用戶顯示三部分&#xff0c;采集設備將采集的數據發送至服務器。服務器將數據保存&#xff0c;上位機讀取服務器保存的數據庫顯示。當出現多設備&#xff0c;多用戶時&#xff0c;如何通過多設備對應多用戶&#xff0c…

【LeetCode 熱題 100】46. 全排列——回溯

Problem: 46. 全排列 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(N * N!)空間復雜度&#xff1a;O(N)整體思路 這段代碼旨在解決一個經典的組合數學問題&#xff1a;全排列 (Permutations)。給定一個不含重復數字的數組 nums&#xff0c;它需要找出其所有可能…

AXI接口學習

amba總線的發展axi協議是兩個接口之間的點對點的協議&#xff0c;主要是有5個通道。主機在寫地址&#xff08;AW&#xff09;通道上發送地址&#xff0c;并在寫數據&#xff08;W&#xff09;通道上將數據傳輸到從機。從機將接收到的數據寫入指定地址空間。從機完成寫操作&…

Validation - Spring Boot項目中參數檢驗的利器

Validation - Spring Boot項目中參數檢驗的利器 什么是Validation Sping Boot官方原文&#xff1a;When it comes to validating user input, Spring Boot provides strong support for this common, yet critical, task straight out of the box.Although Spring Boot support…

云服務器VS虛擬主機:如何抉擇?

開篇引入在當今數字化浪潮中&#xff0c;無論是個人站長想要搭建獨具風格的博客&#xff0c;展示自己的生活感悟與專業見解&#xff1b;還是中小企業期望構建官方網站&#xff0c;拓展線上業務版圖&#xff0c;提升品牌知名度&#xff1b;亦或是大型互聯網企業籌備高并發的電商…

不同相機CMOS噪點對熒光計算的影響

摘要&#xff1a;熒光成像是生物醫學、材料科學等領域的重要研究手段&#xff0c;其成像質量高度依賴傳感器噪聲特性。本文系統分析CMOS傳感器噪聲類型及其對熒光信號計算的影響機制&#xff0c;結合實驗數據探討不同CMOS架構的噪聲表現差異&#xff0c;提出針對性優化策略。研…

docker 常見命令使用記錄

1. swarm 集群 1. 集群創建 # 創建集群管理節點&#xff0c; --advertise-addr 指定節點管理通信地址&#xff0c;--data-path-addr 指定容器通信地址 docker swarm init --advertise-addr 1.14.138.35 --data-path-addr 1.14.138.35# --advertise-addr 指明當前work節點的…

KRaft 角色狀態設計模式:從狀態理解 Raft

這些狀態類是 Raft 協議行為的核心載體。它們包含轉移邏輯 和 節點在特定狀態下的所有行為和數據。QuorumState它是 KRaft 客戶端實現中狀態管理的核心&#xff0c;扮演著“狀態機上下文&#xff08;Context&#xff09;”和“狀態轉換協調者”的關鍵角色。QuorumState 是整個 …

Linux的磁盤存儲管理實操——(上)

一、Linux的設備文件分類 Linux的設備文件分類1、在Linux系統中設備文件是用來與外接交互的接口&#xff0c;它將內核中的硬件設備與文件系統關聯起來&#xff0c;讓用戶可以像操作普通文件一樣來操作硬件設備&#xff0c;同時也為開發者提供了方便而強大的應用程序接口。 2、L…

內核bpf的實現原理

bpftrace能幫我們干什么&#xff1f;1、統計 tcp連接的生命時長、2、統計mysql執行一條sql語句的時間3、統計redis執行命令的時間、 4、對文件進行一次讀或者寫的時間。 常用命令&#xff1a; bpftrace -e Begin { printf("hello\n"); } bpftrace -l *enter_accep…

前端npm配置Nexus為基礎倉庫

步驟&#xff1a; 一、Nexus倉庫配置 新增npm倉庫,具體詳解見 Nexus私有倉庫配置&#xff0c;解釋 注&#xff1a;Nexus的版本需要至少3.38以上&#xff0c;不然會出現npm install 時npm的審計功能報錯&#xff0c;導致install失敗。雖然在3.38以后不會報400錯誤&#xff0c…

數據結構 之 【排序】(直接插入排序、希爾排序)

目錄 1.直接插入排序 1.1直接插入排序的思想 1.2直接插入排序的代碼邏輯&#xff1a; 1.3 直接插入排序圖解 1.4單趟排序代碼(單個元素的排序邏輯) 1.5完整排序代碼 1.6直接插入排序的時間復雜度與空間復雜度 1.7直接插入排序的優勢 2.希爾排序(縮小增量排序) 2.1…

Laravel 后臺登錄 403 Forbidden 錯誤深度解決方案-優雅草卓伊凡|泡泡龍

Laravel 后臺登錄 403 Forbidden 錯誤深度解決方案-優雅草卓伊凡|泡泡龍一頓操作猛如虎&#xff0c;一看結果250&#xff0c;必須記錄&#xff0c;必須記錄&#xff0c;&#xff01;今天弄了很久關于我們2023年的產品系統蜻蜓T會議系統專業版&#xff0c;然后終于搞好了密碼也重…

Newline全場景方案閃耀2025中國智慧生活大會

7月15日 — 16日&#xff0c;由中國電子視像行業協會等權威機構指導的2025 CIC中國智慧生活大會在京召開。Newline作為視像協會PID分會副會長單位攜全場景智慧辦公解決方案亮相&#xff0c;首席營銷官李宇鵬受邀出席領袖圓桌環節&#xff0c;與騰訊云、京東方、創維、TCL、小猿…

Edge瀏覽器地址欄默認搜索引擎設置指南

前言 Microsoft Edge 瀏覽器允許用戶自定義地址欄默認搜索引擎&#xff0c;只是設置入口隱藏比較深&#xff0c;以版本 137.0.3296.83 (正式版本) (64 位)為例詳細記錄設置地址欄默認搜索引擎步驟&#xff1a; Edge 設置默認搜索引擎步驟 通過設置界面修改 打開Edge設置&#x…

Python eval函數詳解 - 用法、風險與安全替代方案

Python eval函數詳解 - 用法、風險與安全替代方案在Python中&#xff0c;eval() 是一個內置函數&#xff0c;用于解析并執行傳入的字符串形式的表達式。它能夠將字符串動態地轉換為有效的Python代碼并運行。雖然 eval() 功能強大&#xff0c;但其使用也伴隨著潛在的安全風險。本…

Webpack5 新特性與詳細配置指南

一、Webpack5 新特性 內置 Asset Modules&#xff08;資源模塊&#xff09; 替代 file-loader、url-loader、raw-loader 等&#xff0c;統一資源處理方式。四種類型&#xff1a;asset/resource&#xff1a;導出文件 URL&#xff08;等同 file-loader&#xff09;。asset/inli…

籠子在尋找一只鳥:解讀生活的隱形陷阱

想象一個閃閃發光的籠子&#xff0c;敞開著門&#xff0c;在世界中游蕩&#xff0c;尋找一只鳥兒。這畫面是不是有點奇怪&#xff1f;這是卡夫卡的格言“一個籠子在尋找一只鳥”帶給我們的奇思妙想。通常&#xff0c;鳥兒自由翱翔&#xff0c;籠子靜靜等待&#xff0c;但卡夫卡…

低空經濟展 | 約克科技攜小型化測試設備亮相2025深圳eVTOL展

全球低空經濟與eVTOL產業盛會——2025深圳eVTOL展&#xff0c;將于2025年9月23日至25日在深圳坪山燕子湖國際會展中心盛大啟幕&#xff01; 本屆展會以“低空經濟eVTOL航空應急救援商載大型無人運輸機”為核心&#xff0c;預計匯聚200位發言嘉賓、500家頂尖展商及15,000位專業觀…