单链表第i个数据删除结点的算法思路
- 声明一指针p指向链表头指针,初始化j从1开始;
- 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
- 若链表末尾p为空,则说明第i个元素不存在;
- 否则查找成功,将欲删除的结点p->next 赋值给q;
- 单链表的删除标准语句p->next=q->next;
- 将q结点中的数据赋值给e,作为返回;
- 释放q结点;
- 返回成功。
实现代码算法如下:
/* 初始条件:顺序线性表L已存在,1<=i<=ListLength(L) */
/* 操作结果:删除L的第i个数据元素, */
Status ListDelete(LinkList *L, int i, ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
// 寻找遍历第i个元素并将p的next指向p,直到找到i为止
while (p->next && j < 1) {
p = p->next;
++j;
}
// 如果第i个元素不存在,报错
if (!(p->next) || j > i)
{
return ERROR;
}
q = p->next;
// 将q的后继赋值给p的后继
p->next = q->next;
// 因为要获取释放结点的值,所以这里要把释放结点的值赋值给*e
*e = q->data;
// 利用c语言的函数free 让系统回收此结点,释放内存
free(q);
return OK;
}