在单链表中删除指定结点的两种算法:
一般思想:
- 扫描单链表,定位指定结点位置;
- 由于删除此结点需运用到该结点与其前驱结点,需两个指针 q, p 分别指向它们;
算法一:在带表头的单链表中删除元素值为 e 的结点
int delete_withHead(Linklist head, ElemType e)
{
struct node *q, *p;
q = head;
p = head->next; // q,p 扫描
while(p && p->data!= e) // 查找元素为 e 的结点
{
q = p; // 记住前一个结点
p = p->next; // 查找下一个结点
}
if(p) // 元素有为 e 的结点
{
q->next = p->next; // 删除该结点
free(p); // 释放结点所占的空间
return YES;
}
else return NO;
}
算法二:在带表头的单链表中删除指定位置的元素
int delete_withHead(Linklist &L, int i, ElemType &e)
{
p=L;
int j = 1;
while(p->next && j<i) // 循环结束时p 不可能为空
{
p = p->next; // p 后移,指向下一个结点
j++;
}
if(i<1 || p->next==NULL) return ERROR; // 删除错误
}
版权声明:本文为weixin_42800817原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。