連結串列(linked list)的通用例程
阿新 • • 發佈:2019-02-20
連結串列概述
連結串列是由一系列不必在記憶體中相連的結構組成。每一個結構均含有表元素和指向包含該元素後繼元的結構的指標,稱之為Next指標。最後一個單元的Next指標指向NULL;該值由C定義並且不能與其他指標混淆。ANSI C 規定NULL為零。
連結串列例程
- 型別宣告
typedef int ElementType;//資料元素型別
struct Node;//結點
typedef struct Node *PtrToNode;//指向結點的指標
typedef PtrToNode List;//連結串列
typedef PtrToNode Position;//位置
struct Node
{
ElementType Element;//表元素
Position Next;//指向下一結點(後繼元)的指標
};
- 測試一個連結串列是否為空表
int IsEmpty(List L)//傳進的是頭結點
{
return L->Next == NULL;
}
- 測試當前位置是否為連結串列的末尾(配合刪除結點使用)
int IsLast(Position P, List l)
{
return P->Next == NULL;
}
- Find 例程(返回關鍵字首次出現的位置)
Position Find(ElementType X, List L)
{
Position P;
P = L->Next;//從第一個結點開始尋找
while(P != NULL && P->Element != X)//直到找到或者到達連結串列末尾
P = P->Next;
return P;
}
- 連結串列的插入例程(將元素X插入到位置P之後)
void Insert(ElementType X, List L, Position P)
{
Position TmpCell;
TmpCell = malloc(sizeof(struct Node));//申請空間
/*malloc(sizeof(struct Node))是合法的,但是它並不是給結構體分配足夠的空間,只是給指標分配一個空間*/
if(TmpCell == NULL)//申請失敗
exit(-1);
TmpCell->Element = X;//插入結點
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
- FindPrevious 例程(返回表元的前驅元的位置)
Position FindPrevious(ElementType X, List L)
{
Position P;
P = L;
while(P->Next != NULL && P->Next->Element != X)//直到P的下一結點元素與關鍵字相等或者到達連結串列尾
P = P->Next;
return P;
}
- 連結串列的刪除例程(與FindPrevious 例程,IsLast()一起使用)
void Delete(ElementType X, List L)
{
Position P, TmpCell;
P = FindPrevious(X, L);
if(!IsLast(P, L))//如果找到元素X,則刪除之;否則表示連結串列中不存在X
{
TmpCell = P->Next;
P->Next = TmpCell->Next;
free(TmpCell);
}
}
- 刪除一個連結串列
void DeleteList(List L)
{
Position P, Tmp;
P = L->Next;
L->Next = NULL;
while(P != NULL);
{
Tmp = P->Next;
free(P);//釋放結點
P = Tmp;
}
}
- 雙鏈表
在結構體中新增一個域,使它包含指向前一個單元的指標。
struct Node
{
ElementType Element;//表元素
Position Last, Next;
//指向上一結點(前繼元)、下一結點(後繼元)的指標
};
- 迴圈連結串列
讓最後的單元反過來直指第一個單元的做法。