優勢1:第1個位置的插入刪除更加方便
優勢2:統一空表和非空表的處理
若使用頭結點,無論表是否為空,頭指標都指向頭結點,也就是*lnode型別,對於空表和非空表的操作是一致的。
若不使用頭結點,當表非空時,頭指標指向第1個結點的位址,即*lnode型別,但是對於空表,頭指標指向的是null,此時空表和非空表的操作是不一致的。
//下面是尾插法建立
//宣告節點結構
typedef
struct linklink;
//建立鍊錶的函式
}
從實現**中可以看到,該鍊錶是乙個具有頭節點的鍊錶。由於頭節點本身不用於儲存資料,因此在實現對鍊錶中資料的"增刪查改"時要引起注意。
同順序表一樣,向鍊錶中增添元素,根據新增位置不同,可分為以下 3 種情況:
插入到鍊錶的頭部(頭節點之後),作為首元節點;
插入到鍊錶中間的某個位置;
插入到鍊錶的最末端,作為鍊錶中最後乙個資料元素;
雖然新元素的插入位置不固定,但是鍊錶插入元素的思想是固定的,只需做以下兩步操作,即可將新元素插入到指定的位置:
將新結點的 next 指標指向插入位置後的結點;
將插入位置前結點的 next 指標指向插入結點;
//p為原鍊錶,elem表示新資料元素,add表示新元素要插入的位置
link *
insertelem
(link * p,
int elem,
int add)
}//建立插入結點c
link * c =
(link*
)malloc
(sizeof
(link));
c->elem = elem;
//向鍊錶中插入結點
c->next = temp->next;
temp->next = c;
return p;
}
其中,從鍊錶上摘除某節點的實現非常簡單,只需找到該節點的直接前驅節點 temp,執行一行程式:
//p為原鍊錶,add為要刪除元素的值
link *
delelem
(link * p,
int add)
} link * del = temp->next;
//單獨設定乙個指標指向被刪除結點,以防丟失
temp->next = temp->next->next;
//刪除某個結點的方法就是更改前乙個結點的指標域
free
(del)
;//手動釋放該結點,防止記憶體洩漏
return p;
}
//p為原鍊錶,elem表示被查詢元素、
intselectelem
(link * p,
int elem)
i++;}
//程式執行至此處,表示查詢失敗
return-1
;}
//更新函式,其中,add 表示更改結點在鍊錶中的位置,newelem 為新的資料域的值
link *
amendelem
(link * p,
int add,
int newelem)
temp->elem=newelem;
return p;
}
#include
#include
typedef
struct link link;
link *
initlink()
;//鍊錶插入的函式,p是鍊錶,elem是插入的結點的資料域,add是插入的位置
link *
insertelem
(link * p,
int elem,
int add)
;//刪除結點的函式,p代表操作鍊錶,add代表刪除節點的位置
link *
delelem
(link * p,
int add)
;//查詢結點的函式,elem為目標結點的資料域的值
intselectelem
(link * p,
int elem)
;//更新結點的函式,newelem為新的資料域的值
link *
amendelem
(link * p,
int add,
int newelem)
;void
display
(link *p)
;int
main()
else
printf
("更改第3的位置上的資料為7:\n");
p =amendelem
(p,3,7
);display
(p);
return0;
}link *
initlink()
return p;
}link *
insertelem
(link * p,
int elem,
int add)
}//建立插入結點c
link * c =
(link*
)malloc
(sizeof
(link));
c->elem = elem;
//向鍊錶中插入結點
c->next = temp->next;
temp->next = c;
return p;
}link *
delelem
(link * p,
int add)
} link * del = temp->next;
//單獨設定乙個指標指向被刪除結點,以防丟失
temp->next = temp->next->next;
//刪除某個結點的方法就是更改前乙個結點的指標域
free
(del)
;//手動釋放該結點,防止記憶體洩漏
//迴圈單鏈表的建立,返回尾節點
pnode creat_list()
return ptail;
//返回尾指標
}
單鏈表的基本操作(C語言實現)
單鏈表的初始化,建立,插入,查詢,刪除。include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist linkedlistinit 單鏈表的建立1,頭插法建立單鏈表...
C語言實現單鏈表的基本操作
listnode.h ifndef listnode h define listnode h include stdio.h include assert.h include stdlib.h typedef int datatype typedef unsigned int size t type...
單鏈表 的基本操作 c語言實現
鍊錶的基本操作 c語言實現 執行環境 dev c 5.11 以下為原始碼,如有不正確的地方歡迎指正!include include define false 0 define true 1 typedef int datatype typedef struct nodelinklist linkli...