資料結構 線性表

2021-10-10 11:47:49 字數 2910 閱讀 1573

一、定義

線性表,從名字上就能感受到是具有像線一樣的性質的表。就像排隊的一隊人,乙個跟著乙個排,有人在頭,有人在尾,每個人知道前面是誰後面是誰,像一根線把他們串起來一樣。它是乙個由零個或者多個資料元素組成的有限序列。

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

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

2.順序表的儲存方式:在c語言中,我們可以用一維陣列來實現順序儲存結構。下面是順序表的儲存結構:

#define maxsize 20                 //儲存空間初始分配的量

用陣列儲存順序表要分配固定長度的陣列空間,由於線性表要進行插入和刪除操作,所以分配的陣列空間要大於當前線性表的長度。

3、順序儲存結構的獲取與插入與刪除操作

獲取元素操作:

#define ok 1               //前提是順序表l存在,且1<=i<=listlength(l)

#define error 0

#define true 1

#define false 0

typedef int status;

status getelem(sqlist l,int i,elemtype *e)

status listinsert(sqlist *l,int i,elemtype e)

l->data[i-1]=e; //新元素插入

l->length++;

return ok;

}

status listdelete(sqlist *l,int i,elemtype *e)

l->length--;

return ok;

}

三、線性表的鏈式儲存結構

1.定義:為了表示每個資料元素a[i]與其後繼資料元素a[i+1]之間的邏輯關係,對於資料元素a[i]來說,除了儲存本身的資訊以外,還需要儲存乙個指示其後繼的資訊(直接後繼的儲存位置)。把儲存資料元素資訊的域稱為指標域,把儲存直接後繼位置的域稱為指標域。這兩個部分資訊組成資料元素a[i]的儲存映像,稱為節點node。

2.鍊錶的儲存結構(以單鏈表為例子):鍊錶中第乙個節點的儲存位置叫做頭指標,之後的每乙個節點,就是上乙個後繼指標指向的位置。為了方便操作,會在單鏈表的第乙個節點前設定乙個頭節點,它的資料域不儲存任何資訊,頭結點的指標域儲存指向第乙個節點的指標。下面是單鏈表的儲存結構:

typedef struct nodenode;

typedef struct node *linklist;

3.鍊錶的獲取插入與刪除(以單鏈表為例)

獲取元素:

status getelem(linklist l,int i,elemtype *e)

if(!p||j>1) //第i個節點不存在

return error;

*e=p->data; //取第i個節點的資料

return ok;

}

單鏈表的插入元素操作:

status listinsert(linklist *l,int i,elemtype e)

if(!p||j>i) //第i個節點不存在

return error;

s=(linklist)malloc(sizeof(node)); //生成新的節點

s->data=e;

s->next=p->next; //將p的後繼節點賦值給s的後繼

p->next=s; //將s賦值給p的後繼

return ok;

}

單鏈表的元素刪除操作:

status listdelete(linklist *l,int i,elemtype *e)

if(!(p->next)||j>i) //第i個節點不存在

return error;

q=p->next;

p->next=q->next; //將q的後繼賦值給p的後繼

*e=q->data; //將q節點中的資料給e

free(q); //**節點,釋放記憶體

return ok;

}

以上的鍊錶的操作均以單鏈表為例子,其他鍊錶的操作寫在後續的文章當中。

四、總結順序儲存結構和單鏈表儲存結構的優缺點

1.儲存分配方式:

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

單鏈表採用鏈式儲存結構存放線性表的資料元素。

2.時間效能:

(1)查詢:

順序儲存結構o(1)

單鏈表o(1)

(2)插入與刪除:

順序儲存結構需要平均移動表長一半的元素,時間為o(n)。

單鏈表在知道某位置的指標後,插入與刪除時間僅為o(1)。

3.空間效能:

順序儲存結構需要與分配儲存空間,分大了,浪費,分小了發生上溢。

單鏈表不需要分配儲存空間,只要有就可以分配,元素個數不受限制。

資料結構(線性表)

1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...

資料結構 線性表

參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...

資料結構 線性表

線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...