#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 ); }