已知单链表L含有头节点,且节点中的元素值以递增的方式排列。下面的函数DeleteList在L中查找所有值大于mink且小于maxK的元素,若找到,则逐个删除,同时释放被删节点的空间。若链表中不存在满足条件的元素,则返回-1,否则返回0。
例如,某单链表如下图(a)所示。若令minK为20、maxK为50,则删除后的链表如图(b)所示。
链表节点类型定义如下:
typedef struct Node{
int data;
struct Node *next;
}Node, *LinkList;
[C函数]
int DeleteList (LinkList L, int minK, int maxK)
{ /*在含头节点的单链表L中删除大于minK且小于maxK的元素*/
Node *q=L, *p=L->next; /*p指向第一个元素节点*/
int delTag=0;
while (p)
if (P->data <= minK)
{q=p;
p= p->next ;
}
else
if (p->data < maxK) { /*找到删除满足条件的节点*/
q->next= p->next ;
free(p);
p= q->next ;
delTag=1;
}
else break;
if ( delTag=0 )
return -1;
return 0;
}
分析:函数DeleteList(LinkList L, int minK, int maxK)的功能是在L在含头节点的单链表L中删除大于minK且小于maxK的元素,因此除了头指针L以外,至少还需要两个临时指针,一个用于遍历链表中的元素,另外一个用于删除节点时重新链接节点,p和q就起这样的作用。
p指向要被删除的节点、q指向要被删除的节点的前驱节点。
具体过程是:如果删除指针指向的数据不符合删除的条件,那么删除指针和遍历指针向后移动,具体实现的代码是:
q=p;
p= p->next ;
含义就是将删除指针的位置”赋值“给遍历指针的位置。然后删除指针指向下一节点。之后在进行节点是否符合条件进行相应的操作判断。
如果符合删除节点的条件,则进行删除操作,具体过程就是:
将遍历指针移动到删除指针前面,然后释放删除指针所指节点的空间。之后再将遍历指针所指像的节点的下一个节点赋值给删除指针。
具体实现代码:
q->next= p->next ;
free(p);
p= q->next ;
删除过程图: