您的位置:首页 > 编程语言 > C语言/C++

比较各种装箱试探方法实现文件C语言

2011-01-21 01:28 633 查看
/*	10-5-11-01-11-21.47.c	-- 第十章第五题	*/
#include "Uiversal_queue.h"

typedef struct data
{
	int time ;
	int count ;
} Data ;

int main (void) ;
int showMenuAndGetChoice (void) ;
void eatLine (void) ;
int getInput (int * const input, const int size) ;
Data nextFit (const int * const input, const int size) ;
Data firstFit (const int * const input, const int size) ;
Data bestFit (const int * const input, const int size) ;
Data firstFitDecreasing (const int * const input, const int size) ;
Data bestFitDecreasing (const int * const input, const int size) ;
Bool addToLastNode (const Item * const pi, Node * const pn) ;
Bool addToExistingNode (const Item * const pi, Node * const pn) ;
Bool addToBestNode (const Item * const pi, Queue * const pq) ;
void shellSort_PointToNode (Node * * const input, const int size) ;
void shellSort_Int (int * const input, const int size) ;

int main (void)
{
	Data data ;
	int choice, size, index = FALSE ;
	int input[SIZE] ;

	while ((choice = showMenuAndGetChoice ()) != QUIT)
	{
		switch (choice)
		{
			case IMPORT_DATA :
				size = SIZE ;
				if (size = getInput (input, size))
				{
					 puts ("Complete input.") ;
					 index = TRUE ;
				 }
				else
					puts ("Failed input.") ;
				break ;
			case NEXT_FIT :
				if (TRUE == index)
				{
					data = nextFit (input, size) ;
					printf ("Next fit : time : %d count : %d/n", data.time, data.count) ; 
				}
				else
					puts ("No input.") ;
				break ;
			case FIRST_FIT :
				if (TRUE == index)
				{
					data = firstFit (input, size) ;
					printf ("First fit : time : %d count : %d/n", data.time, data.count) ;
				}
				else
					puts ("No input.") ;
				break ;
			case BEST_FIT :
				if (TRUE == index)
				{
					data = bestFit (input, size) ;
					printf ("Best fit : time : %d count : %d/n", data.time, data.count) ;
				}
				else
					puts ("No input.") ;
				break ;
			case FIRST_FIT_DECREASING :
				if (TRUE == index)
				{
					data = firstFitDecreasing (input, size) ;
					printf ("FIRST_FIT_DECREASING : time : %d count : %d/n", data.time, data.count) ;
				}
				else
					puts ("No input.") ;
				break ;
			case BEST_FIT_DECREASING :
				if (TRUE == index)
				{
					data = bestFitDecreasing (input, size) ;
					printf ("BEST_FIT_DECREASING : time : %d count : %d/n", data.time, data.count) ;
				}
				else
					puts ("No input.") ;
				break ;
			case UNDEFINITION :
			 puts ("Wrong input.") ;
		}
	}

	return 0 ;
}

int showMenuAndGetChoice (void)
{
	int choice ;

	puts ("-----Please choose what you want to do.-----") ;
	puts ("1).Import data.") ;
	puts ("2).Next fit.") ;
	puts ("3).First fit.") ;
	puts ("4).Best fit.") ;
	puts ("5).First fit decreasing.") ;
	puts ("6).Best fit decreasing.") ;
	puts ("0).Quit.") ;
	printf ("( )/b/b") ;
	scanf ("%d", &choice) ;
	eatLine () ;
	switch (choice)
	{
		case QUIT :
			 return QUIT ;
		case IMPORT_DATA :
			 return IMPORT_DATA ;
		case NEXT_FIT :
			 return NEXT_FIT ;
		case FIRST_FIT :
			 return FIRST_FIT ;
		case BEST_FIT :
			 return BEST_FIT ;
		case FIRST_FIT_DECREASING :
			 return FIRST_FIT_DECREASING ;
		case BEST_FIT_DECREASING :
			 return BEST_FIT_DECREASING ;
		default	:
			 return UNDEFINITION ;
	}
}

void eatLine (void)
{
	while (getchar () != '/n')
		continue ;
}

int getInput (int * const input, const int size)
{
	int i = 0 ;

	puts ("Import data one by one please, input 'q' finishes the input.") ;
	fputs ("Please import data:", stdout) ;
	while (scanf ("%d", input + i) && i < size)
	{
		eatLine () ;
		fputs ("Please import next data:", stdout) ;
		i++ ;
	}
	eatLine () ;
	
	return i ;
}

Data nextFit (const int * const input, const int size)
{
	Queue queue ;
	Item item ;
	Data data ;
	int i, time = 0 ;

	Initialize_Q (&queue) ;
	
	for (i = 0; i < size; i++)
	{
		item.current = input[i] ;
		item.gross = GROSS ;
		item.leavings = item.gross - item.current ;
		if (TRUE == addToLastNode (&item, queue -> rear))
			time++ ;
		else
		{
			Insert_Q (&queue, &item) ;
			time += 2 ;
		}
	}
	data.time = time ;
	data.count = queue -> current ;
	Release_Q (&queue) ;

	return data ;
}

Data firstFit (const int * const input, const int size)
{
	Queue queue ;
	Item item ;
	Data data ;
	int i, time = 0 ;

	Initialize_Q (&queue) ;
	for (i = 0; i < size; i++)
	{
		item.current = input[i] ;
		item.gross = GROSS ;
		item.leavings = item.gross - item.current ;
		if (TRUE == addToExistingNode (&item, queue -> front))
			time++ ;
		else
		{
			Insert_Q (&queue, &item) ;
			time += 2 ;
		}
	}
	data.time = time ;
	data.count = queue -> current ;
	Release_Q (&queue) ;

	return data ;
}

Data bestFit (const int * const input, const int size)
{
	Queue queue ;
	Item item ;
	Data data ;
	int i, time = 0 ;

	Initialize_Q (&queue) ;
	for (i = 0; i < size; i++)
	{
		item.current = input[i] ;
		item.gross = GROSS ;
		item.leavings = item.gross - item.current ;
		if (TRUE == addToBestNode (&item, &queue))
			time++ ;
		else
		{
			Insert_Q (&queue, &item) ;
			time += 2 ;
		}
	}
	data.time = time ;
	data.count = queue -> current ;
	Release_Q (&queue) ;

	return data ;
}

Data firstFitDecreasing (const int * const input, const int size)
{
	Queue queue ;
	Item item ;
	Data data ;
	int * ordered ;
	int i, time = 0 ;

	ordered = (int *) malloc (sizeof (int) * size) ;
	if (NULL == ordered)
	{
		data.time = 0 ;
		data.count = 0 ;
		return data ;
	}
	for (i = 0; i < size; i++)
		ordered[i] = input[i] ;
	shellSort_Int (ordered, size) ;

	Initialize_Q (&queue) ;
	for (i = 0; i < size; i++)
	{
		item.current = input[i] ;
		item.gross = GROSS ;
		item.leavings = item.gross - item.current ;
		if (TRUE == addToExistingNode (&item, queue -> front))
			time++ ;
		else
		{
			Insert_Q (&queue, &item) ;
			time += 2 ;
		}
	}
	data.time = time ;
	data.count = queue -> current ;
	free (ordered) ;
	Release_Q (&queue) ;

	return data ;
}

Data bestFitDecreasing (const int * const input, const int size)
{
	Queue queue ;
	Item item ;
	Data data ;
	int * ordered ;
	int i, time = 0 ;

	ordered = (int *) malloc (sizeof (int) * size) ;
	if (NULL == ordered)
	{
		data.time = 0 ;
		data.count = 0 ;
		return data ;
	}
	for (i = 0; i < size; i++)
		ordered[i] = input[i] ;
	shellSort_Int (ordered, size) ;

	Initialize_Q (&queue) ;
	for (i = 0; i < size; i++)
	{
		item.current = input[i] ;
		item.gross = GROSS ;
		item.leavings = item.gross - item.current ;
		if (TRUE == addToBestNode (&item, &queue))
			time++ ;
		else
		{
			Insert_Q (&queue, &item) ;
			time += 2 ;
		}
	}
	data.time = time ;
	data.count = queue -> current ;
	free (ordered) ;
	Release_Q (&queue) ;

	return data ;
}

Bool addToLastNode (const Item * const pi, Node * const pn)
{
	if (NULL == pn || pn -> item.leavings < pi -> current)
		return FALSE ;
	else
	{
		pn -> item.current += pi -> current ;
		pn -> item.leavings -= pi -> current ;
		return TRUE ;
	}
}

Bool addToExistingNode (const Item * const pi, Node * const pn)
{
	if (NULL == pn)
		return FALSE ;
	else
	{
		if (pn -> item.leavings < pi -> current)
			return addToExistingNode (pi, pn -> next) ;
		else
		{
			pn -> item.current += pi -> current ;
			pn -> item.leavings -= pi -> current ;
			return TRUE ;
		}
	}
}

Bool addToBestNode (const Item * const pi, Queue * const pq)
{
	Node * * ordered, * scan ;
	int i, lenth = (*pq) -> current ;

	if (IsEmpty_Q (pq))
		return FALSE ;
	ordered = (Node * *) malloc (sizeof (Node *) * lenth) ;
	if (NULL == ordered)
		return FALSE ;
	for (i = 0, scan = (*pq) -> front; i < lenth; i++)
	{
		ordered[i] = scan ;
		scan = scan -> next ;
	}
	shellSort_PointToNode (ordered, lenth) ;
	for (i = 0; i < lenth; i++)
	{
		if (ordered[i] -> item.leavings >= pi -> current)
		{
			ordered[i] -> item.current += pi -> current ;
			ordered[i] -> item.leavings -= pi -> current ;
			free (ordered) ;
			return TRUE ;
		}
	}
	free (ordered) ;
	
	return FALSE ;
}

void shellSort_PointToNode (Node * * const input, const int size)
{
	Node * temp ;
	int i, j, increment ;

	for (increment = size / 2; increment > 0; increment /= 2)
	{
		for (i = increment; i < size; i++)
		{
			temp = input[i] ;
			for (j = i; j >= increment; j -= increment)
			{
				if (temp -> item.leavings < input[j - increment] -> item.leavings)
					input[j] = input[j - increment] ;
				else
					break ;
			}
			input[j] = temp ;
		}
	}
}

void shellSort_Int (int * const input, const int size)
{
	int temp ;
	int i, j, increment ;

	for (increment = size / 2; increment > 0; increment /= 2)
	{
		for (i = increment; i < size; i++)
		{
			temp = input[i] ;
			for (j = i ; j >= increment; j -= increment)
			{
				if (temp < input[j - increment])
					input[j] = input[j - increment] ;
				else
					break ;
			}
			input[j] = temp ;
		}
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐