基礎的表ADT -數據結構(C語言實現)


讀數據結構與算法分析

表的概述

  • 形如A1,A2,A3...
  • 操作合集
  1. PrintList
  2. MakeEmpty
  3. Find
  4. Insert
  5. Delete

表的簡單數組實現

分析:

  • PrintList和Find操作線性時間
  • Find操作常數時間
  • Insert和Delete操作效率低下

所以一般不用數組實現

鏈表的指針實現

設計思路

  • 在內存中不必相連
  • 每個結構包含表元素和指向該元素后繼元的指針

即實現了快速Insert和Delete操作

實現代碼

類型聲明

struct Node
typedef struct Node *PtrToNode ;
typedef PtrToNode List ;
typedef PtrToNode Position ;

//操作函數聲明
List MakeEmpty(List L) ;
int IsEmpty(List L) ;
int IsLast(Position P, List L) ;
Positiom Find(ElementType X, List L) ;
void Delete(ElementType X, List L) ;
Position FindPrevios(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 Retrieve(Position P) ;

struct Node
{
ElemenType Element ;
Position Next ;
}

測試是否為空表

int IsEmpty(List L)
{
return L->Next == NULL ;
}

測試是否為鏈表末尾

int IsLast(List L, Position P)
{
return P->Next == NULL ;
}

Find函數,尋找元素

Position Find(List L,Element X)
{ 
Position P ;
P = L->Next ;
while(P->Element X != X && P != NULL)
P = P->Next ;

return P ;
}

//FindPrevious函數
Position FindPrevios(List L, Element X)
{
Position P ;
P = L ;
while(P->Next->Element != X && P->Next != NULL)
P = P->Next ;

return P ;
}

Delete函數,刪除元素

void Delete(Element X, List L)
{
Position P ,TmpCell;
P = FindPrevious(L, X) ;
if(!IsLast(P,L)
{
TmpCell = P->Next ;
P->Next = TmpCell->Next ;
free(TmpCell) ;
}
}

Insert函數,插入元素

void Insert(Element X, List L, Position P)
{
Position TemCell ;
TemCell = malloc(sizeof(struct Node)) ;
if(TemCell = NULL)
{
printf("內存不足") ;
}
TmpCell->Element = X ;
TmpCell->Next = P->Next ;
P->Next = TmpCell ;
}

DeleteList函數,刪除表

void DeleteList(List L)
{
Position P ,Tmp ;
P = L->Next ;
while(P != NULL)
{
Tmp = P->Next ;
free(P) ;
P = Tmp ;
}
}

雙鏈表

  • 在結點結構中增加一個指向前一個結點的指針
  • 簡化了刪除操作,插入和刪除的開銷增加一倍

循環鏈表

  • 在雙鏈表的基礎上增加一個表尾指向表頭和表頭指向表尾的指針

十字鏈表

  • 可用數組實現,但浪費空間效率低下
  • 鏈表實現:每行每列都有一個表頭指向該行該列

鏈表的游標實現

許多語言,如Java,並不支持指針,就可以游標(cursor)實現法

設計思路

  1. 全局結構體數組模擬指針法,對於數組的任何單元,其數組下標來代表一個地址
  2. 使用一個數組來模擬malloc和free
  3. 數組0管理着鏈表的空閑內存

類型聲明

typedef int PtrToNode ;
typedef PtrToNode List ;
typedef PtrToNode Position ;

//L為表頭
//初始化
void InitializeCursorSpace(void)

//操作函數聲明
List MakeEmpty(List L) ;
int IsEmpty(List L) ;
int IsLast(Position P, List L) ;
Positiom Find(ElementType X, List L) ;
void Delete(ElementType X, List L) ;
Position FindPrevios(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 Retrieve(Position P) ;

struct Node
{
ElemenType Element ;
Position Next ;
}

struct Node CursorSpace[Spacesize] ;

游標法中的malloc和free函數

Position CursorAlloc(void)
{
Position P ;
P = CursorSpace[0].Next ;
CursorSpace[0].Next = CursorSpace[P].Next ;

return P ;
}

void CursorFree(Position P)
{
CursorSpace[P].Next = CursorSpace[0].Next ;
CursorSpace[0].Next = P ;
}

初始化

void InitializeCursorSpace(Void)
{
int i ;
for(i = 0;i < SpaceSize; i++)
{
CursorSpace[i].Next = i + 1; 
}
CursorSpace[i] = 0 ;
}

判斷鏈表是否為空和是否為末尾

int IsEmpty(List L) //L為表頭,CursorSpace數組為全局變量
{
return CursorSpace[L].Next == 0 ;
}

int IsLast(Position P)
{
return CursorSpace[P].Next == 0;
}

Find函數 //游標實現

Position Find(Element X,List L)
{
Position P ;
P = CursorSpace[L].Next ;
while(P && CursorSpace[P] != X)
P = CursorSpace[P].Next ;

return P ;
}

Delete函數 //游標實現

void Delete(ElementType X, List L)
{
Position P, TmpCell ;
P = FindPrevious(X,L) ;
if(!IsLast(P))
{
TmpCell = CursorSpace[P].Next ;
CursorSpace[P].Next = CursorSpace[TmpCell].Next ;
CursorFree(TmpCell) ;
}
}

Insert函數 //游標實現

void Insert(Element X, List L, Position P)
{
Position TmpCell ;
TmpCell = CursorAlloc() ;
if(TmpCell == 0)
{
printf("鏈表數組空間不足") ;
}
CursorCell[TmpCell].Element = X ;
CursorCell[TmpCell].Next = CursorSpace[P].Next ;
CursorSpace[P].Next = TmpCell ;
}

總結

  • 表就是一種順序結構
  • 支持查找刪除插入等操作
  • 主要有兩種常見的實現方法
  1. 指針法
  2. 游標法
  • 有最基本的鏈表,還有雙鏈表,循環鏈表,十字鏈表。比較特殊的有棧和隊列。(下一篇)
  • 應用:
  1. 多項式計算 //鏈表
  2. 學生選課系統 //十字鏈表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM