【數據結構與算法】第三章:表、棧和隊列
標籤(空格分隔): 【數據結構與算法】
3.2.2 鏈表算法
//ADT List MakeEmpty( List L); //是不是空表 int IsEmpty( List L); //當前位置是不是末尾 int IsLast( Position P, List L); //返回X的位置 Position Find( ElementType X, List L); //返回X的前一個位置 Position FindPrevious( ElementType X, List L); //刪除某個位置元素 void Delete( ElementType X, List L); //插入 void Insert( ElementType X, List L, Position P); void DeleteList( List L); Position Header( List L); Position First( List L); Position Advance( Position P); ElementType Retriece( Position P); //具體實現 int IsEmpty( List L){ //Return true if L is empty return L->Next == NULL; } int IsLast( Position P, List L){ return P->Next == NULL; } Position Find( ElementType X, List L){ Position P; P = L->Next; while( P != NULL && P->Element != X) P = P->Next; return P; } Position FindPrevious( ElementType X, List L){ //假設存在表頭 Position P; P = L; while( P->Next != NULL && P->Next->Element != X) P = P->Next; return P; } void Delete( ElementType X, List L){ Position P, TmpCell; P = FindPrevious( X, L); //假設存在表頭 if( !IsLast( P,L)){ //P不是最後一個位置時 TmpCell = P->Next; //考慮到P是指向X的錢一個位置 P->Next = TmpCell->Next; //若X存在,則P確定不是最後一個位置 free( TmpCell); } } void Insert( ElementType X, List L, Position P){ Position TmpCell; TmpCell = ( Position)malloc( sizeof( struct Node)); if( TmpCell == NULL) FatalError("Out of space!"); TmpCell->Element = X; TmpCell->Next = P->Next; P->Next = TmpCell; }
3.2.3 雙鏈表
在數據結構上附加一個域,使它包含只想錢一個單元的指針. 代價:因爲須要更多的指紋定位,所以增長了空間的需求,同時使得刪除和插入的開銷增長了一倍.數據結構
3.2.4 循環鏈表
最後的單元反過來直接指向第一個單元. 它能夠有表頭、也能夠沒有.當表頭存在的時候,便讓最後一個單元指向它. 還能夠是一種雙向鏈表ide