由線性表的順序儲存可以得知,順序儲存結構有其自身的優點《查詢特別快捷》,當然同時存在其自身的缺點《對於插入和刪除時,需要移動大量的指標》,所以衍生了鏈式結構來彌補其措施。
鏈式儲存是採用動態儲存的方法,其儲存的單元不受限制,既可以是連續的儲存的位址,也可以是非連續的儲存位址,這樣對於經常需要刪除、插入的資料來說最為合適了,當然,這樣對於每個資料的節點都需要乙個指標域來指向下乙個節點,來實現資料邏輯上的連續。
鍊錶的頭結點用於儲存鍊錶的位置,而其最後一位資料的指標域為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 無頭鍊錶 第乙個節點為資料節點,加入刪除第乙個節點,...