上節,我們初步建立了乙個靜態鍊錶,本節學習有關靜態鍊錶的一些基本操作,包括對錶中資料元素的新增、刪除、查詢和更改。
本節是建立在已能成功建立靜態鍊錶的基礎上,因此我們繼續使用上節中已建立好的靜態鍊錶學習本節內容,建立好的靜態鍊錶如圖 1 所示:
圖 1 建立好的靜態鍊錶
例如,在圖 1 的基礎,將元素 4 新增到靜態鍊錶中的第 3 個位置上,實現過程如下:
從備用鍊錶中摘除乙個節點,用於儲存元素 4;
找到表中第 2 個節點(新增位置的前乙個節點,這裡是資料元素 2),將元素 2 的游標賦值給新元素 4;
將元素 4 所在陣列中的下標賦值給元素 2 的游標;
經過以上幾步操作,資料元素 4 就成功地新增到了靜態鍊錶中,此時新的靜態鍊錶如圖 2 所示:
圖 2 新增元素 4 的靜態鍊錶
//向鍊錶中插入資料,body表示鍊錶的頭結點在陣列中的位置,add表示插入元素的位置,a表示要插入的資料
void insertarr(component * array,int body,int add,char a)
int insert=mallocarr(array);//申請空間,準備插入
array[insert].data=a;
array[insert].cur=array[tempbody].cur;//新插入結點的游標等於其直接前驅結點的游標
array[tempbody].cur=insert;//直接前驅結點的游標等於新插入結點所在陣列中的下標
}靜態鍊錶中刪除指定元素,只需實現以下 2 步操作:
將存有目標元素的節點從資料鏈表中摘除;
將摘除節點新增到備用鍊錶,以便下次再用;
實現該操作的 c 語言**為:
//備用鍊錶**空間的函式,其中array為儲存資料的陣列,k表示未使用節點所在陣列的下標
void freearr(component * array,int k)
//刪除結點函式,a 表示被刪除結點中資料域存放的資料
void deletarr(component * array,int body,char a)
}//執行到此,證明有該結點
int del=tempbody;
tempbody=body;
//找到該結點的上乙個結點,做刪除操作
while (array[tempbody].cur!=del)
//將被刪除結點的游標直接給被刪除結點的上乙個結點
array[tempbody].cur=array[del].cur;
//**被摘除節點的空間
freearr(array, del);
}靜態鍊錶查詢指定元素,由於我們只知道靜態鍊錶第乙個元素所在陣列中的位置,因此只能通過逐個遍歷靜態鍊錶的方式,查詢存有指定資料元素的節點。
靜態鍊錶查詢指定資料元素的 c 語言實現**如下:
//在以body作為頭結點的鍊錶中查詢資料域為elem的結點在陣列中的位置
int selectelem(component * array,int body,char elem)
tempbody=array[tempbody].cur;
}return -1;//返回-1,表示在鍊錶中沒有找到該元素
}更改靜態鍊錶中的資料,只需找到目標元素所在的節點,直接更改節點中的資料域即可。
實現此操作的 c 語言**如下:
//在以body作為頭結點的鍊錶中將資料域為oldelem的結點,資料域改為newelem
void amendelem(component * array,int body,char oldelem,char newelem)
array[add].data=newelem;
}這裡給出以上對靜態鍊錶做 "增刪查改" 操作的完整實現**:
#include
#define maxsize 7
typedef struct component;
//將結構體陣列中所有分量鏈結到備用鍊錶中
void reservearr(component*array);
//初始化靜態鍊錶
int initarr(component*array);
//向鍊錶中插入資料,body表示鍊錶的頭結點在陣列中的位置,add表示插入元素的位置,a表示要插入的資料
void insertarr(component * array,int body,int add,char a);
//刪除鍊錶中含有字元a的結點
void deletarr(component * array,int body,char a);
//查詢儲存有字元elem的結點在陣列的位置
int selectelem(component * array,int body,char elem);
//將鍊錶中的字元oldelem改為newelem
void amendelem(component * array,int body,char oldelem,char newelem);
//輸出函式
void displayarr(component * array,int body);
//從備用鍊錶中摘除空閒節點的實現函式
int mallocarr(component * array);
//將摘除下來的節點鏈結到備用鍊錶上
void freearr(component * array,int k);
int main()
//建立備用鍊錶
void reservearr(component*array)
array[maxsize-1].cur=0;//鍊錶最後乙個結點的游標值為0
}//初始化靜態鍊錶
int initarr(component*array)
array[tempbody].cur=0;//新的鍊錶最後乙個結點的指標設定為0
return body;
}void insertarr(component * array,int body,int add,char a)
int insert=mallocarr(array);
array[insert].cur=array[tempbody].cur;
array[insert].data=a;
array[tempbody].cur=insert;
}void deletarr(component * array,int body,char a)
}//執行到此,證明有該結點
int del=tempbody;
tempbody=body;
//找到該結點的上乙個結點,做刪除操作
while (array[tempbody].cur!=del)
//將被刪除結點的游標直接給被刪除結點的上乙個結點
array[tempbody].cur=array[del].cur;
freearr(array, del);
}int selectelem(component * array,int body,char elem)
tempbody=array[tempbody].cur;
}return -1;//返回-1,表示在鍊錶中沒有找到該元素
}void amendelem(component * array,int body,char oldelem,char newelem)
array[add].data=newelem;
}void displayarr(component * array,int body)
printf("%c,%d\n",array[tempbody].data,array[tempbody].cur);
}//提取分配空間
int mallocarr(component * array)
return i;
}//將摘除下來的節點鏈結到備用鍊錶上
void freearr(component * array,int k)
程式執行結果為:
靜態鍊錶為:
,2 a,3 b,4 c,5 d,0
在第3的位置上插入結點『e』:
,2 a,3 b,6 e,4 c,5 d,0
刪除資料域為『a』的結點:
,3 b,6 e,4 c,5 d,0
查詢資料域為『e』的結點的位置:
6將結點資料域為『e』改為『h』:
,3 b,6 h,4 c,5 d,0
靜態鍊錶的基本操作
靜態鍊錶的基本操作包括建立與輸出,刪除與插入操作與單鏈表類似,麻煩的點在於每次遍歷都要建立兩個臨時變數,還要特殊判斷第乙個節點,並將刪除後的節點再次初始化其游標的值,就不寫了 include include typedef struct node node define maxsize 1000 t...
靜態鍊錶的建立以及基本操作
include include define max 100 typedef int elemtype 定義每個節點的資料資訊 typedef struct node slnode 靜態鍊錶的定義 typedef struct static list sqlist int main 提示鍊錶的狀態。...
靜態鍊錶的理解及基本操作
某些高階語言裡面並沒有指標,只有陣列,靜態鍊錶就是利用陣列來實現類似鍊錶的操作 1.要分配足夠大的記憶體,用來存放變數,記憶體大小記為maxsize 2.記憶體不僅要存放資料,而且要存放 指標 把它稱為游標,滿足這一條件的變數型別是結構體,其定義如下 typedef structcomponent,...