Status ListDelete_L(LinkList &L,ElemType mink,ElemType maxk)
{//这个算法实现了每移动一次辅助指针p,就释放空间。
LinkList p,q,prev=NULL;
if(mink>maxk)return ERROR;
p=L;
prev=p;
p=p->next;
while(p&&p->data<maxk){
if(p->data<=mink){
prev=p;
p=p->next;
}
else{
prev->next=p->next;
q=p;
p=p->next;
free(q);
}
}
return OK;
}
递增单链表删除所有大于mink且小于maxK的元素。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef int ElemType;
#define ERROR -1
#define OK 1
typedef struct LNode
{
ElemType data;
LNode *next;
}LNode,*LinkList;
void CreateList(LinkList &L,int n)
{
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
printf("请输入第%d个元素\n",i);
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
//时间复杂度O(n),空间复杂度O(2),该算法对于释放空间的处理不好。
void CutFun(LinkList &L,int mink,int maxk)
{
LinkList p,q;
q=p=L;
while(q->next->data<=maxk)
{
if (q->next!=NULL&&p->next->data<=mink)
{
q=p=p->next;
}
if (q->next!=NULL&&q->next->data>mink&&q->next->data<=maxk)
{
q=q->next;
}
if (q->next==NULL)
{
q=NULL;//后面的都不要了
break;
}
}
p->next=q;
}
void main()
{
LinkList L,p;
int n,mink,maxk;
printf("输入元素个数:\n");
scanf("%d",&n);
CreateList(L,n);
printf("输出元素:\n");
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n输入大于的最小值与小于的最大值\n");
scanf("%d%d",&mink,&maxk);
CutFun(L,mink,maxk);
printf("输出元素:\n");
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
getch();
}