資料結構 線性表(鏈式儲存結構)

2021-10-09 12:04:27 字數 3098 閱讀 8236

用一組任意的儲存單元儲存線性表的資料結構,這組儲存單元可以是連續的,也可以是不連續的。

對資料結構ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其後繼的資訊(即直接後繼的儲存位置)。

資料域:儲存資料元素資訊的域。

指標域:儲存直接後繼位置的域。

資料域+指標域=結點

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

鍊錶中的第乙個結點的儲存位置(位址)也叫做頭指標,最後乙個結點指標為空,通常用null或者"^"表示。為了方便的對鍊錶進行操作,會在單鏈表的第乙個結點前附設乙個頭結點(可以不儲存任何資訊,頭結點的指標域指向第乙個結點的指標)

1.頭指標是指向鍊錶第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標

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

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

1.頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其資料域一般無意義。

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

3.頭結點不一定是鍊錶的必要元素。

獲取鍊錶第i個資料的演算法思路

1.宣告乙個指標p指向鍊錶第乙個結點,初始化j從1開始

2.當i/*初始條件:順序線性表l已經存在,1<=i<=listlength(l)*/

/*操作結果:用e返回l中第i個資料元素的值*/

status getelem

(linklist l,

int i, elemtype *e)if(

!p || j>i)

/*若第i個結點不存在*/

return error;

*e = p->next;

/*將第i個結點返回給e*/

return ok;

}

s->next=p-next; 

p->next=s;

如果先p->next=s;再s->next=p->next;那麼會使的p->next覆蓋成s的位址,那麼s->next=p->next,其實等於s->next=s;這樣真正的擁有ai+1的資料元素結點就沒了上級。

單鏈表第i個資料插入結點的演算法思路:

1.宣告乙個指標指向煉表頭結點,初始化j從1開始。

2.當jdata。

6.單鏈表的插入標準語句

s->next=p->next;

p->next=s;

7.返回成功。

/*初始條件:順序線性表l已經存在,1<=i<=listlength(l)*/

/*操作結果:用e返回l中第i個資料元素的值*/

status getelem

(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;

}

q=p->next;

p->next=q->next;

單鏈表第i個資料刪除結點的演算法思路

1.宣告乙個指標指向煉表頭結點,初始化j從1開始。

2.當jnext賦值給q。

5.單鏈表的刪除標準語句p->next=q->next。

6.將結點q中的資料賦值給e,作為返回。

7.釋放q結點。

/*初始條件:順序線性表l已經存在,1<=i<=listlength(l)*/

/*操作結果:用e返回l中第i個資料元素的值*/

status getelem

(linklist l,

int i, elemtype *e)if(

!p || j>i)

/*若第i個結點不存在*/

return error;

q=p->next;

p->next=q->next;

/*將q的後繼賦值給p的後繼*/

*e=q->data;

/*將q結點的資料給e*/

free

(q);

/*釋放結點q*/

return ok;

}

單鏈表整表建立的演算法思路:

1.宣告一指標p和計數器變數i

2.初始化以空鍊錶l

3.讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表。

4.迴圈

(1)生成一新結點p

(2)隨機生成一數字賦值給p的資料域p->data

(3)將p插入到頭結點與前一新結點之間

ps:(頭插法)

#include

#include

#define n 10

struct data

;int main (

int argc ,

char

* ar**)

尾插法:把每次新結點都插到終端結點的後面

/*隨機產生n個元素的值,建立帶頭結點的單鏈線性表l(尾插法)*/

void creatlisttail (linklist *l,

int n)

r->next =

null

;/*表示當前鍊錶結束*/

}

/*初始化條件:順序線性表l已經存在,操作結果:將l重置為空表。*/

status clearlist

(linklist *l)

(*l)

->next=

null

;/*頭指標指標域為空*/

return ok;

}

資料結構 線性表鏈式儲存結構

鏈式儲存 用一組任意的儲存單元儲存線性表中的資料元素。用這種方法儲存的線性表簡稱線性鍊錶。儲存鍊錶中結點的一組任意的儲存單元可以是連續的,也可以是不連續的,甚至是零散分布在記憶體中的任意位置上的。鍊錶中結點的邏輯順序和物理順序不一定相同。即不要求邏輯上相鄰的元素在物理位置上也相鄰 為了正確表示結點間...

資料結構 線性表鏈式儲存

對於線性鍊錶,有兩種表示方法,一種是包含頭節點的情況,如下圖 一種是不包含頭節點的情況,如下圖 本文中對線性鍊錶的表示,利用的是帶頭節點的定義方式。使用c 實現了線性鍊錶建立,初始化,刪除,插入,清空,遍歷,有序鍊錶合併等操作。煉表頭 頭指標 頭結點 煉表頭 指的是線性表第乙個元素所在結點 頭指標 ...

資料結構 線性表(鏈式儲存)

1 順序表 需要一片連續的記憶體空間,成員可以隨機訪問,訪問效率高 插入刪除資料存在資料搬移的現象,效率低 儲存密度高 鍊錶的特點 不需要連續的記憶體空間,不能隨機訪問元素,訪問效率低 插入刪除資料不存在資料搬移的現象,效率高 儲存密度比較低 2 無頭鍊錶 第乙個節點為資料節點,加入刪除第乙個節點,...