線性表是什麼樣子呢?算法
相似這種,能夠看成生活中流水線做業是同樣的。數組
線性表是由n(N>=0)個數據元素(結點)好比a1,a2,a3....an組成的有限序列網絡
數據元素的個數n定義爲表的長度,spa
當n=0時爲空表(null) code
當n>0時爲非空表 L=(a1....an)blog
a1稱爲起始點 ,an爲終端結點。圖片
對任意一堆相鄰結點ai和ai+1 (1<i<n) ai是ai+1的直接前驅,ai+1是ai的直接後繼內存
(圖片來源於網絡)get
若是吧線性表看成火車就更加明顯了,火車只有一個火車頭(起始節點)一個車尾(終端結點)it
火車頭(起始節點)前面沒有車箱(直接前驅) 可是後面又一節車箱 (直接後繼),車尾(終端結點)後面沒有多餘的車尾(直接後繼) ,可是車尾的前面有一節車箱(直接前驅)。
綜上能夠了解出每個結點且都有一個直接前驅和一個直接後繼
線性表的邏輯結構特徵
對於非空的線性表:線性表中結點具備一對一的關係(具體能夠看上面的火車例子)
1)線性表中有且僅有一個其實結點a1,沒有直接前驅,有且僅有一個直接後繼a2;
2)有且僅有一個終端結點an,沒有直接後繼,有些僅有一個直接前驅an-1;
3)其他的內部結點ai(a<=i<=n-1)都有且僅有一個直接前驅ai-1和一個直接後繼ai+1;
線性表的基本運算
初始化 Initiate 秋表長度Length 取表元 get 定位 Locate 插入Insert 刪除Delete
線性表順序存儲的方法是:將表中的結點依次存放在計算機內存中一組連續的存儲單元中,數據元素在線性表中的鄰接關係決定它們在存儲空間中的存儲位置,即邏輯結構中相鄰的結點其存儲位置也相鄰。
用順序存儲實現的線性表稱爲順序表。通常使用數組來表示順序表。
假定有一組數據,數據間有順序:13 4 5 15 9 53 24 50 88 42 11
此處數據間的順序即表示數據間的邏輯關係即線性關係,這一組數據爲線性表:
假設已知a1地址爲loc(a1),每一個數據佔c個單元,則計算ai地址
Loc(ai)=Loc(a1)+c*(i-1)
好比 a3 的地址
1 a1=0 2 3 Loc(a3)=a1+(3-1) 4 5 =0+2 6 7 =2
初始化
strudt student{ int ID;//ID char name[30];//姓名 char sex; //性別 int class;//班級 int age;//年齡 } student={"01",「zhangsan」,"m","201","20"};
插入
線性表的插入運算是指在表的第i(1<=i<=n+1)個位置上,插入一個新結點x,使長度爲n的線性表「:(a1,....ai-1,ai,ai+1,....an)
變成長度爲n+1的線性表:
(a1,...ai-1,x,ai,ai+1,....an)
1)當表空間已滿,不可在作插入操做
2)當插入位置爲非法位置,不可作正常插入操做
void InsertSeqlist (SeqList l,dataType x,int i){ if (l.length==Maxsize)exit("表已滿"); if(i<1||l.length+1) exit (」位置錯誤「);//插入位置是否正確 for(j=l.length;j>=i;j--){//初始化i=l.length l.data[j]=l.data[j-1];//依次後移 l.data[i-1]=x;//元素x置入到下標爲i-1的位置 l.length++;}//表長度加1
假設線性表中含有n個數據元素,
在進行插入操做時,有 n+1個位置可插入
在每一個位置插入數據的機率是:1/(n+1)
在i位置插入時,要移動n-i+1 個數據
平均時間複雜度爲O(n)
刪除
線性表的刪除運算是指將表的i的結點刪去,使長度爲n的線性表長度」減一「
當要刪除元素的位置I不在表長範圍內(即i<1或i->length)時,爲非法位置,不能作正常的刪除操做
操做過程:
1,若i=n,則只要刪除終端結點,無需移動結點;
2,若1<=i<=n-1,則必須將表中位置i+1,i+2,,,,,n的結點,依次前移到位置I
3,該表長度減1
void DeleteSeqList(SeqList L,int i) { //刪除線性表L中的第i個數據結點 if(i<1 || i>L.length) //檢查位置是否合法 exit(「非法位置」); for(j=i;j<L.length;j ++) //第i個元素的下標爲i-1 L.data[j-1]=L.data[j]; //依次左移 L.length--; //表長度減1 }
刪除算法的分析
假設線性表中含有n個數據元素,
在進行刪除操做時,有 n位置可刪除
在每一個位置刪除數據的機率是:1/n
在i位置刪除時,要移動 n-i+1個數據
假定在n個位置上刪除元素的可能性均等,
平均時間複雜度爲O(n)順序存儲結構表示的線性表,在作插入或刪除操做時,平均須要移動大約一半的數據元素。
當線性表的數據元素量較大,而且常常要對其作插入或刪除操做時,這一點須要值得考慮
定位(查找)
定位運算LocateSeqlist(L,X)的功能是
求L中值等於X的結點序號的最小值,
當不存在這種結點時結果爲0 從第一個元素 a1 起依次和x比較,直到找到一個與x相等的數據元素,則返回它在順序表中的存儲下標或序號;或者查遍整個表都沒有找到與 x 相等的元素,返回0
int LocateSeqlist(SeqList L, DataType x) { int i=0; while ((i<L. length) && (L.data[i]!=x) ) //在順序表中查找值爲 x 的結點 i++; if(i<L.length) return i+1; //若找到值爲x的元素,返回元素的序號 else return 0; //未查找到值爲x的元素,返回0 } //順序表的求表長操做,直接輸出L.length便可
(1)設表的長度length=n,在插入算法中,元素的移動次數不只與順序表的長度
n有關, 還與插入的位置i有關。 插入算法在最壞狀況下,其時間複雜度爲O(n)。
通常狀況下元素比較和移動的次數爲n-i+1次,插入算法的平均移動次數約爲n/2,
其時間複雜度是O(n)。
(2)刪除算法DeleteSeqlist,可得其在最壞狀況下元素移動次數爲n-1,時間複雜
度爲O(n),元素平均移動次數約爲(n-1) /2,時間複雜度爲O(n)。
(3)對於定位算法,須要掃描順序表中的元素。以參數x與表中結點值的比較爲
標準操做,平均時間複雜度爲O(n)。求表長和讀表元素算法的時間複雜度爲O(1),
就階數而言,己達到最低
順序表的優勢:
無需爲表示結點間的邏輯關係而增長額外存儲空間
能夠方便地隨機存取表中的任一結點
順序表的缺點:
• 插入和刪除運算不方便,必須移動大量的結點
• 順序表要求佔用連續的空間,存儲分配只能預先進
行,所以當表長變化較大時,難以肯定合適的存儲
規模