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

2021-08-15 12:36:01 字數 2214 閱讀 3147

由線性表的順序儲存可以得知,順序儲存結構有其自身的優點《查詢特別快捷》,當然同時存在其自身的缺點《對於插入和刪除時,需要移動大量的指標》,所以衍生了鏈式結構來彌補其措施。

鏈式儲存是採用動態儲存的方法,其儲存的單元不受限制,既可以是連續的儲存的位址,也可以是非連續的儲存位址,這樣對於經常需要刪除、插入的資料來說最為合適了,當然,這樣對於每個資料的節點都需要乙個指標域來指向下乙個節點,來實現資料邏輯上的連續。

鍊錶的頭結點用於儲存鍊錶的位置,而其最後一位資料的指標域為null,這樣的鍊錶稱為單鏈表。其儲存結構的描述如下:

typdef struct node

node,*linklist;

ps;linklist與node *同為結構指標型別,通常前者用於表示說明指標變數,強調它是某個單鏈表的頭指標變數,而後者則是表示單鏈表中結點的指標。

1.初始化:

iintlist(linklist  *l)

建立乙個空的單鏈表,

2.建立單鏈表:

鍊錶的初始化分為兩種:頭插法和尾插法。

頭插法:每次插入的結點都放在頭結點的後面,因而形成的鍊錶和插入的順序相反。其**如下:

void createfromhead(linklist l)

else flag=0;

}

}//先申請乙個新節點,將輸入的值賦值給s的資料域,再將l原本指標域所指向的賦值給s的next。

尾插法:

void createfromtail(linklist l)

else  }

}

用尾插法知先申請乙個指標空間賦值給s再將s賦值於尾指標r的next,當輸入完成的時候,再將s的next賦值為null。

查詢:與順序結構的一樣,鍊錶的查詢也分為按序號查詢和按值查詢。

按序號查詢:與順序表不同,鍊錶不能按照一堆陣列的序號來查詢,只能通過指標借助next域來實現查詢,實現**如下:

node * get(linklist l,int i)

if(j==i) return;

elsereturn null;

}

由演算法可知:先通過乙個while迴圈來掃瞄所查詢i的邏輯位置,直到查詢到後採用乙個判斷語句判斷是否查到該元素。

按值查詢:其演算法與順序表的相同,**如下:

node *locate(linklist l,elemtyple key)

求鍊錶的長度;

煉表不像順序表,可以直觀的看出其長度,需要指標遍歷計數。具體**自己實現。

單鏈表的插入操作:

其主要演算法思想分為3步:

查詢->申請->插入掛鏈

集體操作如下:

void inslist(linklist l, int i, elentyple e)

if(!pre)

s=(node *)malloc(sizeof(node));

s->data=e;

s->next=pre->next;

pre->next=s;

return ok;

}

刪除鍊錶:

演算法主要分為兩步:查詢->刪除

**大致和插入相同,只將後續的插入操作變成刪除,並釋放節點即可。

合併列表:

將兩個有序的鍊錶la和lb合併為乙個有序的鍊錶lc。

linklist mergelinklist(linklist la,linklistlb)

//尾插法建立lc

else

}if(pa)

r->next=pa;

else

r->next=pb;

free(la); free(lb);

return(lc);

}

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

鍊錶中的第乙個結點,包含指向第乙個資料元素的指標以及鍊錶自身的一些資訊,表頭節點不是資料元素。鍊錶中代表資料元素的結點,包含指向下乙個資料元素的指標和資料元素的資訊。鍊錶中的最後乙個資料結點,其下一元素指標為空,表示無後繼 煉表頭檔案 linklist.h ifndef linklist h def...

資料結構 線性表鏈式儲存

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

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

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