靜態鏈表的實現

原文鏈接

靜態鏈表

在沒有指針或對象引用機制的編程語言中,鏈表結構也可以用數組來描述,這種用數組描述的鏈表就叫“靜態鏈表”,也叫“遊標實現法”。
結構說明如下圖(圖是盜的,莫怪):

結構和基本操作

接下來就用C語言來描述靜態鏈表的結構和基本操作:

頭文件 StaticLinkList.h
#ifndef STATICLINKLIST_H  
#define STATICLINKLIST_H  

/*定義狀態碼*/  
#define ERROR -1  
#define TRUE 1  
#define FALSE 0  
typedef int Status;  

/*定義結構體*/  
#define MAXSIZE 5  
typedef int ElemType;  
typedef struct  
{  
    ElemType data;  
    int cur;  
}Node , StaticLinkList[MAXSIZE];  

/*函數原型說明*/  
void InitList(StaticLinkList list);  
int GetListLength(StaticLinkList list);  
int Malloc_SSL(StaticLinkList list);  
void Free_SLL(StaticLinkList list , int i);  
Status InsertList(StaticLinkList list , int i , ElemType e);  
Status DeleteList(StaticLinkList list , int i);  
void Print(StaticLinkList list);  

#endif  
靜態鏈表基本操作的實現:
#include "StaticLinkList.h"  
#include<stdio.h>  

/*初始化靜態數組*/  
void InitList(StaticLinkList list)  
{  
    int i;  
    for(i=0 ; i < MAXSIZE - 1 ; i++)  
    {  
        list[i].cur=i+1;  
    }  
    list[MAXSIZE-1].cur=0;  
}  

/*返回靜態鏈表中數據元素的個數*/  
int GetListLength (StaticLinkList list)  
{  
    int count = 0;  
    int cur = list[MAXSIZE - 1].cur;  

    while(cur)  
    {  
        cur = list[cur].cur;  
        count++;  
    }  

    return count;  
}  

/*返回備用數組下標,無備用空間則返回0*/  
int Malloc_SLL(StaticLinkList list)  
{  
    int i = list[0].cur;  
    if (i)  
    {  
        if ((GetListLength(list) + 1) >= MAXSIZE - 2)   
        {  
            list[0].cur = 0;  
        }  
        else  
        {  
            list[0].cur = list[i].cur;  
        }  
    }  
    return i;  
}  

/*將下標爲 i 的節點回收到備用鏈表*/  
void Free_SLL (StaticLinkList list , int i)  
{  
    list[i].cur = list[0].cur;  
    list[0].cur = i;  
}  

/*靜態鏈表的插入操作*/  
Status InsertList (StaticLinkList list , int i , ElemType e)  
{  
    int j , k;  

    if (i < 1 || i > GetListLength(list)+1)   
    {  
        return ERROR;  
    }  

    j = Malloc_SLL(list);  
    k = MAXSIZE - 1;  
    if (j)  
    {  
        int l;  
        for(l = 0 ; l < i - 1 ; l++)  
        {  
            k = list[k].cur;  
        }  
        list[j].data = e;  
        list[j].cur = list[k].cur;  
        list[k].cur = j;  
        return TRUE;  
    }  
    return FALSE;  
}  

/*靜態鏈表的刪除操作*/  
Status DeleteList(StaticLinkList list , int i)  
{  
    int j , k , l;  

    if(i < 1 || i > GetListLength(list))  
    {  
        return ERROR;  
    }  

    k = MAXSIZE - 1;  
    for(l = 0 ; l < i - 1 ; l++)  
    {  
        k = list[k].cur;  
    }  
    j = list[k].cur;  
    list[k].cur = list[j].cur;  
    Free_SLL(list , j);  
        return TRUE;  
    }  

    void Print(StaticLinkList list)  
    {  
        int k = MAXSIZE - 1;  
        int j = 0;  
        while(list[k].cur)  
        {  
        j = list[k].cur;  
        printf("%d\n" , list[j].data);  
        k = j;  
    }  
}  
main函數,簡單測試:
#include "StaticLinkList.h"  
#include<stdio.h>  
int main ()   
{  
    int status;  
    StaticLinkList list;  
    InitList(list);  
    status = InsertList(list , 1 , 1);  
    status = InsertList(list , 2 , 2);  
    status = InsertList(list , 3 , 3);  
    status = DeleteList(list , 2);  
    Print(list);  
}  

結束 :)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章