- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C模拟动态储存管理程序设计
《程序设计》实习报告( 2012-5-1 )
姓名: 秦炜杰 学号: 110520021 日期: 2011-5-1
一、实习题:编制一个模拟动态存储管理的程序。设用一个单向链表HA表示空闲链表,用一个单向链表HB表示已占用空间链表。设链表结点结构如下:
起始地址
本块单元数
链域
(“起始地址”和“本块单元数”为正整数,“链域”是指向下一结点的指针)
方案 1:
在键盘上输入起始地址和本块单元数,建立起HA,HB两链表初态(输入起始地址为0时结束);
输出HA,HB两链( 起始地址和本块单元数 );
输入起始地址,在HB链中撤销对应结点,撤销结点后输出HB链;
将撤销结点并入HA链( 按起始地址从小到大次序加入 )并输出并入结点后的HA:
当被撤销的结点没有左邻结点、右邻结点和它相连,则在HA链加入;
当被撤销的结点有左邻结点与它相连,则把它??左邻结点合并;
当被撤销的结点有右邻结点与它相连,则把它与右邻结点合并;
当被撤销的结点有左、右邻结点相连,则把它和左、右邻结点合并;
5.继续第3点,直到HB链为空或输入的起始地址为0为止;
6.输出HA、HB链。
二、解题的基本算法:
(1)根据题意,用户在键盘上输入起始地址、本块单元数,建立起HA、HB两链表(输入起始地址为0时结束;然后把HA和HB输出。输入起始地址,在HB链中撤销对应的结点后输出HB链,将撤销的结点并入HA链(按起始地址从小到大次序加入)并输出HA链。因此程序的结构如下:
1.输入起始地址和单元数。
2.分别输出HA和HB链(起始地址和单元数)。
3.输入起始地址,在HB链中撤销所对应的结点后输出HB链。
4.将撤销的结点并入HA链(起始地址从小到大次序加入)并输出HA链。
(2)根据题意,输入数据及输出链表的操作并不难,结点的撤销和加入也易于实现,关键是把结点并入后的合并情形。
(3)进一步讨论结点的合并:
插入位置是链中时:
eq \o\ac(○,1)当插入的结点没有左右邻结点时,不进行合并;
eq \o\ac(○,2))当插入的结点只有左邻结点时,则只与左邻结点合并,与左邻结点和并时,
分两种情形:
当左邻结点被合并时,则插入的结点应并在左邻结点被合并的节点处;
当左邻结点没被合并时,则插入的结点应并入左邻结点;
eq \o\ac(○,3))当插入的结点只有右邻结点时,则只与右邻结点合并,只能把右邻结点并入到插入的结点;
eq \o\ac(○,4))当插入的结点有左右邻结点时,分两种情况:
当左邻结点被合并时,则插入的结点及右邻结点应并在左邻结点被合并的节点处;
当左邻结点没被合并时,则插入的结点及右邻结点应并入左邻结点;
插入的位置在头结点之前时:
eq \o\ac(○,1)只与头邻结点合并,只能把头邻结点并入到插入的结点,改变头指针;
插入的结点在尾结点之后时:
eq \o\ac(○,1)当插入的结点只有左邻结点时,则只与左邻结点合并,与左邻结点和并时,分两种情形:
当左邻结点被合并时,则插入的结点应并在左邻结点被合并的节点处;
当左邻结点没被合并时,则插入的结点应并入左邻结点;
开始
3.程序流程图
输入HA和HB
输出HA和HB
对HA排序
输入address
address在HB中
在HB中删除地址为address的结点
HA为空
在HA插入地址为address的结点
加入结点在HA首结点之前
加入结点在HA尾结点之后
有左右邻结点
头指针指向插入节点
左邻结点被合并过
插入节点并到把尾结点合并的结点处
并入尾结点
左邻结点被合并过
插入节点和右邻结点并到把左邻结点合并的结点
把插入节点和右邻结点并入左邻结点
只有右邻结点
把右邻结点并到插入节点处
只有左邻结点
左邻结点被合并过
插入节点并到把左邻结点合并的结点
把插入节点并入左邻结点
输入address
有右邻结点
首结点并到插入节点
改变头指针,不合并
HB为空或address为0
结 束
4.源程序代码。
#includeiostream.h
#includeprocess.h
#includeconio.h
struct Occasion //定义结构体
{
int date1; // 起始地址
int date2; // 本块单元数
Occasion* link; // 指向下一个结点
};
Occasion *Push(Occasion *h,int obj
文档评论(0)