資料結構之鍊錶(二)

2021-08-06 02:19:19 字數 3325 閱讀 3903

2、自寫單鏈表

**實現說明:

插入節點時,需要考慮多種情況,如輸入座標不合法、插入到頭節點、在其他位置插入新節點等。插入方式為新建節點的下個節點指向頭節點,而後讓頭節點指向新建節點,完成插入。其他位置插入則是迴圈到座標位置。

刪除節點時,也需要考慮多種情況,如輸入座標座標不合法、刪除頭節點、刪除其他節點等。刪除方式為頭節點找個替身,然後將頭節點指向頭節點的下個節點。其他位置刪除則是迴圈到座標位置。

#include #include #define true   1

#define false 0

typedef int linkdata; // 鍊錶的資料型別

typedef struct _node

node;

// 鍊錶的頭插

int insert_head(node **h, linkdata data)

// 給結點成員變數賦值

node->data = data;

node->next = *h;

// 讓新節點變為鍊錶的第乙個結點

*h = node;

return true;

}// 尾插

int insert_last(node **h, linkdata data)

// 建立新節點

node* node = (node*)malloc(sizeof(node)/sizeof(char));

if (node == null)

// 給結點成員變數賦值

node->data = data;

node->next = null;

// 找最後乙個結點

node * tmp = *h; // 指向第乙個結點

if (tmp == null) // 空表

else

tmp->next = node;

} return true;

}// 在第 pos 個節點處插入資料,鍊錶結點從1開始,沒有第0個結點

int insert_pos (node** h, int pos, linkdata data)

// 給結點成員變數賦值

node->data = data;

// 空表的狀態下,只能插入在第乙個結點處

if (*h == null)

node->next = null;

*h = node;

} else // 非空表,需要找到插入位置的前乙個結點

else

if (tmp == null)

node->next = tmp->next;

tmp->next = node;

} }return true;

}int delete_pos(node** h, int pos)

else

if (tmp->next == null)

node* p = tmp->next;

tmp->next = p->next;

free(p); }

return true;

}int reverse_list(node **h)

(*h)->next = null;

*h = pre;

return true;

}void display(node *h)

printf ("\n");

}int main()

#if 0

insert_pos(&head, 1, 1000);

insert_pos(&head, 10, 2000);

insert_pos(&head, 13, 3000);

insert_pos(&head, 15, 3000);

insert_pos(&head, 0, 1000);

#endif

//delete_pos(&head, 11);

display(head);

reverse_list(&head);

display(head);

return 0;

}

3、單向線性鍊錶總結

每個節點除了存放元素資料之外,還需要儲存指向下乙個節點的指標,即所謂後指標。

鍊錶尾節點的後指標為空指標。

三、單向迴圈鍊錶

參看:資料結構_線性表_鏈式儲存_單向迴圈鍊錶的基本操作

對於乙個迴圈鍊錶來說其首節點和末節點被連線在一起。這種方式在單向和雙向鍊錶中皆可實現。要轉換乙個迴圈鍊錶,可以選擇開始於任意乙個節點然後沿著列表的任一方向直到返回開始的節點。再來看另一種方法,迴圈鍊錶可以被視為「無頭無尾」。這種列表利於節約資料儲存快取,假定你在乙個列表中有一物件並且希望所有其他物件迭代在乙個非特殊的排列下。

指向整個列表的指標可以被作為訪問指標。如下:

迴圈鍊錶中第乙個節點之前就是最後乙個節點,反之亦然。換換鍊錶的無邊界使得這樣的鍊錶上設計演算法會比普通鍊錶更加容易。對於新加入的節點應該是在第乙個節點之前還是最後乙個節點之後可以根據實際要求靈活處理,區別不大(詳見下面的示例)。當然,如果只會在最後插入資料(或者只會之前),處理也是很容易的。

另外有一種模擬的迴圈鍊錶,就是訪問到最後乙個節點之後的時候,手工的跳轉到第乙個節點。訪問到第乙個節點之前的時候也一樣。這樣也可以實現迴圈鍊錶的功能,在直接用迴圈鍊錶比較麻煩或者可能會出現問題的時候可以用。

**實現說明:

插入節點時,需要考慮多種情況,如輸入座標不合法、插入到頭節點、在其他位置插入新節點等。插入方式為新建節點的下個節點指向新建節點,而後讓頭節點指向新建節點,完成插入。其他位置插入則是迴圈到座標位置。

和線性鍊錶不同,如果鍊錶無節點則新建節點下個節點不指向null,而是執行本身。

刪除節點時,也需要考慮多種情況,如輸入座標座標不合法、刪除頭節點、刪除其他節點等。刪除方式為頭節點找個替身,然後將頭節點指向頭節點的下個節點。其他位置刪除則是迴圈到座標位置。

當刪除的只剩乙個節點時,刪除後需要設定為null。

4、單向迴圈鍊錶總結

每個節點除了存放元素資料之外,還需要儲存指向下乙個節點的指標,即所謂後指標。

鍊錶尾節點的後指標指向首節點,首尾相接構成環狀。

資料結構之鍊錶(二)

2 自寫單鏈表 實現說明 插入節點時,需要考慮多種情況,如輸入座標不合法 插入到頭節點 在其他位置插入新節點等。插入方式為新建節點的下個節點指向頭節點,而後讓頭節點指向新建節點,完成插入。其他位置插入則是迴圈到座標位置。刪除節點時,也需要考慮多種情況,如輸入座標座標不合法 刪除頭節點 刪除其他節點等...

資料結構 鍊錶 二

上篇部落格詳細介紹了鍊錶的基礎功能增刪改查,但是鍊錶的主要難度是在鍊錶的逆序上,下面主要介紹鍊錶逆序。1 鍊錶逆序 一 假設當前有5個結點,head a1 a2 a3 a4 a5,他們的頭指標是head。我們的思路便是將a1作為當前元素一直往後遍歷,並且將a1後面的資料依次挪到head之後。在第一次...

資料結構 二 鍊錶

鍊錶,就是鍊錶嘛,下面是鍊錶的基本操作 include include include include pragma warning disable 4996 typedef struct mylist li li createlist int n 建立含有n個資料的鍊錶,返回頭結點 void in...