C語言單鏈表--增刪查
阿新 • • 發佈:2018-12-18
廢話不多說直接看程式碼內建詳細註釋
//結點結構
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;
}