上節,我們初步建立了乙個靜態鍊錶
,本節學習有關靜態鍊錶
的一些基本操作,包括對錶中資料元素的新增、刪除、查詢和更改。
本節是建立在已能成功建立靜態鍊錶的基礎上,因此我們繼續使用上節中已建立好的靜態鍊錶學習本節內容,建立好的靜態鍊錶如圖 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的結點,資料域改為newelemvoid 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
C語言實現鍊錶基本操作
之前說過順序表的基本操作。顯然,順序表有乙個很大的缺點,就是做插入刪除操作的時候,往往要做很大量的元素移動的操作。這裡我們討論另外一種線性表的表示方法 鏈式儲存結構。由於它不需要邏輯上的相鄰的元素在物理位置上也相鄰,因此它沒有順序儲存結構所具有的弱點,但是同時也失去了順序表的可隨機訪問的有點。inc...
鍊錶的基本操作(C語言實現
鍊錶的基本操作 c語言實現 include include define ok 1 define error 0 typedef int elemtype typedef int status typedef struct lnodelnode,linklist status initlist l ...
鍊錶概念,以及基本操作C語言實現
鍊錶是一種物理儲存結構上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 實際中煉表的結構非常多樣,以下情況組合起來就有8種鍊錶結構 1.單向 雙向 2.帶頭 不帶頭 3.迴圈 非迴圈 帶頭雙向迴圈鍊錶 結構最複雜,一般用在單獨儲存資料。實際中使用的鍊錶資料結構,都是帶頭...