轉 線性表(順序表和單鏈表)

2022-06-03 19:06:11 字數 4053 閱讀 2870

**大神 權侵刪   

一、定義:是n個型別相同的資料元素的有限序列。

線性表元素的個數n(n>=0)定義為線性表的長度,當n=0時,稱為空表。

在較複雜的線性表中,乙個資料元素可以由若干個資料項組成。

三、線性表的順序儲存結構

1、順序儲存定義:線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。

2、順序儲存方式

描述順序儲存結構需要三個屬性:

a、儲存空間的起始位置:陣列data,它的儲存位置就是儲存空間的儲存位置。

b、線性表的最大儲存容量:陣列長度maxsize.

c、線性表的當前長度:length。

#define maxsize  100typedef 

struct

list;//別忘分號

乙個這個 就是表示的乙個線性表(以陣列的形式順序儲存)了 想用的話就跟陣列沒啥區別

(last表示的是下標值,所以表示順序表中序號為i的元素: l->elem[i-1]   順序表的長度:l->last+1; )

3、資料長度與線性表長度的區別

a、陣列長度:陣列的長度是存放線性表的儲存空間的長度儲存分配後這個量是一般是不變的。

b、線性表長度:線性表長度是線性表中資料元素的個數,隨著線性表插入和刪除操作的進行,這個量是變化的。

在任意時刻,線性表的長度應該小於等於陣列的長度。

4、位址計算方法

儲存器中的每個儲存單元都有自己的編號,這個編號稱為位址。

假設占用的是c個儲存單元,那麼線性表中第i+1個資料元素的儲存位置和第i個資料元素的儲存關係滿足下列關係(loc表示獲得儲存位置的函式)。

所以對於第i個資料元素a1的儲存位置可以由a1推算得出:

四、順序儲存結構的初始化 插入 刪除 查詢

【都是不帶頭結點的 】滾麻痺陣列要個鬼的頭結點

初始化:

list makeempty()
查詢:1>按序號查詢:直接l->element[i-1]啊;

2>按內容查詢

int

searchposition(list l,elementtype e)

if(i<=l->last)

else

}

插入:

#define true 1;

#define error 0;

int insert(list *l,int i, elementtype e)

else

else

l->elem[i-1]=e;

l->last++;//!!}

return (true);

}}//元素平均移動次數:n/2 【在表頭插入 移動n個資料 表尾插入 乙個不動】

刪除:

int delete(list l,int i,element *p)

else

else

l->last--;

return (true

); }

}}//平均移動次數 n-1/2 【刪除表尾不需要移動元素 刪除表頭移動n-1次】

4、線性表順序儲存結構的優缺點

優點:a、無須為表示表中元素之間的邏輯關係而增加額外的儲存空間。

b、可以快速地訪問表中任一位置的元素。

缺點:a、插入和刪除操作需要移動大量元素。

b、當線性表長度變化較大時,難以確定儲存空間的容量。

c、造成儲存空間的「碎片」。

五、線性表的鏈式儲存結構(動態儲存方式)( 就是單鏈表

)1、線性表鏈式儲存結構定義

為了表示每個資料元素a與其直接後繼資料元素之間的邏輯關係,對資料元素a來說,除了儲存其本身的資訊之外,還需儲存乙個指示其後繼的資訊(即直接後繼的儲存位置)。我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱作指標或鏈。這兩部分資訊組成資料元素a的儲存映像,稱為結點。

n個結點(a的儲存映像)鏈結成乙個鍊錶,即為線性表的鏈式儲存結構,因為此鍊錶的每個結點中只包含乙個指標域,所以叫做單鏈表

把鍊錶中的第乙個結點的儲存位置叫做頭指標。規定,線性鍊錶的最後乙個結點指標為「空」。 習慣上用頭指標代替單鏈表

有時,為了方便對鍊錶進行操作,會在單鏈表的第乙個結點前附設乙個結點,稱為頭結點。頭結點的資料域可以不儲存任何資訊。

2、頭指標與頭結點的異同

頭指標:

a、頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標。

b、頭指標具有標識作用,所以常用頭指標冠以鍊錶的名字。

c、無論鍊錶是否為空,頭指標均不為空。頭指標是鍊錶的必要元素。

頭結點:

a、頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其資料域一般無意義(也可存放鍊錶的長度)。

b、有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作與其他結點的操作就同一了。

c、頭結點不一定是鍊錶必須元素。

單鏈表的儲存結構:

typedef struct

nodenode, *listnode;

//這個表示的是一整個單鏈表中的乙個元素 由一堆這個構成乙個單鏈表

初始化單鏈表:

listnode initlist (listnode l)
建立單鏈表://這是用鏈表示線性表  而不是陣列  typedef那只是乙個鍊錶元素

1>頭插法:

帶頭結點 不帶頭結點

2>尾插法:帶頭結點 不帶頭結點

查詢1>按序號

listnode get(listnode l,int i)

if(i==j)

else

}時間複雜度為o(n)

2>按值查詢:

listnode get(listnode l,elementtype e)

else

}}//

時間複雜度為o(n)

求單鏈表的長度:

int

length(listnode l)

return

i;}

//時間複雜度為o(n)
單鏈表的插入:(頭結點)

void insert(listnode l,int i,elementtype e)

if(p==null);

q=(listnode)malloc(sizeof

(node));

q->data=e;

q->next=p->next;

p->next=q;

//return l;

}

刪除第i個元素:

void delete(listnode l,int i,elementtype *e)

if(p==null)

temp=p->next;

p->next=temp->next;

*e=temp->data;//

加不加*就是值傳遞和引用傳遞的區別

free(temp);//

因為建立鍊錶各個元素的時候是用malloc來的 所以不用時要清除掉空間

}

刪除整個表:

void

delete(listnode l)

l->next=null;

}

八、單鏈表結構與順序儲存結構優缺點

1、單鏈表結構和順序儲存結構對比:

a、儲存分配方式:

順序儲存結構用一段連續的儲存單元依次儲存線性表的資料元素。

單鏈表採用鏈式儲存結構,用一組任意的儲存結構單元存放線性表的元素。

b、時間效能:

查詢:順序儲存結構o(1),單鏈表o(n)。

c、空間效能:順序儲存結構需要預分配儲存空間,分大了,浪費,分小了易發生上溢。單鏈表不需要分配儲存空間,只要有就可以分配,元素個數也不受限制。

線性表逆置(順序表和單鏈表)

這幾天練習了下線性表的逆置,順序表比較簡單,就是陣列的位置交換。順序表的逆置 單鏈表的逆置 頭插法就地逆置 遞迴順序表的逆置 中間變數temp,交換首位兩個元素的位置。void listreverse sqlist l sqlist status listinit sqlist l status l...

線性表 順序表與單鏈表(模板)

順序表 線性表的順序儲存結構,靜態儲存分配,通常用一位陣列來實現 include using namespace std const int maxsize 100 template typename t class seqlist template typename t seqlist seqli...

線性表之單鏈表

cpp view plain copy linkedlist linc 2013.2.26 include include include define ok 1 define error 1 define ture 1 define false 0 struct node typedef stru...