1. 程式人生 > >迴圈首次適應演算法、首次適應演算法、最佳適應演算法_C語言版

迴圈首次適應演算法、首次適應演算法、最佳適應演算法_C語言版

#include <stdio.h>
#define getpch(type) (type*)mallloc(sizeof(type))
strct LNode
{
	int size;
	int start;
	int end;
	struct LNode *next;
	struct LNode *front;
}*L;
typedeft struct LNode LN;
LN *find;
int n;
void InsertList(int size,int start)
{
	LN *p,*s,*t;
	p=L;
	printf("\n空閒區號 長度 起始位置 終止位置\n");
	for(i=1;i<=n;i++)
	{
		printf("%3d\t %3d\t%3d\t %4d\n",i,p->size,p->start,p->end);
		p=p->next;
	}
}

void BFSortList()
{
	LN *p,*s,*t;
	int min_size,i;
	int size,start,end;
	t=L->next;
	p=L->next;
	for(i=0;i<n;i++)
		{
			s=p->next;
			min_size=p->size;
			while(s)
			{
				if(min_size>s->size)
				{
					min_size=s->size;
					t=s;
				}
				s=s->next;
			}
			size=t->size;
			start=t->start;
			end=t->end;
			t->size=p->size;
			t->start=p->start;
			t->end=p->end;
			p->size=size;
			p->start=start;
			p->end=end;
			t=->next;
			p=p->next;
		}
}

void SortList()
{
	LN *p.*s,*t;
	int min_start,i;
	int size,start,end;
	t=L->next;
	p=L->next;
	for(i=0;i<n;i++)
		{
			s=p->next;
			min_start=p->start;
			while(s)
			{
				if(min_start>s->start)
				{
					min_start=s->start;
					t=s;
				}
				s=s->next;
			}
			size=t->size;
			start=t->start;
			end=t->end;
			t->size=p->size;
			t->start=p->start;
			t->end=p->end;
			p->size=size;
			p->start=start;
			p->end=end;
			t=->next;
			p=p->next;
		}
}

void GetFree()
{
	int size,start,i;
	L=getpch(LN);
	L->next=NULL;
	L->front=NULL;
	printf("請輸入空閒區數:");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		printf("請輸入第%2d空閒區的大小和初始地址。\n",i);
		scanf("%3d,%3d",&size,&start);
		InsertList(size,start);
	}
	printf("\n按任意鍵繼續。");
}

void Assign(int size)
{
	LN *p,*t;
	p=L->next;
	t=L;
	while(p)
	{
		p=p->next;
		t=t->next;
		if(!p)
		{
			printf("沒有足夠大的空間。\n");
		}
		else
		{
			p->size=p->size-size;
			p->start=p->start+size;
			if(p->size==0)
			{
				t->next=p->next;
				p->next->front=t;
				n--;
				free(p);
			}
		}
		printf("分配成功!\n");
		printf("分配後的空閒連結串列情況如下:\n");
		PrintList();
		break;
	}
}

int flag=-1;

void NF_Assign(int size)
{
	LN *P,*t;
	int i=n;
	p=find->next;
	t=find;
	while(p)
	{
		if(size>p->size)
		{
			p=p->next;
			t=t->next;
			if(!p)
			{
				printf("沒有足夠大的空間去分配!分配不成功。");
			}
		}
		else
		{
			p->size=p->size-size;
			p->start=p->start+size;
			find=p;
			if(p->size==0)
			{
				t->next=p->next;
				p->next-front=t;
				n--;
				free(p);
			}
			printf("分配成功!\n");
			flag=1;
			printf("分配後的空閒連結串列情況如下:\n");
			Print(L);
			break;
		}
	}
	if(flag==-1)
	{
		p=L->next;
		t=L;
		while(p!=find)
		{
			if(size>p->size)
			{
				p=p->size;
				t=t->next;
				if(!p)
				{
					printf("沒有足夠大的空間去分配!分配不成功。");
				}
			}
			else
			{
				p->size=p->size-size;
				p->start=p->start+size;
				find=t;
				if(p->size==0)
				{
					t->next=p->next;
					p->next-front=t;
					n--;
					free(p);
				}
				printf("分配成功!\n");
				printf("分配後的空閒連結串列情況如下:\n");
				PrintList(L);
				break;
			}
		}
	}
}

void Recover(int start,int end)
{
	LN *p,*t;
	int size,flag=0;
	size=end-start;
	p=L->next;
	t=p->next;
	while(p)
	{
		if(t&&p->end==start&&t->start==end)
		{
			p->size=p->size+size+t->size;
			p->end=t->end;
			p->next=t->next;
			t->next->front=p;
			free(t);
			n--;
			SortList(L);
			flag=1;
			break;
		}
		else if(p->end==start)
		{
			flag=1;
			p->size=p->size+size;
			p->end=p->end+size;
			SortList(L);
			break;
		}
		else if(p->start==end)
		{
			p->size=p->size+size;
			p->start=start;
			SortList(L);
			flag=1;
			break;
		}
		p=p->next;
		if(p)
			t=p->next;
	}
	if(flag==0)
	{
		InsertList(size,start);
		n++;
	}
	printf("回收後的空閒連結串列情況如下:");
	PrintList();
	printf("\n按任意間繼續。");
}

void main()
{
	int start,end,size;
	int m;
	GetFree();
	getch();
	system("cls");
	printf("請選擇服務型別:\n");
	printf("\t1:首次適應演算法\n");
	printf("\t3:最佳適應演算法\n");
	printf("\t4:最佳適應演算法\n");
	printf("\t0:退出\n");
	printf("\t輸入您要的選項:\n");
	scanf("%d",&m);
	if(m==2)find=L;
	while(m)
	{
		switch(m)
		{
			case 1:
				SortList();
				printf("\n空閒連結串列情況:\n");
				PrintList();
				printf("請輸入程序需要的空閒區大小:");
				scanf("%d",&size);
				Assign(size);
				printf("\n按任意鍵繼續");
				break;
			case 2:
				SortList();
				printf("\n空閒連結串列情況:\n");
				PrintList();
				printf("請輸入程序需要的空閒區大小:");
				scanf("%d",&size);
				NF_Assign(size);
				printf("\n按任意鍵繼續");
				break;
			case 3:
				BFSortList();
				printf("\n空閒連結串列情況:\n");
				PrintList();
				printf("請輸入程序需要的空閒區大小:");
				scanf("%d",&size);
				Assign(size);
				printf("\n按任意鍵繼續");
				break;
			case 4:
				printf("請輸入回收去的首地址和中止地址:");
				scanf("%3d,%3d",&start,&end);
				Recover(start,end);
				break;
			case 0: exit(0);
			default:printf("\n\t\t輸入錯誤,請重新輸入");getch();
		}
		getch();
		system("cls");
		printf("請選擇服務型別:\n");
		printf("\t1:首次適應演算法\n");
		printf("\t3:最佳適應演算法\n");
		printf("\t4:最佳適應演算法\n");
		printf("\t0:退出\n");
		printf("\t輸入您要的選項:\n");
		scanf("%d",&m);
	}
}

相關推薦

迴圈首次適應演算法首次適應演算法最佳適應演算法_C語言

#include <stdio.h> #define getpch(type) (type*)mallloc(sizeof(type)) strct LNode { int size; int start; int end; struct LNode *

例項分析首次適應演算法最佳適應演算法最差適應演算法

關於首次適應演算法、最佳適應演算法和最差適應演算法,先看一下百度百科的解釋,已經說出了三者的最大區別。 首次適應演算法(first-fit):     從空閒分割槽表的第一個表目起查詢該表,把最先能

動態分割槽分配-迴圈首次適應演算法+最佳適應演算法

(文章待更新) (1)採用空閒區表,並增加已分配區表{未分配區說明表、已分配區說明表(分割槽號、起始地址、長度、狀態)}。分配演算法採用最佳適應演算法(記憶體空閒區按照尺寸大小從小到大的排列)和迴圈首次適應演算法,實現記憶體的分配與回收。 #include<iostr

系統記憶體分配的首次適應演算法最佳適應演算法連結串列模擬實現

#include<iostream> #include<stdlib.h> using namespace std; #define Free 0 //空閒狀態 #define Busy 1 //已用狀態 #define OK 1    //完成

首次適應演算法最佳適應演算法(指標模擬分配過程)

實現程式記憶體的動態分配 首次適應演算法: 找到第一個滿足程式的記憶體塊,並將其分配給程式 最佳適應演算法: 找到所有的滿足程式的記憶體塊,並將其中最小的記憶體塊分配給程式 #include <iostream> #include <stri

c模擬記憶體分配演算法首次適應演算法最佳適應演算法,最壞適應演算法

#include<bits/stdc++.h> using namespace std; /*定義記憶體的大小為100*/ #define MEMSIZE 100 /*如果小於此值,將不再分割記憶體*/ #define MINSIZE 2 /*記憶體分割槽空間表結構*/ typedef str

計算機作業系統 ----記憶體空間回收(首次適應演算法最佳適應演算法

#include<iostream.h>  #include<stdlib.h>  #define Free 0 //空閒狀態  #define Busy 1 //已用狀態  #define OK 1    //完成  #define ERROR 0

【資料結構與演算法】之單鏈表雙鏈表迴圈連結串列的基本介紹及其Java程式碼實現---第三篇

一、連結串列的基本介紹 連結串列的定義:連結串列是一種遞迴的資料結構,它或者為空(null),或者是指向一個結點(node)的引用,該結點含有一個泛型的元素和一個指向另一條連結串列的引用。----Algorithms  Fourth  Edition   常見的連結串

帶頭結點的迴圈連結串列表示佇列的初始化入佇列和出佇列的演算法

假設以帶頭結點的迴圈連結串列表示佇列,並且只設一個指標指向隊尾元素結點(注意不設頭指標),試編寫相應的佇列初始化、入佇列和出佇列的演算法。 帶頭結點迴圈鏈佇列CLQueue的型別為以下LinkList型別:typede

作業系統可變分割槽用C語言實現按最佳適應演算法分配記憶體

類似上一篇部落格,在分配記憶體使用最佳使用演算法,即將空閒區按大小進行排序實現 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struc

最佳適應演算法模擬記憶體分配

最佳適應演算法 從全部空閒區中找出能滿足作業要求的,且大小最小的空閒分割槽,這種方法能使碎片儘量小。 問題描述 Given five memory partitions of 100 KB, 500 KB, 200 KB, 300 KB, and 600

最佳適應(BestFit)演算法

基本思想:BF的空閒分割槽表(或空閒分割槽鏈)按空閒分割槽大小的升序方式組織。分配時,按空閒分割槽表(或空閒分割槽鏈)的先後次序,從頭查詢,找到符合要求的第一個分割槽。就說明它是最適合的。大的空閒分割槽可以被保留下來 #include <malloc.h

OS-記憶體分配回收(最佳適應,最差適應首次適應

#include <iostream> using namespace std; class freeMemoryTable { public: int id; int begin; int size; int stat

作業系統實驗報告---主存分配與回收(最佳適應演算法

   動態分割槽主存的分配與回收                                                                      16網路工程二班 孫書魁目的:           1,瞭解動態分割槽分配中,使用的資料結構和演算法  

記憶體分配演算法-(首次分配法和最佳分配法)

/* implement a memory allocation scheme by using algorithms first-fit, next-fit, and best-fit * freelist為空閒區連結串列的頭,它的下一個節點才指向空閒緩衝區 * fr

常用布局的實現(兩列布局三列適應布局,兩列等高適應布局等)

html 絕對定位 頁面優化 cnblogs ... con bold strong ack 兩列布局:左側定寬,右側自適應方法一:利用float和負外邊距 <style> * { margin: 0; padding: 0; } .main,.si

iOS開發tips-UITableViewUICollectionView行高/尺寸自適應

row wak 舉例 equal dds nib emp self 約束 UITableView 我們都知道UITableView從iOS 8開始實現行高的自適應相

抽象類內部抽象類模板設計演算法

抽象類的定義與使用 定義: 抽象類只是在普通類的基礎上擴充了一些抽象方法而已。 抽象方法: 只宣告未定義的方法(沒有方法體) 所有抽象方法要求使用abstract來定義,並且抽象方法所在類必須用abstract來定義,表示抽象類。 抽象類的使用原則:

改善深層神經網路_優化演算法_mini-batch梯度下降指數加權平均動量梯度下降RMSpropAdam優化學習率衰減

1.mini-batch梯度下降 在前面學習向量化時,知道了可以將訓練樣本橫向堆疊,形成一個輸入矩陣和對應的輸出矩陣: 當資料量不是太大時,這樣做當然會充分利用向量化的優點,一次訓練中就可以將所有訓練樣本涵蓋,速度也會較快。但當資料量急劇增大,達到百萬甚至更大的數量級時,組成的矩陣將極其龐大,直接對這麼大

資料分析資料探勘演算法工程師大資料分析師的區別是什麼?爬招聘網站用資料來全方位分析

大資料行業經過幾年的發展和沉澱,大資料專案崗位細分領域已經趨於完善,本文主要探討在大資料分析這個領域,通過爬蟲爬取各個招聘網站的相關資料,對細分崗位進行深入分析,本文的呈現,感謝科多大資料資料分析培訓班第10期學員“NO.1”團隊的技術支援。 此次分析結果呈現經歷三個階段: 細分查詢目