單鏈表第i個(gè)數(shù)據(jù)刪除結(jié)點(diǎn)的算法思路
- 聲明一指針p指向鏈表頭指針,初始化j從1開(kāi)始;
- 當(dāng)j<i時(shí),就遍歷鏈表,讓p的指針向后移動(dòng),不斷指向下一個(gè)結(jié)點(diǎn),j累加1;
- 若鏈表末尾p為空,則說(shuō)明第i個(gè)元素不存在;
- 否則查找成功,將欲刪除的結(jié)點(diǎn)p->next 賦值給q;
- 單鏈表的刪除標(biāo)準(zhǔn)語(yǔ)句p->next=q->next;
- 將q結(jié)點(diǎn)中的數(shù)據(jù)賦值給e,作為返回;
- 釋放q結(jié)點(diǎn);
- 返回成功。
實(shí)現(xiàn)代碼算法如下:
/* 初始條件:順序線性表L已存在,1<=i<=ListLength(L) */
/* 操作結(jié)果:刪除L的第i個(gè)數(shù)據(jù)元素, */
Status ListDelete(LinkList *L, int i, ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
// 尋找遍歷第i個(gè)元素并將p的next指向p,直到找到i為止
while (p->next && j < 1) {
p = p->next;
++j;
}
// 如果第i個(gè)元素不存在,報(bào)錯(cuò)
if (!(p->next) || j > i)
{
return ERROR;
}
q = p->next;
// 將q的后繼賦值給p的后繼
p->next = q->next;
// 因?yàn)橐@取釋放結(jié)點(diǎn)的值,所以這里要把釋放結(jié)點(diǎn)的值賦值給*e
*e = q->data;
// 利用c語(yǔ)言的函數(shù)free 讓系統(tǒng)回收此結(jié)點(diǎn),釋放內(nèi)存
free(q);
return OK;
}