1. 程式人生 > >線性表-靜態連結串列

線性表-靜態連結串列

靜態連結串列

用陣列來代替指標,來描述單鏈表

將陣列元素分成兩個資料域,data和cur。data用來存放資料元素,cur存放該元素的後繼在陣列中的下標(遊標)。<遊標實現法>

1.基本結構

/*線性表的靜態連結串列儲存結構*/
#define MAXSIZE 1000
typedef struct
{
	ElemType data;
	int cur; /*遊標(Cursor),為0時表示無指向*/
}Component,StaticLinkList[MAXSIZE];

在靜態連結串列中,我們將陣列的第一個和最後一個元素作為特殊元素處理,不存放資料。

此外,將未被使用的陣列元素稱為備用連結串列。

而陣列的第一個元素,即下標為0的元素的cur就存放備用連結串列的第一個結點的下標

陣列的最後一個元素的cur則存放第一個有數值元素的下標,相當於連結串列的頭結點作用

在這裡插入圖片描述 2.初始化

/*將一維陣列space中各分量鏈成一備用連結串列*/
/*space[0].cur為頭指標*/
Status InitList(StaticLinkList space)
{
	int i;
	for(i=0;i<MAXSIZE-1;i++)
	    space[i].cur = i+1;
	space[MAXSIZE-1].cur = 0;  /*目前靜態連結串列為空,最後一個元素的cur為0*/
	return OK;
}

3.靜態連結串列記憶體分配

靜態連結串列中存放的是陣列,不存在動態連結串列中結點的申請與釋放函式malloc()和free()。

為了辨明陣列中哪些分量未被使用,解決的辦法是將所有未被使用過的及已被刪除的分量用遊標鏈成一個備用的連結串列。每當進行插入時,便可以從備用連結串列上取得第一個結點作為待插入的新結點。

/*若備用連結串列非空,返回分配的結點的下標,否則返回0*/
int Malloc_SLL(StaticLinkList space)
{
	int i = space[0].cur;  /*返回備用連結串列的第一個結點的下標*/
	if(space[0].cur)
	    space[0].
cur = space[i].cur; /*由於使用了一個元素,我們將它的後繼連結元素作為備用連結串列的頭*/ return i; }

4.靜態連結串列的插入 在這裡插入圖片描述

實現:在L中第i個元素之前插入新元素e

現在我們需要在‘乙’和‘丁’之間,插入一個新元素‘丙’。怎麼實現呢? 我們只需要將‘丙’放入備用連結串列的第一個空位置,也就是下標為7的位置。 另外將‘乙’的遊標改為7,‘丙’的遊標改為3。 這樣實現了不移動元素,完成了插入的動作。

這裡寫圖片描述

/*在L中第i個元素之前插入新元素e*/
Status ListInsert(StaticLinkList L, int i, ElemType e)int j, k ,l;
	k = MAX_SIZE -1;  /*獲取陣列最後一個位置下標*/
	if(i<1 || i>ListLength(L)+1)
	    return ERROR;
	j = Malloc_SSL(L);  /*獲取備用連結串列第一個位置的下標*/
	if(j)
    {
	    L[j].data = e;  /*將數值賦給資料域data*/
	    for(l=1;l<=i-1;l++)
	        k = L[k].cur  /*獲取第i個元素之前位置的下標*/
	    L[j].cur = L[k].cur;
	    L[k].cur = j;  /*cur值之間的重新連結*/
	    return OK;
    }
	return ERROR;

5.靜態連結串列的刪除操作 與記憶體分配相對應的有記憶體回收。 即將空閒結點回收到備用連結串列中。

/*將下標為k的空閒結點回收到備用連結串列*/
void Free_SSL(StaticLinkList space, int k)
{
	space[k].cur=space[0].cur /*把原來第一個元素遊標值賦給要刪除的分量cur*/
	space[0].cur = k; /*把要刪除的下標值賦給第一個預算的cur*/
}

具體刪除操作:

/*刪除L中第i個數據元素e*/
Status ListDelete(StatusLinkLiST L,int i)
{
	int j,k;
	if(i<1 || i>ListLength(L))
	    return ERROR;
	k = MAX_SIZE - 1;
	for(j =1;j<=i-1;j++)
	    k = L[k].cur;
	j = L[k].cur;
	L[k].cur = L[j].cur;
	Free_SSL(L,j);
	return OK;
}

j=L[999].cur=1; L[999].cur=L[1].cur=2. 這其實就是告訴計算機‘甲’已經離開了,‘乙’才是第一個元素。

總結

優點:

  • 在插入和刪除操作時只需修改遊標,不需要移動元素。從而改進了在順序儲存結構中的插入和刪除;操作需要移動大量元素的缺點。

缺點:

  • 沒有解決連續儲存分配帶來的表長難度以確定的問題;
  • 失去了順序儲存結構隨機存取的特性。