1. 程式人生 > >連結串列(linked list)的通用例程

連結串列(linked list)的通用例程

連結串列概述

連結串列是由一系列不必在記憶體中相連的結構組成。每一個結構均含有表元素和指向包含該元素後繼元的結構的指標,稱之為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;
    //指向上一結點(前繼元)、下一結點(後繼元)的指標
};

  • 迴圈連結串列

讓最後的單元反過來直指第一個單元的做法。