鏈表 linked list
定義
就是一些包含數據的獨立數據結構的集合。鏈表中每個節點通過鏈或指針連接在一起。程序通過指針訪問鏈表中節點。
單鏈表
每個節點包含一個指向下一個節點的指針,鏈表最后一個節點的指針字段的值為NULL,提示鏈表后不再有其他節點。
- 通過鏈表第一個節點可以訪問剩余所有的節點。
- 根指針(root pointer)指向鏈表的第一個節點。
typedef struct NODE{
struct NODE *link;
int value;
}Node;
單鏈表的插入
將新節點插入到一個有序的單鏈表中
- 插入函數需要檢查是否到達鏈表的尾部
- root是一個指針
- 為新節點分配內存時是否成功
#define FALSE 0
#define TRUE 1
int sll_insert(Node **linkp,int new_value){
Node *current;
Mode *new;
//尋找正確插入位置:按序訪問鏈表
while((current = *linkp) != NULL && current->value < new_value)
linkp = ¤t -> link;
// 為新節點分配內存
new = (Node *)malloc(sizeof(Node));
// 如果內存分配失敗返回false
if(new == NULL)
return FALSE;
// 將新值存到新節點中
new->value = new_value;
new->link = current;
return TRUE;
}
雙鏈表
每個節點都包含兩個指針:指向前一個節點的指針和指向后一個節點的指針
typedef struct NODE{
struct NODE *fwd;
struct NODE *bwd;
int value;
}Node;
根節點
- 根節點fwd字段指向鏈表的第一個節點
- 根節點bwd字段指向鏈表的最后一個節點
- 如果量表為空,則兩個字段都為NULL
雙鏈表的插入
編寫一個當插入值原先不存在于鏈表中才插入的插入函數
將節點插入到鏈表中,可能出現的四種情況
- 新值插入到鏈表的中間位置
- 新值插入到鏈表的起始位置
- 新值插入到鏈表的結束位置
- 原鏈表為空的情況下,插入的位置既是起始位置又是結束位置
int dll_insert(Node *rootp,int value){
Node *this;
Node *next;
Node *new;
for(this = rootp;(next = this->fwd) != NULL;this = next){
if(next->value == value)
return 0;
if(next->value>value)
break;
}
new = (Node *)malloc(sizeof(node));
if(new == NULL)
return -1;
new->value = value;
newnode->fwd = next;
this->fwd = new;
if(this != rootp)
new->bwd = this;
else
new->bwd = NULL;
if(next != NULL)
next->bwd = new;
else
rootp->bwd - new;
return 1;
}