//Link.h 数据结构及函数定义
#ifndef LINK_H
#define LINK_H
typedef int BOOL;
#define TRUE 1
#define FALSE 0
//定义分区链表结构体
typedef struct DNode
{
int Daddress;//首地址
int Dsize; //当前长度
DNode* next; //下一结点指针
}DNode,*DLink;
#define MAXPROCESS 10 //最大进程数
typedef struct Process
{
BOOL state; //进程状态:为TRUE则在内存中、为FALSE则不再内存中
char name[20]; //进程名
int Paddress; //进程存储地址
int Psize; //进程大小
}Process;
/*使用到的函数如下*/
DLink Init(int ma,int ms);//内存初始化
DLink InitMore(); //初始化多个空闲区
BOOL ProcessBuild();//建立进程
//核心工作
BOOL MemoryAlloc(DLink head); //内存分配
BOOL MemoryRecovery(DLink head,char *ProcessName); //内存回收
//这里规定 1.低地址为上空闲区 2.高地址为下空闲区
DLink UpFree(DLink head,int PN); //回收区存在上空闲区
DLink DownFree(DLink head,int PN); //回收区存在下空闲区
//打印表
void ShowMemory(DLink head); //打印空闲区块
void ShowProcess(); //打印进程表
//排序算法
void SortBigToSmall(DLink head);//从大到小排序
void SortSmallToBig(DLink head);//从小到大排序
void SortByAddress(DLink head); //按地址从小到大排序
#endif
//Link.cpp 相关函数实现
#include"link.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#pragma warning(disable : 4996)
extern Process ProcessTable[MAXPROCESS];
extern int ProcessNum;
DLink Init(int ma,int ms)
{
//内存初始化
DLink Head;//头结点
DLink first;//第一个结点
Head = (DLink)malloc(sizeof(DNode));//分配头节点内存
if (Head == NULL)
{
printf("分配失败\n");
}
first = (DLink)malloc(sizeof(DNode));//分配第一个结点内存
if (first == NULL)
{
printf("分配失败\n");
}
Head->next = first;//头节点指向第一个结点
first->next = NULL;//第一个结点没有后继节点
first->Daddress = ma;//初始空闲区起始地址
first->Dsize = ms; //初始空闲区大小
return Head;
}
DLink InitMore()
{
//初始化多个空闲区
DLink Head;//头结点
DLink p;//链表结点
int num=-1;
int ma,ms;
printf("输入空闲区个数(>=1):");
scanf("%d", &num);
if (num <= 0)
{
printf("空闲区小于1个,无法分配!\n");
return NULL;
}
Head = (DLink)malloc(sizeof(DNode));
if (Head == NULL)
printf("头结点分配失败\n");
p = Head;
for (int i = 0; i < num; i++)
{
DLink D;
D = (DLink)malloc(sizeof(DNode));
if (D == NULL)
{
printf("结点分配失败\n");
}
printf("输入第%d个空闲区的始址:",i+1);
scanf("%d", &ma);