#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *PL;
PL creat_internew();
PL creat_list( int );
void input_data( PL );
void traverse_list( PL );
PL delete_scope( PL, int, int );
int main ()
{
PL L;
int k, flag, min, max;
flag = 1;
L = creat_internew(); //单链表的头结点创建成功
printf ( "请设置新建有序链表的长度值(建议0-100):" );
while ( flag )
{
scanf ( "%d", &k );
if ( k < 0 || k > 100 )
printf ( "您输入的数值不合法,请重新设置(建议0-100):" );
else
flag = 0;
}
L->next = creat_list( k );
if ( L->next == NULL )
printf ( "新建有序链表为空表!\n" );
else
{
printf ( "链表已创建成功,请以按值递增的方式为新建有序链表输入数据值:\n" );
input_data( L );
printf ( "目前" );
traverse_list( L );
printf ( "请设置下限:" );
scanf ( "%d", &min );
printf ( "请设置上限:" );
while ( !flag )
{
scanf ( "%d", &max );
if ( min > max )
printf ( "上限值不能小于下限值!请重新设置上限值:" );
else
flag = 1;
}
printf ( "范围设定成功!现对该范围内的数据值进行清除。\n" );
L = delete_scope( L, min, max );
printf ( "清除操作成功!\n目前" );
}
traverse_list( L );
system ( "pause" );
return 0;
}
PL creat_internew()
{
PL NEW = NULL;
NEW = ( PL )malloc( sizeof( LNode ) );
if ( NEW == NULL )
{
printf( "新建结点 NEW 内存分配失败,终止程序!\n" );
exit ( -1 );
}
return ( NEW );
}
PL creat_list( int k )
{
int i;
PL Lfirst, p;
if ( k == 0 )
{
Lfirst = NULL;
return ( Lfirst );
}
Lfirst = ( PL )malloc( sizeof( LNode ) );
if ( Lfirst == NULL )
{
printf ( "内存分配失败,终止程序!\n" );
exit ( -1 );
}
p = Lfirst;
for ( i = 0;i < k - 1;i++ )
{
p->next = ( PL )malloc( sizeof( LNode ) );
if ( p->next == NULL )
{
printf ( "内存分配失败,终止程序!\n" );
exit ( -1 );
}
p = p->next;
}
p->next = NULL;
return ( Lfirst );
}
void input_data( PL L )
{
PL p, prev;
int i, flag;
flag = 1;
p = L->next;
printf ( "第1个结点:" );
scanf ( "%d", &p->data );
for ( i = 2, prev = p, p = p->next;p != NULL;p = p->next )
{
while ( flag )
{
printf ( "第%d个结点:", i );
scanf ( "%d", &p->data );
if ( p ->data >= prev->data )
break;
else
printf ( "该链表按值递增有序排列,您输入的数据值不能小于前一个,请重新输入" );
}
i++;
prev = p;
}
return;
}
void traverse_list( PL L )
{
PL p;
printf( "该链表为:L->" );
for( p = L->next;p != NULL;p = p->next )
printf ( "%d->", p->data );
printf ( "NULL\n" );
return;
}
PL delete_scope( PL L, int min, int max )
{
PL p, q, pmax, pmin;
p = L->next;
pmin = L;
for ( ;p != NULL; )
{
if ( p->data <= min )
{
pmin = pmin->next;
p = p->next;
}
else
break;
}
for ( ;p != NULL; )
{
if ( p->data < max )
{
q = p;
p = p->next;
free ( q );
}
else
{
pmax = p;
break;
}
}
pmax = p;
pmin->next = pmax;
return ( L );
}