⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fenqu.c

📁 分区管理 固定式分区模拟了固定式分区的分配和回收算法
💻 C
字号:
#define N_n 12               //链表中可申请的非头结点的结点数
#define MAXLEN(r) r          //通过宏求结点中数据的空间大小
#define s_area sizeof(char)  //规定的剩余大小
typedef struct{
	char ch[MAXLEN(r)];
}SString;
typedef struct DNode         //存放空闲空间的结构体定义,双向链表
{SString data;
 struct DNode *prior,*next;
}DNode,*Doublelist;
typedef struct D_dem_list
{int number;
 int area;
 int *address;
 int sta;
}D_list[20];
char *hs_q[12];

DNode * FF_init(void)       //首次适应算法的初始化
{Doublelist L;
 DNode *s,*H_s,*E_s,*p,*aft_s;
 int i=2,k=10,j=0,k=5;
 L=(DNode *)malloc(sizeof(DNode));
 s=(DNode *)malloc(sizeof(DNode));
 aft_s=(DNode *)malloc(sizeof(DNode));
 L->next=s;
 s->prior=L;
 if(aft_s>s)
 {
	 s->next=aft_s;
	 aft_s->prior=s;
	 H_s=s;
	 E_s=aft_s;
 }
 else {
	 aft_s->prior=s->prior;
	 L->next=aft_s;
	 aft_s->next=s;
	 s->prior=aft_s;
	 H_s=aft_s;
	 E_s=s;
 }
 while(i<=N_n)       //判断可申请的结点数
 {
	 k=k+5;
	 MAXLEN(k);
	 aft_s=(DNode *)malloc(sizeof(DNode));
	 i++;
	 if(aft_s<H_s)
	 {aft_s->prior=H_s->prior;
	  L->next=aft_s;
	  aft_s->next=H_s;
	  H_s->prior=aft_s;
	  printf("头插入成功");
	  H_s=aft_s;          //H_s始终指向第一个结点
	 }
      else
	  {
		  if(aft_s>E_s)
		  {E_s->next=aft_s;
		   aft_s->prior=E_s;
		   printf("尾插入成功");
		   E_s=aft_s;      //E_s始终指向最后一个结点
		  }
		  else
			  if(aft_s>H_s&&aft_s<E_s)
			  {
				  for(p=L->next;p->next!=L;p=p->next)
				  {
					  if(aft_s>p&&aft_s<p->next)
					  {
						  aft_s->prior=p->next->prior;
						  p->next=aft_s;
						  aft_s->next=p->next;
						  p->next->prior=aft_s;
						  printf("插入成功");
					  }
					  break;
				  }
			  }
	  }//第一个else循环
 }//while循环
 i=i-1;      //while循环成功时i=N_n+1
 if(i==N_n)
 {
	 E_s->next=L;
	 L->prior=E_s;
 }
 printf("链表初始化成功");
 printf("\n");
 p=L->next;
 D_list[0].number=1;
 D_list[0].area=5;
 D_list[0].address=p;
 D_list[0].sta=0;
 for(j=1;j<20;j++)
 {
     p=p->next;
     D_list[j].number=i+1;
     D_list[j].area=5*j;
     D_list[j].address=p;
     D_list[j].sta=0;
 }
 for(j=0;j<12;j++)
 {
	 printf("%d,%d,%d,%d",D_list[j].number,D_list[j].area, D_list[j].address, D_list[j].sta);
	 printf("\n");
	 printf("说明表初始化成功 ");
 }
 printf("initial success");
 return(L);
}
//分配函数
void D_fenpei(Doublelist L,int N) //由main传递初始化的链表首地址与分配大小
{
	DNode *p;
	char *q;
	int i,j;
	p=L->next;
	while(p!=L)
	{
		if(sizeof(p->data)>N*sizeof(char)) //空闲空间大小>申请空间
		{
			for(j=0;j<12;j++)
			{
				if(p==D_list[j].address&&D_list[j].sta!=1)
				{
                      if(sizeof(p->data)-N*sizeof(char)<s_area)  //分配剩余大小小于规定
					  {
				           p->prior->next=p->next;
				           p->next->prior=p->prior;
				           q=p->data.ch;
                           hs_q[j]=q;
			               printf("free success");
					  }
			         else
					 {
				           for(i=0;i<N;i++)
						   {
				  	            p->data.ch=p->data.ch+i;
						   }
				           p->data.ch=p->data.ch+N;
				           q=p->data.ch;
						   hs_q[j]=q;
				           printf("free sub space success");
					 }
					D_list[j].sta=1;
					break;
				}
				else
					if(D_list[j].sta==1)
					{
						p=p->next;
					}
			} //for循环
			
		}  //第一个if循环
		else
		{
			p=p->next;
		}
	}  //while循环
	if(p==L)
	{
		printf("error,can not distribute");
		printf("\n");
	}
}
void main(void)
{
	DNode *t;
	int n;
	printf("输入n在60以内");
	scanf("%d",&n);
	t=FF_init();
	D_fenpei(t,n);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -