单链表的删除

    xiaoxiao2022-07-03  115

    已知单链表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 ;

    删除过程图:

    最新回复(0)