2 8靜態鍊錶基本操作(C語言實現)

2021-09-05 13:07:02 字數 4402 閱讀 7186

上節,我們初步建立了乙個靜態鍊錶

,本節學習有關靜態鍊錶

的一些基本操作,包括對錶中資料元素的新增、刪除、查詢和更改。

本節是建立在已能成功建立靜態鍊錶的基礎上,因此我們繼續使用上節中已建立好的靜態鍊錶學習本節內容,建立好的靜態鍊錶如圖 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

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.迴圈 非迴圈 帶頭雙向迴圈鍊錶 結構最複雜,一般用在單獨儲存資料。實際中使用的鍊錶資料結構,都是帶頭...