日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

删除第一个_学习数据结构--第二章:线性表(顺序存储、插入、删除)

發布時間:2025/3/21 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 删除第一个_学习数据结构--第二章:线性表(顺序存储、插入、删除) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第二章:線性表(順序表示)

1.線性表的定義和基本操作

線性表是具有相同數據類型的n(n≥0)個數據元素的有限序列

線性表中第一個元素稱為表頭元素;最后一個元素稱為表尾元素。

除第一個元素外,每個元素有且僅有一個直接前驅。除最后一個元素外,每個元素有且僅有一個直接后繼。

2.線性表的順序存儲結構

線性表的順序存儲是用一組地址連續的存儲單元(比如C語言里面的數組),依次存儲線性表中的數據元素。順序存儲的線性表也叫順序表。

地址連續:存儲器每個存儲單元都有編號,這個編號就是地址

Loc(a2)=Loc(a1)+d d是元素占據的存儲單元數

Loc(ai)=Loca(a1)+(i-1)*d

通過這個公式,可以計算出順序表中任一個元素的位置,而且所需要的時間都是相同的,即時間復雜度為O(1),即隨機存取

2.1如何建立線性表的順序存儲結構

靜態建表

首先我們要在存儲器中“找塊地”,而且是連續的,那么這塊存儲空間必然有首地址和大小;最后我們要將表中各個元素對號入座,那就要知道有多少元素,也就是表的長度。

順序表需要的三個部分

  • 1.存儲空間的起始位置
  • 2.順序表最大存儲容量
  • 3.順序表當前的長度
#define MaxSize 50 //定義線性表的最大長度typedef int Elemtype //假定表中元素類型是int typedef struct{ ElemType data [MaxSize]; //順序表的元素(數組) int length; //順序表的當前長度}SqList; //順序表的類型定義

數組是靜態分配的(大小固定)

動態建表

其實存儲空間(數組)還可以動態分配,也就是存儲數組的空間是在程序執行過程中通過動態分配語句來分配。

typedef int Elemtype;typedef struct{ ElemType *data; //指示動態分配數組的指針 int MaxSize,length; //數組的最大容量和當前個數}SeqList;//動態分配語句(c語言) #define initSize 100 SeqList L;L.data(ElemType*)malloc(sizeof(ElemType)*initSize);

注意:動態分配并不是鏈式存儲,同樣還是屬于順序存儲結構,只是分配的空間大小可以在運行時決定.

3.總結

在這里插入圖片描述

4.順序表的操作

4.1插入

a5的位置在a1和a2之間。

算法流程:在順序表L的第 i (1<= i<=L.length+1)個位置插入新元素e。如果 i 輸入的不合法,則返回false,表示插入失敗;否則,將順序表的第 i 個元素以及其后的所有元素右移一個位置,騰出一個空位置插入新元素 e ,順序表長度增加 1 ,插入成功,返回true。

bool是布爾類型它只有true和 false兩種值,分別表示真和假

算法思路:

  • 1.判斷的值是否正確
  • 2.判斷表長是否超過數組長度
  • 3.從后向前到第個位置,分別將這些元素都向后移動一位
  • 4.將元素插入位置 i ,修改表長
bool ListInsert(SqList &L,int i,ElemType e){ if(i<1||i>L.length+1){ //判斷i的范圍是否有效 return false; } if(L.length>=MaxSize){ //當前存儲空間已經滿,不能插入 return false; } for(int j=L.length;j>=i;j--){ //將第i個元素之后的元素后移 //初值為下標為L.length是因為要將最后一位向后移動,L.length代表移0動后的下標L.length-1代表當前數組中最后一個元素。 //j>=i,是因為i代表位置i-1才代表最終要移動到的位置的下標,將第i的元素的值變為第i-1個元素的值,就是后移。 L.data[j]=L.data[j-1] } L.data[i-1] = e; //在位置 i 插入e L.length++; //數組長度加1 return true;}

順序存儲插入操作的性能

最好情況:在表尾插入(即i=n+1),元素后移語句將不執行,時間復雜度為O(1)。最壞情況:在表頭插入(即i=1),元素后移語句將執行n次,時間復雜度為O(n)平均情況:假設 p i( pi=1/(n+1) [1/(n+1)是因為總共有n+1一個位置可以被插入]) 是在第 i 個位置上插入一個結點的概率,則在長度為n的線性表中插入一個結點時所需移動結點的平均次數為:

順序表插入算法的平均時間復雜度為O(n)

4.1刪除

算法流程:刪除順序表L中第 i (1≤ i ≤ L.length)個位置的元素,成功則返回true,并將被刪除的元素用引用變量e返回,否則返回 false。

算法思路

  • 1.判斷的值是否正確
  • 2.取刪除的元素
  • 3.將被刪元素后面的所有元素都依次向前移動一位
  • 4.修改表長
bool ListDelete(SqList &L,int i,Elemtype &e){ if(i<1||i>L.length){ //判斷 i 是否有效 return false; } e=L.data[i-1]; //將被刪除的元素復制給e for(int j=i;j

順序存儲刪除操作的性能

最好情況:刪除表尾元素(即i=n),無須移動元素,時間復雜度為O(1) 最壞情況:刪除表頭元素(即i=1)需要移動除第一個元素外的所有元素,時間復雜度為O(n)平均情況:假設pi(pi=1/n [1/n是因為總共有n個位置可以被刪除])是刪除第 i 個位置上結點的概率,則在長度為n的線性表中刪除一個結點時所需移動結點的平均次數為

在這里插入圖片描述

5.總結

順序存儲優點

  • 存儲密度大:不需要為表中元素之間的邏輯關系增加額外存儲空間。
  • 隨機存取:可以快速存取表中任一位置的元素

順序存儲缺點

  • 插入和刪除操作需要移動大量元素
  • 對存儲空間要求高,會產生存儲空間的“碎片”

關于數據結構的知識,持續更新中,歡迎關注公眾號理木客

總結

以上是生活随笔為你收集整理的删除第一个_学习数据结构--第二章:线性表(顺序存储、插入、删除)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。