常見的資料結構只有兩種:
1、陣列
2、鍊錶
陣列中的元素是連續儲存的,而鍊錶的元素則可以不連續,只需要有指標指向下乙個元素即可。因此鍊錶適合儲存插入刪除比較頻繁的一組資料。另外鍊錶的儲存空間是動態的,不必預先分配指定的空間大小。。下面介紹鍊錶的幾種常見操作。
首先先定義乙個鍊錶
struct
linklist ;
typedef
linklist
*linklistp;
然後定義兩個函式:
/**
頭結點插入 */
linklistp
insert_head(
linklistp
head,
linklistp
newnode)
/**尾結點插入 */
linklistp
insert_tail(
linklistp
head,
linklistp
newnode)
linklistp
temp = head;
while(1
) temp = temp->
next;
} return
head; }
之後我們利用尾節點插入的函式來建立乙個鍊錶
linklistp
head =
null;
for(
inti =
0;i <
10; i ++)
這樣就建立了乙個包含十個元素的鍊錶。
然後再定義乙個函式,求鍊錶長度
/**
獲取鍊錶長度 */
intgetlength(
linklistp
head)
intcount = 1;
linklistp
temp = head;
while
(temp->
next
!= null)
return
count;
} 然後實現指定位置插入元素的函式
/**
指定位置插入 */
linklistp
insertatindex(
linklistp
head,
intindex,
linklistp
newnode)
intlength =
getlength
(head);
//tips:超出鍊錶範圍,直接返回
if(index >= length+
1|| index < 0)
//tips:如果是在頭結點前面插入
if(index == 0)
//tips:如果是在尾節點後面插入
if(index == length)
//tips:先找到要插入位置的前乙個元素,並且找到該元素的後繼,然後將前乙個元素的next指標指向待插入 的元素,待插入的元素的next指標指向剛才我們找到的後繼,這樣插入操作就完成了
linklistp
temp = head;
for(int
i =
0; i <= length; i ++)
temp = temp->
next;
}return
head;
} 下面再來定義刪除指定元素的操作
/**
刪除指定節點 */
linklistp
deleteatindex(
linklistp
head,
intindex)
intlength =
getlength
(head); if
(index <
0|| index > length)
//tips:如果要刪除的是頭結點,那麼把煉表頭結點變成原頭結點後繼,刪除原頭結點
linklistp
temp = head; if
(index == 0)
//tips:刪除的時候先找到要刪除元素的前乙個元素temp,讓前乙個元素temp的next指向要刪除位置的元素 的後繼,然後釋放被刪除的元素
for(int
i =
0; i < length; i ++)
temp = temp->
next;
} return
head; }
最後再寫乙個函式輸出鍊錶的所有元素
/**
輸出鍊錶元素 */
void
output(
linklistp
head)
} 這樣就可以進行操作刪除的驗證了
單鏈表的插入和刪除
單鏈表的插入與刪除 單鏈表的插入 單鏈表第 i個資料插入結點的演算法思路 1.宣告乙個結點 p指向第乙個結點,初始化j從 1開始 2.當 j時,就遍歷鍊錶,讓 p的指標向後移動,不斷指向下乙個結點,j累加 1 3.若到鍊錶末尾 p為空,則說明第 i個元素不存在 4.否則查詢成功,在系統中生成乙個空結...
單鏈表插入刪除
在鍊錶的插入刪除操作上理解起來比順序表更為容易,其不需要變動在i位置前的所有的元素,只需要修改節點指標即可。插入 設在鍊錶的i位置插入新元素,設i 1節點的指標域為p,設插入的節點指標域為s,所以插入操作應該為 s next p next 將s的字尾改為p的字尾,p的字尾是原來的第i個點的指標域,將...
單鏈表的插入刪除
include using namespace std struct lnode void creat link lnode head head指標的引用,lnode head 傳遞的是指標,但是對於指標的原值卻發生了copy,這樣你雖然可以對指標指向的記憶體進行修改但是不能對指標進行修改。因此要傳...