/*
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。
试写一高效算法,删除表中所有值大于mink且小于maxk的元素
(若表中存在这样的元素)同时释放被删结点空间
*/
#include <stdio.h>
#include <stdlib.h>
/*
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。
试写一高效算法,删除表中所有值大于mink且小于maxk的元素
(若表中存在这样的元素)同时释放被删结点空间
*/
typedef struct LNcode{
int data;
struct LNcode *next;
}LNcode, *LinkList;
LNcode * CreatList(){
int i=0;
LNcode *head;
LNcode *p1,*p2;
printf("请输入链表元素:\n");
p1=p2=(LNcode *)malloc(sizeof(LNcode));
scanf("%d",&p1->data);
head=NULL;
while(p1->data!=0){
i++;
if(i==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(LNcode *)malloc(sizeof(LNcode));
scanf("%d", &p1->data);
}
p2->next=NULL;
return (head);
}
void PrintList(LNcode *head ){
LNcode *p ;
p=head;
printf("链表元素如下:\n");
if(head!=NULL){
do{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
}
printf("\n");
}
int main(){
int minK;
int maxk;
LNcode *p,*min,*head,*x;
head=CreatList();
PrintList(head);
printf("请输入mink 和 maxk (mink <= maxk) :\n");
printf("请输入mink :\n");
scanf("%d",&minK);
printf("请输入 maxk :\n");
scanf("%d",&maxk);
p=head;
while(p!=NULL){
if(p->data <minK || p->data>maxk){
x=p;//删除时必须知道删除节点的前一个和后一个结点。 x为前一个节点
p=p->next;
}else {
min=p;
p= min->next;
free(min);
x->next=p;
}
}
p=head;
PrintList(head);
}