核心函数如下:
void LinkList_clear(LinkList &L,int mink,int maxk)
{
node *q,*t,*p,*r;
p = L->next;
while (p!=NULL&& p->date <= mink)
{
//查找第一个值大于mink的结点
t = p;//t是连接的桥梁指针
p = p->next;
}
if (p!=NULL)
{
while (p && p->date < maxk)
{
// 当数小于maxk的时候一直往下找
p = p->next;
}
q = t->next;//把之前的位置存起来
t->next = p;//改变指针,使其跳跃到范围之外
while (q != p)
{
// 释放节点空间
r = q->next;
delete q;
q = r;
}
}
}
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef int SLDataType;
typedef struct node
{
SLDataType date;
struct node *next;
}node,*LinkList;
SLDataType LinkList_Init(LinkList &L)
{
L=(LinkList)malloc(sizeof(node));
if(L==NULL)
exit(-1);
L->next=NULL;
return 1;
}
void LinkList_create(LinkList &L,int n)
{
int i;
node *p,*q;
q=L;
printf("请输入递增元素:");
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(node));
scanf("%d",&p->date);
p->next=NULL;
q->next=p;
q=p;
}
}
void LinkList_print(LinkList &L)
{
node *p;
p=L->next;
printf("单链表的元素为:");
while(p)
{
printf("%d ",p->date);
p=p->next;
}
printf("\n");
}
void LinkList_clear(LinkList &L,int mink,int maxk)
{
node *q,*t,*p,*r;
p = L->next;
while (p!=NULL&& p->date <= mink)
{
//查找第一个值大于mink的结点
t = p;
p = p->next;
}
if (p!=NULL)
{
while (p && p->date < maxk)
{
// 当数小于maxk的时候一直往下找
p = p->next;
}
q = t->next;
t->next = p;//改变指针
while (q != p)
{
// 释放节点空间
r = q->next;
delete q;
q = r;
}
}
}
int main()
{
LinkList L;
int n=N;
int mink,maxk;
LinkList_Init(L);//创建单链表
LinkList_create(L,n);//输入单链表的数
LinkList_print(L);//打印单链表的元素
printf("需要删除数的范围:");
scanf("%d%d",&mink,&maxk);
getchar();
LinkList_clear(L,mink,maxk);//删除链表中所有大于mink且小于maxk的元素
LinkList_print(L);//验证删除后的结果
return 0;
}
运行结果如下: