比较各种装箱试探方法实现文件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 ; } } }
相关文章推荐
- 比较各种装箱试探方法头文件C语言
- 文件上传的各种实现方法比较
- 使用ASP实现文件上载(上传)的各种方法
- C语言从txt文件中逐行读入数据存到数组中的实现方法
- c语言实现快速排序算法(直接给出数组,从文件中读取的方法后续会贴出来)
- 使用asp实现文件上传的各种方法
- ASP.NET实现文件下载(多种方法,而且都是比较常用的)
- 转:Java读写文件各种方法及性能比较
- 面向对象,类的组合关系,继承,实现,方法重写,方法重载,this的使用,抽象方法和抽象类的比较,父类构造方法存在的意义,多态的是用和解析,各种访问修饰符
- 进程隐藏的各种方法 以及分析比较以及实现链接
- 通过Python模块filecmp 对文件比较的实现方法
- 各种排序方法的C语言实现
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- Android实现打开各种文件的intent方法小结
- 【IOS功能实现】之 获取各种文件的目录路径的方法
- C语言中的各种文件读写方法小结
- 排序(各种排序方法的实现与比较)
- 进程隐藏的各种方法 以及分析比较以及实现链接
- 利用certutil.exe实现在批处理(bat)中嵌入可执行文件或者各种媒体、图片之类二进制文件的简单方法!
- c语言实现大小端判断和二进制模式写入各种数据到文件