1. 程式人生 > >C語言單鏈表--增刪查

C語言單鏈表--增刪查

廢話不多說直接看程式碼內建詳細註釋

//結點結構
typedef struct node {

	int data;//結點資料域
	struct node * next;//結點指標域(儲存著下一個結點所在的地址也就是位置,即指向下一個結點)

}NODE,*LinkList;//起別名,一個正常別名,一個指標別名
//單鏈表查詢演算法
LinkList Find_List(LinkList L, int k){//返回查詢到的資料的地址
	LinkList p;//輔助指標
	int i;//計數(也是判斷迴圈結束臨界值,與k值進行比較)
	i = 1;//初始化
	p = L->next;//指向第一個結點
	while
(p && i < k){//判斷是否存在,也就是p是否不為空(NULL),且i的值是否小與k,是迴圈繼續(查詢) p = p->next;//指向下一個結點 i++;//當前所指向的結點的位置(第幾個結點) } if (p && i == k){//當while迴圈結束時,若是p不為空,則說明所查詢字元存在。 return p;//返回該元素地址 } return NULL;//否則查詢元素不存在 } //單鏈表插入演算法 int Insert_List(LinkList L, int k, int elem){//通過返回值判斷插入成功還是失敗,插入需要位置和值
LinkList p, s; //定址 if (k == 1){//若將要插入的位置時第一個結點 p = L;//將頭指標的位置(地址)賦給p } else{ p = Find_List(L, k - 1);//否則找到帶插入位置的前一個結點的地址 } if (!p){//若結點不存在也就是p為空 return -1;//插入失敗 } //新建結點 s = (NODE*)malloc(sizeof(NODE));//在堆區新建一塊記憶體,並把該記憶體地址丟給s結點(s指向新建堆區記憶體) if (!s){//若分配地址失敗 return -1;//插入失敗 } s->data = elem;
//資料域賦值 //建立新連結 s->next = p->next;//新建結點的指標域存放原來k位置的元素的地址(指向當前k+1位置的元素) p->next = s;//原來k-1位置的指標域存放新建結點的地址(指向新建結點) //成功接軌 return 0; } //刪除結點 int Delete_List(LinkList L, int k){//從連結串列指定位置刪除結點 LinkList p, s;// //定址 if (k==1){//假若是第一個結點,則返回頭結點的地址 p = L; } else { p = Find_List(L, k - 1); } if (!p || !p->next){ return -1; } s = p->next; // 獲取要刪除結點的地址 p -> next = s->next;//重新指向(重新銜接連結串列結點) free(s);//釋放記憶體 return 0; }