内存动态分区管理模拟实现

本文档通过Link.h、Link.cpp和Main.cpp三个文件,详细介绍了如何模拟实现内存动态分区的管理。Link.h包含了数据结构的定义,Link.cpp则实现了相关操作函数,而Main.cpp作为主函数,整合并展示了整个系统的运行。
摘要由CSDN通过智能技术生成

//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);
		
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值