首页 > 试题广场 >

已知线性表中的元素以递增有序排列,并以单链表L作存储结构。试

[问答题]
已知线性表中的元素以递增有序排列,并以单链表L作存储结构。试写出一算法,删除表中所有值大于min且小于max的元素。(假设数据元素为整型结点结构为:(val,next);min,max作为参数)
Status ListDelete_L(LinkList &L,ElemType mink,ElemType maxk) { 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; }
发表于 2017-11-25 20:43:57 回复(0)
#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 );
}

编辑于 2019-12-22 18:26:34 回复(0)