用陣列來代替指標,來描述單鏈表
將陣列元素分成兩個資料域,data和cur。data用來存放資料元素,cur存放該元素的後繼在陣列中的下標(游標)。《游標實現法》
在靜態鍊錶中,我們將陣列的第乙個和最後乙個元素作為特殊元素處理,不存放資料。/*線性表的靜態鍊錶儲存結構*/
#define maxsize 1000
typedef struct
component,staticlinklist[maxsize];
此外,將未被使用的陣列元素稱為備用鍊錶。
而陣列的第乙個元素,即下標為0的元素的cur就存放備用鍊錶的第乙個結點的下標。
而陣列的最後乙個元素的cur則存放第乙個有數值元素的下標,相當於鍊錶的頭結點作用。
靜態鍊錶中存放的是陣列,不存在動態鍊錶中結點的申請與釋放函式malloc()和free()。/*將一維陣列space中各分量鏈成一備用鍊錶*/
/*space[0].cur為頭指標*/
status initlist(staticlinklist space)
int i;
for(i=0;i1;i++)
space[i].cur = i+1;
space[maxsize-1].cur = 0; /*目前靜態鍊錶為空,最後乙個元素的cur為0*/
return ok;
為了辨明陣列中哪些分量未被使用,解決的辦法是將所有未被使用過的及已被刪除的分量用游標鏈成乙個備用的鍊錶。每當進行插入時,便可以從備用鍊錶上取得第乙個結點作為待插入的新結點。
實現:在l中第i個元素之前插入新元素e現在我們需要在『乙』和『丁』之間,插入乙個新元素『丙』。怎麼實現呢?/*若備用鍊錶非空,返回分配的結點的下標,否則返回0*/
int malloc_sll(staticlinklist space)
我們只需要將『丙』放入備用鍊錶的第乙個空位置,也就是下標為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)
return error;
}
具體刪除操作:/*將下標為k的空閒結點**到備用鍊錶*/
void free_ssl(staticlinklist space, int k)
j=l[999].cur=1;/*刪除l中第i個資料元素e*/
status listdelete(statuslinklist l,int i)
l[999].cur=l[1].cur=2.
這其實就是告訴計算機『甲』已經離開了,『乙』才是第乙個元素。
優點:
* 在插入和刪除操作時只需修改游標,不需要移動元素。從而改進了在順序儲存結構中的插入和刪除;操作需要移動大量元素的缺點。
缺點:
* 沒有解決連續儲存分配帶來的表長難度以確定的問題;
* 失去了順序儲存結構隨機訪問的特性。
靜態鍊錶的實現
include include define size 6 define struct of static list typedef struct stlist stlist 初始化靜態鍊錶分配空間大小為size個 stlist initlist stlist tempptr of for i in...
靜態鍊錶的實現
2018 8 23 21 35 靜態鍊錶的實現 陣列中第乙個結點表示備用鍊錶的第乙個結點 陣列中最後乙個結點表示鍊錶的第乙個結點 當next域為0時均代表到了當前鍊錶的結尾,因此有兩個陣列單元 0與max 1 無法儲存目標資料 include define max 10 此時靜態鍊錶中只能儲存8個元...
靜態鍊錶實現
1 include stdio.h 2 struct nodelist 100 space 100 6 int listlen 0 7 void init 813 int free int p 14 18int malloc 1925 void add int p,int val 26 31int ...