线性表----顺序表
生活随笔
收集整理的這篇文章主要介紹了
线性表----顺序表
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
線性表的定義
線性表是具有相同數(shù)據(jù)類型的n個(gè)數(shù)據(jù)元素的有限序列,
邏輯特性
除第一個(gè)元素外,每個(gè)元素只有一個(gè)前驅(qū),除最后一個(gè)元素外,每個(gè)元素都有一個(gè)后繼
物理結(jié)構(gòu)
線性表的存儲結(jié)構(gòu)有順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu),前者稱為順序表,后者稱為鏈表。
順序表
線性表的順序存儲又稱順序表。特點(diǎn)是用一組地址連續(xù)的存儲單元依次存儲數(shù)據(jù),從而使邏輯相鄰的兩個(gè)元素在物理地址上也相連。
#define MaxSize 50 //定義線性表最大長度 typedef int ElemType; //定義數(shù)據(jù)類型typedef struct{ElemType data[MaxSize]; //用一維數(shù)組來存儲數(shù)據(jù)int length; //定義線性表的當(dāng)前長度 }SqList;上面是用一位數(shù)組是靜態(tài)分配,也可以用動態(tài)分配
#define InitSize 100 typedef struct{ ElemType *data; int MaxSize,length; }SqList;順序表特點(diǎn)
- 隨機(jī)訪問
- 存儲密度高,因?yàn)槲锢淼刂愤B續(xù)
基本操作
1、插入
在順序表L的第i個(gè)位置插入新元素e,如果插入位置i不合法,則返回false;如果順序表滿了,返回false;否則,將順序表的第i個(gè)元素及其后所有的元素右移一位
bool ListInsert(SqList& L, int i, ElemType e) {if (i<1 || i>L.length + 1) //此處注意是length+1,不能是MaxSizereturn false;if (L.length >= MaxSize)return false;for (int j=L.length;j>=i;j--){L.data[j] = L.data[j-1];}L.length++;return true; }時(shí)間復(fù)雜度問題:
下面理解的時(shí)候,可以將n理解為length
- 最好情況下:在表尾插入,即i=n+1,后移語句不會執(zhí)行,時(shí)間復(fù)雜度為T(n)=0(1);
- 最壞情況:在表頭插入,即i=1,后移n次,時(shí)間復(fù)雜度為0(n)
- 平均情況:p=1/(n+1),時(shí)間復(fù)雜度為0(n)
2、刪除操作
刪除順序表L中第i個(gè)位置的元素,若成功則返回true,并將被刪除的元素返回,否則返回false
- 判斷i的值是否正確
- 取刪除的元素
- 將被刪除元素后面的所有元素依次向前移動一位
時(shí)間復(fù)雜度
- 最好情況:刪除表尾元素(i=n),無序移動,時(shí)間復(fù)雜度為0(1)
- 最壞情況:刪除表頭元素(i=1),需要移動第一個(gè)元素外所有的元素,時(shí)間復(fù)雜度為0(n)
- 平均情況:時(shí)間復(fù)雜度為0(n)
3、按值查找
在順序表查找第一個(gè)元素值等于e的元素,并發(fā)回其位序
int LocateElem(SqList& L, ElemType e) {for (int i = 0; i < L.length; i++) {if (L.data[i] == e)return i + 1;}return 0; }時(shí)間復(fù)雜度:
- 最好情況:第一個(gè)元素就是,在表頭,T(n)=0(1)
- 最壞情況:查找元素在表尾或者不存在時(shí),需要比較n次,時(shí)間復(fù)雜度為0(n)
- 平均情況:T(n)=0(n)
缺點(diǎn)
順序表的移動、刪除需要移動很多的元素,影響運(yùn)行效率
總結(jié)
以上是生活随笔為你收集整理的线性表----顺序表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手表多少钱一块啊?
- 下一篇: 《从过旧宫诗》是哪个时期的作品?