數據結構基礎篇(4)

十六.循環鏈表

  • 概念
    • 循環鏈表是一種頭尾相接的鏈表(最后一個結點的指針域指向頭結點,整個鏈表形成一個環)
  • 優點
    • 從表任一結點出發均可找到表中其他結點
  • 判斷終止
    • 由于循環鏈表中沒有NULL指針,所以涉及遍歷操作時,終止條件不像非循環鏈表那樣判斷p或p->next是否為空,而是是否等于頭指針
    • 循環條件從p!=NULL到p!=L,p->next!=NULL到p->next!=L(單循環鏈表)
  • 時間復雜度
    • 頭指針表示單循環鏈表
      • 找a~1的時間復雜度:O(1)
      • 找a~n的時間復雜度:O(n)
        • 注意
          • 表的操作常常在表的首尾位置上進行
    • 尾指針表示單循環鏈表
      • a~1的存儲位置是:R->next->next
      • a~n的存儲位置是:R
      • 時間復雜度均為O(1)
  • LinkList Connect(LinkList Ta,LinkList Tb)    //假設Ta.Tb都是非空的單循環鏈表
    {vp=Ta->next;    //p存表頭結點Ta->next=Tb->next->next;    //Tb表頭連接Ta表尾delete Tb->next;    //釋放Tb表頭結點Tb->next=p;    //修改指針return Tb;
    }  

十七.雙向鏈表

  • 雙向鏈表的由來
    • 查找某結點的后續結點的執行時間=O(1)
      • 單鏈表結點->有指示后繼的指針域->后繼結點
    • 查找某結點的前驅結點的執行時間=O(n)
      • - ->無指示前驅的指針域->依次尋找前驅結點
  • 雙向鏈表的概念
    • 在單鏈表的每個結點里再增加一個指向其直接前驅的指針域prior,這樣鏈表就形成了有兩個方向不同的鏈。
  • 雙向鏈表的特點
    • 雙向鏈表也有循環表
      • 讓頭結點的前驅指針指向鏈表的最后一個節點
      • 讓最后一個節點的后繼指針指向頭結點
  • 雙向鏈表結構的對稱性
    • p->prior->next=p=p->next->prior
  • 在雙向鏈表中有些操作(如:ListLength、GetElem等),因僅涉及一個方向的指針,所以它們的算法與線性鏈表的相同。
  • 在插入、刪除時,則需同事修改兩個方向上的指針,兩個的操作的時間復雜度都為O(n)。

雙向鏈表的插入

void ListInsert_DuL(DuLinkList &L,Init i,ElemType e)    //在帶頭結點的雙向循環鏈表L中第i個位置之前插入元素e
{if(!(p=GetElemP_DuL(L,i)))return ERROR;s=new DuLNOde;s->date=e;s->prior=p->prior;p->prior->next=s;s->next=p;p->prior=s;return OK;
}//ListInsert_Dul

雙向鏈表的刪除

void ListDelete_DuL(DuLinkList &L,Init i,ElemType &e)    //刪除帶頭節點的雙向循環鏈表L的第i個元素,并返回e
{if(!(p=GetElemP_DuL(L,i)))return ERROR;e=p->data;p->prior->next=p->next;p->next->prio=p->prior;free(p)return OK;
}//ListDelete_Dul

十八.單鏈表,循環鏈表和雙向鏈表的時間效率比較

時間效率的比較

查找表頭結點(首元結點)

查找表尾結點

查找結點*P的前驅結點

帶頭結點的單鏈表L

L->next

時間復雜度O(1)

從L->next依次向后遍歷時間復雜度O(n)

通過p->next無法找到其前驅

帶頭結點僅設頭指針L的循環單鏈表

L->next

時間復雜度O(1)

從L->next依次向后遍歷時間復雜度O(n)

通過p->next可以找到其前驅 時間復雜度O(n)

帶頭結點僅設尾指針R的循環單鏈表

R->next|

時間復雜度O(1)

R 時間復雜度O(1)

通過p->next可以找到其前驅 時間復雜度O(n)

帶頭結點的雙向循環鏈表L

L->next

時間復雜度O(1)

L->prior

時間復雜度O(1)

p->prior 時間復雜度O(1)

十九.順序表和鏈表的比較

  • 鏈式存儲結構的優點
    • 節點空間可以動態申請和釋放
    • 數據元素的邏輯次序靠節點的指針來指示,插入和刪除時不需要移動數據元素
  • 鏈式存儲結構的缺點
    • 存儲密度小,每個結點的指針域需額外占用存儲空間。當每個節點的數據域所占字節不多時,指針域所占存儲空間的比重閑得很大。
      • 存儲密度
        • 概念
          • 結點數據本身所占的存儲量和整個節點結構所占的存儲量之比
        • 公式
          • 存儲密度=結點數據本身占用的空間/結點占用的空間總量
        • 比較
          • 順序表存儲密度1,鏈式小于1。
    • 鏈式存儲結構是非隨機存儲結構。對任一結點的操作都要從頭指針依指針鏈查找到該結點,增加了算法的復雜度。
  • 順序表和鏈表比較圖

比較項目\存儲結構

順序表

鏈表

空間-存儲空間

預先分配,導致空間閑置或溢出現象

動態分配,不會出現存儲空間閑置或溢出現象

空間-存儲密度

不用為表示結點間的邏輯關系而增加額外的存儲開銷,存儲密度等于1

需要借助指針來體現元素間的邏輯關系,存儲密度小于1.

時間-存取元素

隨機存儲,按位置訪問元素的時間復雜度O(1)

順序存儲,按位置訪問元素時間復雜度O(n)

時間-插入、刪除

平均移動約表中一半元素,時間復雜度O(n)

不需要移動元素,確定插入,刪除位置后,時間復雜度O

適用情況

  • 表長變化不大,能事先確定變化的范圍。
  • 很少進行插入或刪除操作,經常按元素位置序號訪問數據元素。
  • 長度變化較大
  • 頻繁進行插入或刪除操作

二十.線性表的應用

  • 線性表的合并
    • 問題
      • 假設利用兩個線性表La和Lb分別表示兩個集合A和B,現要求一個新的集合A=AUB
    • 解決
void union(List &La,List Lb)
{La_len=ListLength(La);Lb_len=ListLength(Lb);for(i=1;i<=Lb_len;i++){GetElem(Lb,i,e);if(!LocateElem(La,e))ListInsert(&La,++La_len,e);    }
}    //算法的時間復雜度是:O(ListLength(La)*ListLength(Lb))
  • 有序表的合并
    • 問題
      • 已知線性表La和Lb中的數據元素按值非遞減有序排列,現要求LA和Lb歸并為一個新的線性表Lc,Lc中的數據元素扔按值非遞減有序排列。
    • 解決
      • 創建一個空表Lc
      • 依次從La或Lb中“摘取”元素值較小的節點插入到Lc表的最后,直到其中一個表邊空為止
      • 繼續將La或Lb其中一個表的剩余節點插入在Lc表的最后

用順序表來實現

void MergeList_Sq(SqList LA,SqList Lb,SqList &LC)
{pa=LA.elem;pb=LB.elem;    //指針pa和pb的初值分別指向兩個表的第一個元素LC.length=LA.length+LB.length;    //新表長度為待合并量表的長度之和LC.elem=new ElemType[LC.length];    //為合并后的新表分配一個數組空間pc=LC.elem;    //指針pc指向新表的第一個元素pa_last=LA.elem+LA.length-1;    //指針pa_last指向LA表的最后一個元素pb_last=LB.elem+LB.length-1;     //指針pa_last指向LB表的最后一個元素while(pa<=pa_last && pb<=pb_last)    //兩個表都非空{if(*pa<=*pb)*pc++=*pa++;    //依次“摘取”兩表中的最小值else *pc++=*pb++;                                                          }while(pa<=pa_last)*pc++=*pa++;     //LB表已到達表尾,將LA中剩余元素加入LCwhile(pb<=pb_last)*pc=++=*pb++;    //LA表已到達表尾,將LB中剩余元素加入LC
}    //MergeList_Sq//算法的時間復雜度是:O(ListLength(La)*ListLength(Lb))

用鏈表來實現

void MergeList_L(SqList &La,SqList &Lb,SqList &Lc)
{pa=La->next;pb=Lb->next;pc=Lc=La;    //用La的頭結點作為Lc的頭結點while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;        }               else{pc->next=pb;pc=pb;pb=pb->next;        }     }pc->next=pa?pa:pb;  //插入剩余段delete Lb;    //釋放Lb的頭結點
}    //算法的時間復雜度是:O(ListLength(La)*ListLength(Lb))
  • 一元多項式的運算
    • 多項式創建
    • 創建一個只有頭結點的空鏈表
    • 根據多項式的項的個數n,循環n次執行以下操作
      • 生成一個新結點*s
      • 輸入多項式當前項的系數和指數賦給新節點*s的數據域
      • 設置一前驅指針pre,用于指向待找到的第一個大于輸入項指數的結點的前驅,pre初值指向頭結點。
      • 指針q初始化,指向首元結點
      • 循鏈向下逐個比較鏈表中當前結點與輸入項指數,找到第一個大與輸入項指數的節點*q
      • 將輸入項結點*s插入到結點*q之前
void CreatePolyn(Polynomial &P,int n)    //輸入m項的系數和指數,建立表示多項式的有序鏈表P
{P=new PNode;p->next=NULL;    //先建立一個帶頭結點的單鏈表for(i=1;i<=n;i++)    //依次輸入n個非零項{s=new PNode;    //生成新節點cin>>s->coef>>s->expn;    //輸入系數和指數pre=P;    //pre用于保存q的前驅,初值為頭結點q=P->next;    //q初始化,指向首元結點while(q&&q->expn<s->expn)    //找到第一個大于輸入項指數的項*q{pre=q;q=q->next;        }    s->next=q;    //將輸入項s插入到q和其前驅結點pre之間pre->next=s;}
}

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

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

相關文章

RocketMQ學習(2) 深入學習

RokcetMQ的介紹和基礎知識見這篇博客——RocketMQ學習(1) 快速入門 本篇為上一篇的深入學習&#xff0c;很多基礎知識不再贅述。 目錄 消息重復消費問題(去重;冪等)布隆過濾器 重試機制死信消息 SpringBoot集成RocketMQ集成SpringBoot發送不同消息模式(同步消息)異步消息單向消…

python下載指定URL的文件

import requests # 圖片的URL地址 url https://book.pep.com.cn/1212001402143/files/mobile/1.jpg?240301113921 # 發送HTTP GET請求 response requests.get(url) # 檢查請求是否成功 if response.status_code 200: # 打開一個文件用于寫入 with open(download…

實習碰到的問題w1

1.vueelementUI在輸入框中按回車鍵會刷新頁面 當一個 form 元素中只有一個輸入框時&#xff0c;在該輸入框中按下回車應提交該表單。如果希望阻止這一默認 行為&#xff0c;可以在 <el-form> 標簽上添加 submit.native.prevent 。 參考&#xff1a;element-ui 表單 form …

使用el-tab,el-tab-pane循環使用循環后不顯示下劃線問題

在vue項目中使用element-UI el-tab里的el-tab-pane是循環出來的&#xff0c;但是循環出來后選中tab不顯示下劃線了 文章目錄 問題問題展示效果問題代碼問題原因 解決方案解決后效果解決方案1代碼 解決方案2代碼 問題 問題展示效果 問題代碼 <el-tabs v-model"activeNa…

音量的對數表示與浮點數表示

音量用浮點數&#xff08;float&#xff09;和對數&#xff08;logarithmic scale&#xff09;表示各有特點和應用場景 浮點數&#xff1a;直接使用線性刻度表示音量&#xff0c;例如在0.0&#xff08;最小音量&#xff09;到1.0&#xff08;最大音量&#xff09;的范圍內。對…

『 Linux 』緩沖區(萬字)

文章目錄 &#x1f9a6; 什么是緩沖區&#x1f9a6; 格式化輸入/輸出&#x1f9a6; 刷新策略&#x1fab6; 塊緩沖(fully buffered)&#x1fab6; 無緩沖(unbuffered)&#x1fab6; 行緩沖(line buffered) &#x1f9a6; 現象解釋&#x1f9a6; exit()與_exit()&#x1f9a6; 進…

list 的實現

目錄 list 結點類 結點類的構造函數 list的尾插尾刪 list的頭插頭刪 迭代器 運算符重載 --運算符重載 和! 運算符重載 * 和 -> 運算符重載 list 的insert list的erase list list實際上是一個帶頭雙向循環鏈表,要實現list,則首先需要實現一個結點類,而一個結點需要…

【代碼隨想錄——回溯算法——四周目】

1.重新安排行程 1.1 我的代碼&#xff0c;超時通不過 var (used []boolpath []stringres []stringisFind bool )func findItinerary(tickets [][]string) []string {sortTickets(tickets)res make([]string, len(tickets)1)path make([]string, 0)used make([]bool,…

JSON Web Token

JWT 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一種用于在各方之間作為JSON對象安全地傳輸信息的開放標準&#xff08;RFC 7519&#xff09;。該信息經過數字簽名&#xff0c;因此是可驗證和可信的。JWT 可以使用HMAC算法或使用RSA的公鑰/私鑰對進行簽名 JWT的…

微信小程序 vant Picker組件default-index不生效的解決辦法

1、原始的寫法以及問題 <van-popup show"{{ showPopup && cellClick Freq }}" position"bottom" bind:close"onPopupClose"><van-picker value-key"Spec" show-toolbar title"{{cellClick Freq ? showPcCha…

win10鍵盤按亂了,如何恢復?

今天鍵盤被寶寶給按亂了&#xff0c;好不容易給重新調整回來&#xff0c;記錄備忘&#xff1a; 1、win10的asdf和方向鍵互換了&#xff1a; 使用Fnw鍵來回切換&#xff0c;OK&#xff01; 2、鍵盤的win鍵失效&#xff0c;例如&#xff1a;按winD無法顯示桌面。此時&#xf…

Day30

Day30 CSS CSS常用樣式 font-family:“微軟雅黑” -設置字體 font-size: 50px -設置字體大小 font-style : italic-設置字體風格 font-weight:bolder -設置字體粗細 color: white-設置字體顏色 letter-spacing: 20px-設置文本內容的間隔 text-decoration :underline - 設置劃…

電動汽車電子系統架構

電動汽車的普及正在穩步發展&#xff0c;供應鏈的各個環節也在發生變化。它涵蓋了制造電動汽車零件的原材料、化學品、電池和各種組件。與此同時&#xff0c;汽車充電基礎設施也參與其中&#xff0c;它們正經歷一個歷史性的階段&#xff0c;經過徹底的重新設計。它們的電氣化以…

Wpf 使用 Prism 實戰開發Day30

登錄界面設計 一.準備登錄界面圖片素材&#xff08;透明背景圖片&#xff09; 1.把準備好的圖片放在Images 文件夾下面&#xff0c;格式分別是.png和.ico 2.選中 login.png圖片鼠標右鍵&#xff0c;選擇屬性。生成的操作選擇>資源 3.MyTodo 應用程序右鍵&#xff0c;屬性&a…

如何修改開源項目中發現的bug?

如何修改開源項目中發現的bug&#xff1f; 目錄 如何修改開源項目中發現的bug&#xff1f;第一步&#xff1a;找到開源項目并建立分支第二步&#xff1a;克隆分支到本地倉庫第三步&#xff1a;在本地對項目進行修改第四步&#xff1a;依次使用命令行進行操作注意&#xff1a;Gi…

地質災害位移應急監測站

地質災害位移應急監測站是一種專門用于地質災害預警和應急響應的設施&#xff0c;它能夠實時監測和分析山體、建筑物、管道等的位移變化情況。以下是關于地質災害位移應急監測站的詳細介紹&#xff1a; 主要組成部分 傳感器&#xff1a;安裝于需要監測的位置&#xff0c;用于…

RK3588+FPGA+AI高性能邊緣計算盒子,應用于視頻分析、圖像視覺等

搭載RK3588&#xff08;四核 A76四核 A55&#xff09;&#xff0c;CPU主頻高達 2.4GHz &#xff0c;提供1MB L2 Cache 和 3MB L3 &#xff0c;Cache提供更強的 CPU運算能力&#xff0c;具備6T AI算力&#xff0c;可擴展至38T算力。 產品規格 系統主控CPURK3588&#xff0c;四核…

Nginx服務器替換SSL證書記得要重啟

輸入訪問域名&#xff0c;發現https證書過期了&#xff0c;果斷申請好ssl證書&#xff0c;并在Nginx服務器上將原證書替換成新申請的證書。 打開瀏覽器輸入網址確認一看&#xff0c;還是原來的證書并沒有替換成功?感覺不合常理 以下開啟了證書為什么替換不成功的排查 1、清除…

GUI 02:布局管理器相關知識,AWT 的 3 種布局管理器應用,以及嵌套布局的使用

一、前言 記錄時間 [2024-05-31] 前置文章 GUI 01&#xff1a;GUI 編程概述&#xff0c;AWT 相關知識&#xff0c;Frame 窗口&#xff0c;Panel 面板&#xff0c;及監聽事件的應用 本文講述了 GUI 編程種布局管理器的相關知識&#xff0c;以及 AWT 的 3 種布局管理器——流式布…

【FPGA】Verilog語言從零到精通

接觸fpga一段時間&#xff0c;也能寫點跑點吧……試試系統地康康呢~這個需要耐心但是回報巨大的工作。正原子&&小梅哥 15_語法篇&#xff1a;Verilog高級知識點_嗶哩嗶哩_bilibili 1Verilog基礎 Verilog程序框架&#xff1a;模塊的結構 類比&#xff1a;c語言的基礎…