對於一些語言,如basic、fortran等早期的程式設計高階語言,由於沒有指標,鍊錶結構按照其他高階語言指標的**,它就沒法實現了。怎麼辦呢?
有人就想出來用陣列代替指標,來描述單鏈表。
首先我們讓陣列的元素都是由兩個資料域組成,data和cur。也就是說,陣列的每個下標都對應乙個data和乙個cur。資料域data,用來存放資料元素,也就是通常我們要處理的資料,而cur相當於單鏈表的next指標,存放該元素的後繼在陣列中的下標,我們把cur叫做游標。
我們把這種用陣列描述的鍊錶叫做靜態鍊錶,這種描述方法還有起名叫做游標實現法。
為了我們方便插入資料,我們通常會把陣列建立得大一些,以便有一些空閒空間可以便於插入時不至於溢位。
/*線性表的靜態鍊錶儲存結構*/
#define maxsize 1000
/*線性表的最大長度是1000*/
typedef
struct
component,staticlinklist[maxsize]
;
另外我們對陣列第乙個和最後乙個元素作為特殊元素處理,不存資料。我們通常把未被使用的陣列元素稱為備用鍊錶。而陣列的第乙個元素,即下標為0的元素的cur就存放備用鍊錶的第乙個結點的下標;而陣列的最後乙個元素的cur則方寸第乙個有數值的元素的下標,相當於單鏈表中的頭結點作用。
初始化靜態鍊錶**:
/*將一維陣列space中各分量鏈成一備用鍊錶*/
/*space[0].cur為頭指標,"0"表示空指標*/
status initlist
(staticlinklist space)
靜態鍊錶中要解決的是:如何用靜態模擬動態鍊錶結構的儲存空間的分配,需要時申請,無用時釋放。
在動態鍊錶中,結點的申請和釋放分別借用malloc()和free()兩個函式來實現。在靜態鍊錶中,操作的是陣列,不存在像動態鍊錶的結點申請和釋放問題,所以我們需要自己實現這兩個函式,才可以做插入和刪除的操作。
為了辨明陣列中安歇分量未被使用,解決的辦法是將所有未被使用過的及已被刪除的分量用游標鏈成乙個備用的鍊錶,每當進行插入時,便可以從備用鍊錶上取得第乙個結點作為待插入的新結點。
/*若備用空間鍊錶非空,則返回分配的結點下標,否則返回0*/
intmalloc_sll
(staticlinklist space)
return i;
}
這段**有意思,一方面它的作用就是返回乙個下標值——陣列頭元素的cur存的第乙個空閒的下標。(假設為7)
那麼既然下標為7的分量準備要使用了,就得有接替者,所以就把分量7的cur值賦給頭元素,也就是把8賦給space[0].cur,之後就可以繼續分配新的空閒分量,實現類似malloc()函式的作用。-
現在我們如果需要在"乙"和"丁"之間,插入乙個值為"丙"的元素,按照以前順序儲存結構的做法,應該要把"丁"之後的這些元素都往後移位。但目前不需要,因為我們有了新的手段。
新元素"丙"先在隊伍最後(第乙個空閒位置,假設下標為7)待著,接著,將"乙"的cur游標由之前的3"丁"修改為7。這時再將"丙"的cur改為3。就這樣,在絕大多數人都不知道的情況下,整個排隊的次序發生了改變。
實現**如下:
/*在l中第i個元素之前插入新的資料元素e*/
status linklist
(staticlinklist l,
int i,elemtype e)
j =malloc_ssl
(l);
/*獲取空閒分量的下標*/
if(j)
l[j]
.cur = l[k]
.cur;
l[k]
.cur = j;
return ok;
}return error;
}
就這樣,我們實現了在陣列中,不移動元素,卻插入了資料的操作。
和前面一樣,刪除元素時,原來是需要釋放結點的函式free()。現在我們也得自己實現它:
void
free_ssl
(staticlinklist space,
int k)
這段**其實就是讓這個刪除的位置成為第乙個優先空位,把它存入第乙個元素的cur中。
/*刪除在l中第i個資料元素e*/
status listdelete
(staticlinklist l,
int i)
k = maxsize -1;
for(j =
1;j <= i-
1; j++
) j = l[k]
.cur;
l[k]
.cur = l[j]
.cur;
free_ssl
(l, j)
;return ok;
}
有了剛才的基礎,這段**就很容易理解了。先通過for迴圈找到刪除的位置(k是刪除位置的前一位的下標),之後通過free_ssl()釋放結點。
/*初始條件:靜態鍊錶l已存在。*/
/*操作結果:返回l中資料元素的個數*/
intlistlength
(staticlinklist l)
return j;
}
另外一些操作和線性表的基本操作相同,實現上也不複雜,就不一一贅述了。
總結一下靜態鍊錶的優缺點:
優點
缺點
總的來說,靜態鍊錶其實是為了給沒有指標的高階語言設計的一種實現單鏈表能力的方法。儘管大家不一定會用得上,但這樣的思考方式是非常巧妙的, 應該理解其思想,以備不時之需。
oracle 表空間知多少
一 檢視表空間 1.檢視所有表空間大小 sql select tablespace name,sum bytes 1024 1024 from dba data files 2 group by tablespace name 2.已經使用的表空間大小 sql select tablespace n...
閘道器知多少
閘道器 gateway 顧名思義,就是乙個網路到另乙個網路的關口。維基百科對閘道器的定義為 在計算機網路中,閘道器 gateway 是 其他伺服器通訊資料的伺服器,接收從客戶端傳送來的請求時,它就像自己擁有資源的源伺服器一樣對請求進行處理。但是,很多時候,我們會將路由器和閘道器認為是同乙個概念。其實...
原型知多少
除了undefind,number,string,boolean是簡單的值型別,其他的null,object,function都是物件 函式有prototype屬性,它是物件,是函式屬性和方法的集合 每個物件都有乙個 proto 屬性 隱式原型 它指向建立這個物件的函式的原型 函式也是一種物件 ob...