1. 程式人生 > >資料結構筆記(三)靜態連結串列的實現和基本操作

資料結構筆記(三)靜態連結串列的實現和基本操作

一、靜態連結串列的定義

用資料替代指標,來描述單鏈表。首先,資料的元素由兩個資料域組成,data和cur。資料域data,用來存放資料元素,即要處理的資料;遊標cur相當於單鏈表中的next指標。

//線性表的靜態單鏈表儲存結構
#define MAXSIZE 1000
typedef struct{
    ElemType data;
    int cur;
}component,SLinkList[MAXSIZE];

此外,我們對資料第一個和最後一個元素作為特殊元素處理,不存資料。把未被使用的陣列元素稱為備用連結串列。而陣列第一個元素,即下標為0的元素的cur就存放備用連結串列的第一個結點的下標;而陣列的最後一個元素的cur則存放第一個數值的元素的下標,相當於單鏈表中頭結點。
這裡寫圖片描述



上圖為初始化的陣列狀態,下面是程式碼:

Status InitSpace_SL(SLinkList &space){
    //將一組陣列space中各分量鏈成一個備用連結串列,space[0].cur為頭指標,
    //“0”表示空指標
    int i;
    for(i=0;i<MAXSIZE-1;i++){
        space[i].cur=i+1;
    }
    space[MAXSIZE-1].cur=0;
    return  OK;
}


假設已經將資料存入靜態連結串列,如下:
這裡寫圖片描述

此時,“甲”這裡就存有下一元素“乙”的遊標2,“乙”則存有下一元素“丁”的下標3。而“己”是最後一個有值元素,所以它的cur設定為0。而最後一個元素的cur則因“甲”是第一個有值元素而存有它的下標為1。而第一個元素則因空閒空間的第一各元素下標為7,所以它的cur存有7.

二、靜態連結串列的插入操作

1、首先要重寫malloc函式

int Malloc_SL(SLinkList &space){//若備用空間連結串列非空,則返回分配的結點下標,否則返回0.
    int i=space[0].cur;//當前陣列第一個元素的cur存的值
    if(space[0].cur){
        space[0].cur=space[i].cur;
    }
    return i;
//在L中第i個元素之前插入新的資料元素e
Status ListInsert(SLinkList &L,int i,ElemType e){
    int
i,k,l; k=MAXSIZE-1;//注意k首先是最後一個元素的下標 if(i<1||i>ListLength(L)+1){ return ERROR; } j=Malloc_SL(L);//獲得空閒分量的下標 if(j) { L[j].data=e;//將資料賦值給此分量的data for(l=1;l<=i-1;l++){//找到第i個元素之前的位置 k=L[k].cur; } L[j].cur=L[k].cur;//把第i個元素之前的cur賦值給新元素的cur L[k].cur=j;//把新元素的下標賦值給第i個元素之前元素的cur return OK; } return ERROR; }

ListLength函式程式碼見最後

三、靜態連結串列的刪除操作

1、首先重寫free函式

//將下標為k的空閒結點回收到備用連結串列
void Free_SL(SLinkList &space,int k){
    space[k].cur=space[0].cur;//把第一個元素cur賦值給要刪除的分量cur
    space[0].cur=k;//把要刪除的分量下標賦值給第一個元素的cur
}
//刪除在L中第i個數據元素e
Status ListDelete(SLinkList &L,int i){
    int j,k;
    if(i<1||i>ListLength(L)){
        return ERROR;
    }
    k=MAXSIZE-1;
    for(j=1;j<=i-1;j++){
        k=L[k].cur;
    }
    j=L[k].cur;
    L[k].cur=L[j].cur;
    Free_SL(L,j);
    return OK;
}
//初始化條件:靜態連結串列L已經存在。操作結果:返回L中資料元素個數
int ListLength(SLinkList L){
    int j=0;
    int i=L[MAXSIZE-1].cur;
    while(i){
        i=L[i].cur;
        j++;
    }
    return j;
}