📄 fenqu.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 + -