線性表 鏈式儲存結構

2022-05-08 13:09:07 字數 4101 閱讀 2940

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

每個元素多用乙個位置來存放指向下乙個元素位置的指標,依次類推,可以找到所有的元素。鏈式儲存中,除了要儲存資料本身外,還要儲存它的後繼元素的儲存位址(指標)。

資料域:儲存資料資訊的域;

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

這兩部分資訊組成資料元素稱之為儲存映像,節點node。

鍊錶中每個結點中只包含乙個指標域,為單鏈表。鍊錶中的第乙個結點的儲存位置叫做頭指標,最後乙個結點指標為空。

2、頭節點和頭指標(頭節點不是必須的)

頭指標:

1

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

2)頭指標具有標識作用,常用頭指標冠以鍊錶的名字(指標變數的名字)。

3)無論鍊錶是否為空,頭指標均不為空。

4)頭指標是鍊錶的必要元素。

頭節點:

1

)放在第乙個元素的結點之前,其資料域一般無意義(可以用來存放鍊錶長度)

2)為了操作的統一方便設立(在第一元素結點前插入和刪除第一結點與其他結點操作統一)

3)頭節點不一定是鍊錶的必要元素。

3、帶頭結點的單鏈表實現

c語言中可以用結構指標來描述單鏈表:

typedef int

elemtype;

typedef

struct

node node, *linklist;

//結點由存放資料的資料域和存放後繼結點位址的指標域組成

單鏈表的插入:

//

單鏈表的插入

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

l是指向頭節點的二級指標

int j=1

; linklist p = *l;

while (p && (j < i))//

找到要插入的位置

linklist n = (linklist)malloc(sizeof

(node));

n->data =e;

n->next = p->next;

p->next =n;

(*l)->data++; //頭節點的資料域,表示當前鍊錶的長度

return1;

}

單鏈表的刪除

//

單鏈表的刪除

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

linklist q = p->next; //

要刪除的結點

*e = q->data;

p->next = q->next;

free

(q);

(*l)->data--;

return1;

}

//

四個基本操作,初始,清空,判斷是否為空,獲取長度

//初始化帶有頭結點的鍊錶

status initlist(linklist*l)

//清空鍊錶(不會清除頭結點)

status clearlist(linklist*l)

(*l)->next =null;

return

ok;}

//判斷鍊錶是否為空

status listempty(linklist l)

//獲取列表長度

intlistlength(linklist l)

#include #include 

typedef

intelemtype;

typedef

intstatus;

typedef

struct

node node, *linklist;

//結點由存放資料的資料域和存放後繼結點位址的指標域組成

//單鏈表的插入

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

l是指向頭節點的二級指標

int j=1

; linklist p = *l;

while (p && (j < i))//

找到要插入的位置

linklist n = (linklist)malloc(sizeof

(node));

n->data =e;

n->next = p->next;

p->next =n;

(*l)->data++; //

頭節點的資料域,表示當前鍊錶的長度

return1;

}//單鏈表的刪除

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

linklist q = p->next; //

要刪除的結點

*e = q->data;

p->next = q->next;

free

(q);

(*l)->data--;

return1;

}int

main()

linklist p = l->next;

while

(p)

printf_s("\n

");intj,e;

printf_s(

"請輸入要刪除第幾個結點\n");

scanf_s("%d

",&j);

listdelete(&l, j, &e);

printf_s(

"刪除的結點為:%d\n

", e);

printf_s(

"刪除後的鍊錶為:\n");

p = l->next;

while

(p)

return1;

}

view code

對於插入或刪除資料越頻繁的操作,單鏈表的效率優勢越明顯。

4、建立鍊錶

頭插法:從乙個空表開始,生成新節點,讀取的資料放到新節點的資料域中,然後將新節點插入到當前鍊錶的表頭上。也就是說,把新加的元素放在表頭後的第乙個位置。

void creatlisthead(linklist* l, int

n)}

尾插法:把新節點插入鍊錶的最後,需要增加乙個指向鍊錶最後乙個尾節點的指標r。

void creatlistend(linklist* l, int

n)}

5、單鏈表結構與順序儲存結構的優缺點:

1)若線性表需要頻繁查詢,很少進行插入和刪除操作,採用順序儲存結構合適。 例如使用者註冊資訊,絕大多數都是讀取資料。 

2)若需要頻繁的插入和刪除,採用單鏈表合適。

優缺點

順序儲存結構

單鏈表儲存分配方式:

一段連續的儲存單元依次儲存線性表的資料元素

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

時間效能:

查詢o(1),插入和刪除o(n)

查詢o(n),插入和刪除o(1)

空間效能:

需要預先分配儲存空間,較大浪費,較小溢位

利用零碎空間

線性表鏈式儲存結構

include include 線性表鏈式儲存結構 typedef struct lnodelnode,linklist int initlist linklist l 初始化 int endinsert linklist l,int e p next s return 1 末尾插入元素 int g...

線性表鏈式儲存結構

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

線性表鏈式儲存

線性表鏈式儲存結構的建立 刪除最小值結點 值唯一 刪除某個指定值 不唯一 就地逆置 反向輸出 遞增排序 刪除重複結點 根據奇偶序號劃分成兩個帶頭結點的單鏈表。include stdio.h include stdlib.h typedef struct lnode lnode,llist void ...