diff --git a/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod-main.c b/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod-main.c new file mode 100644 index 0000000..4bbfe95 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod-main.c @@ -0,0 +1,90 @@ +/************************************ + * * + * ļ: 08 ̬洢 * + * * + * ļ: BoundaryTagMethod-main.c * + * * + * : ߽ʶغ * + * * + ************************************/ + +#include +#include "BoundaryTagMethod.c" //**08 ̬洢**// + +int main(int argc, char *argv[]) +{ + WORD_a memory[MAX]; + Space pav; + Space p1, p2, p3, p4; + + printf("14\n InitSpace_a ...\n"); //14.InitSpace_aPrintLayout_a + { + printf("ʼһڴ "); + InitSpace_a(memory); + pav = av; + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + printf("2\n AllocBoundTag ...\n"); //2.AllocBoundTag + { + printf("СΪ 100 ڴ p1 ...\n"); + p1 = AllocBoundTag(&pav, 100); + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + printf("СΪ 600 ڴ p2 ...\n"); + { + p2 = AllocBoundTag(&pav, 600); + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + printf("СΪ 200 ڴ p3 ...\n"); + { + p3 = AllocBoundTag(&pav, 200); + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + printf("3\n Reclaim_a ...\n"); //3.Reclaim_a + { + printf("մСΪ 600 ڴ p2 ...\n"); + Reclaim_a(&pav, &p2); + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + printf("СΪ 400 ڴ p4 ...\n"); + { + p4 = AllocBoundTag(&pav, 400); + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + printf("մСΪ 100 ڴ p1 ...\n"); + { + Reclaim_a(&pav, &p1); + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + printf("մСΪ 400 ڴ p4 ...\n"); + { + Reclaim_a(&pav, &p4); + PrintLayout_a(av, pav); + printf("\n"); + } + PressEnter; + + return 0; +} + diff --git a/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod.c b/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod.c new file mode 100644 index 0000000..65e9241 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod.c @@ -0,0 +1,167 @@ +/******************************* + * * + * ļ: 08 ̬洢 * + * * + * ļ: BoundaryTagMethod.c * + * * + * : 8.1 * + * * + *******************************/ + +#ifndef BOUNDARYTAGMETHOD_C +#define BOUNDARYTAGMETHOD_C + +#include "BoundaryTagMethod.h" //**08 ̬洢**// + +void InitSpace_a(WORD_a memory[MAX+2]) +{ + Space pav; + + pav = &memory[0]; + + memory[0].Ptr.llink = pav; + memory[0].tag = 0; + memory[0].size = MAX; + memory[0].rlink = pav; + + memory[MAX-1].Ptr.uplink = pav; + memory[MAX-1].tag = 0; + + av = pav; +} + +/*TTTT[ +U 㷨8.1U +^TTTT*/ +Space AllocBoundTag(Space *pav, int n) //n +{ + Space p, f; + + for(p=*pav; p && p->sizerlink!=*pav; p=p->rlink) + ; //ҲСnĿп + + if(!p || p->sizerlink; //pavָpĺ̽ + + if(p->size-n<=E) //䣬<=Eʣ + { + if(*pav==p) //ֻһ + *pav = NULL; //ռúñΪձ + else //ڱɾĽ + { + (*pav)->Ptr.llink = p->Ptr.llink; + p->Ptr.llink->rlink = *pav; + } + + p->tag = f->tag = 1; //ռÿ־Ϊ1 + } + else //миռúIJ + { + f->tag = 1; //޸ķĵײ־ + p->size -= n; //ʣС + + f = FootLoc(p); //ָʣײ + f->tag = 0; //ʣײ־ + f->Ptr.uplink = p; + + p = f + 1; //ָͷ + p->tag = 1; //÷ͷ + p->size = n; + } + + return p; //pllinkrlinkδı䣬Իտռ + } +} + +void Reclaim_a(Space *pav, Space *p) +{ + Space f, s, t, q; + int l, r; + + l = (*p - 1)->tag; //lrΪָʾͷſڿǷ + r = (*p + (*p)->size)->tag; + + if(!(*pav)) //ÿռΪ + { + *pav = (*p)->Ptr.llink = (*p)->rlink = *p; //޸Ŀбָ + (*p)->tag = (FootLoc(*p))->tag = 0; //޸ͷβ־ + (FootLoc(*p))->Ptr.uplink = *p; //޸β + } + else //ÿռΪ + { + if(l && r) //Ϊ + { + (*p)->tag = 0; + (FootLoc(*p))->Ptr.uplink = *p; + (FootLoc(*p))->tag = 0; + + q = (*pav)->Ptr.llink; + (*p)->rlink = *pav; + (*p)->Ptr.llink = q; + q->rlink = (*pav)->Ptr.llink = *p; + *pav = *p; //ͷŵĽΪ´ηʱȲѯĽ + } + else if(!l && r) //ΪգΪ + { + s = (*p - 1)->Ptr.uplink; //sָʱ׵ַ + s->size += (*p)->size; //¿пС + (FootLoc(*p))->Ptr.uplink = s; //µĿпײ + (FootLoc(*p))->tag = 0; + } + else if(l && !r) //ΪգΪ + { + t = *p + (*p)->size; //tָʱ׵ַ + (*p)->tag = 0; //pΪϲĽͷַ + + q = t->Ptr.llink; //˴qΪǰ׵ַ + (*p)->Ptr.llink = q; //qp + q->rlink = *p; + + q = t->rlink; //˴qΪĺ̽׵ַ + (*p)->rlink = q; //qp + q->Ptr.llink = *p; + + (*p)->size += t->size; //¿пС + (FootLoc(t))->Ptr.uplink = *p; //ײָָ½ͷ + + if(*pav==t) + *pav = s; + } + else //Ϊ + { + s = (*p - 1)->Ptr.uplink; //sָʱ׵ַ + t = *p + (*p)->size; //tָʱ׵ַ + + s->size += (*p)->size + t->size; //½С + t->Ptr.llink->rlink = t->rlink; //t + t->rlink->Ptr.llink = t->Ptr.llink; + (FootLoc(t))->Ptr.uplink = s; //½ײָָͷ + + if(*pav==t) + *pav = s; + } + } + + *p = NULL; +} + +void PrintLayout_a(Space av, Space pav) +{ + Space r; + + r = pav; + printf("пֹΧ"); + printf("%4d%4d", r-av+1, r+r->size-av); + while(r->rlink!=pav) + { + r = r->rlink; + printf("%4d%4d", r-av+1, r+r->size-av); + } + printf("\n"); +} + +#endif diff --git a/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod.h b/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod.h new file mode 100644 index 0000000..e43b357 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/01 BoundaryTagMethod/BoundaryTagMethod.h @@ -0,0 +1,61 @@ +/******************************* + * * + * ļ: 08 ̬洢 * + * * + * ļ: BoundaryTagMethod.h * + * * + * : ߽ʶ * + * * + *******************************/ + +#ifndef BOUNDARYTAGMETHOD_H +#define BOUNDARYTAGMETHOD_H + +#include +#include "../../01 /Status.h" //**01 **// + +/* 궨 */ +#define MAX 1000 +#define E 10 //ռʱռռE֣ +#define FootLoc(p) p+(p)->size-1 //ָpָĵײ + +/* Ͷ */ +typedef struct WORD_a //WORD_aڴ +{ + union + { + struct WORD_a *llink; //ͷָǰ + struct WORD_a *uplink; //ײָ򱾽ͷ + }Ptr; + + int tag; //־0У1ռãͷβ + int size; //ͷ򣬿С + struct WORD_a *rlink; //ͷָ̽ +}WORD_a; +typedef WORD_a* Space; //Spaceÿռָ + +/* ȫֱ */ +Space av; //ڴʼַ + +/* ߽ʶб */ +void InitSpace_a(WORD_a memory[MAX+2]); +/* +(01)ʼһڴ顣 +*/ + +Space AllocBoundTag(Space *pav, int n); +/* +(02)㷨8.1㷨״Ϸ +*/ + +void Reclaim_a(Space *pav, Space *p); +/* +(03)㷨 +*/ + +void PrintLayout_a(Space av, Space pav); +/* +(04)ǰڴַֹ +*/ + +#endif diff --git a/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem-main.c b/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem-main.c new file mode 100644 index 0000000..f010b15 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem-main.c @@ -0,0 +1,96 @@ +/******************************** + * * + * ļ: 08 ̬洢 * + * * + * ļ: BuddySystem-main.c * + * * + * : ϵͳغ * + * * + ********************************/ + +#include +#include "BuddySystem.c" //**08 ̬洢**// + +int main(int argc, char *argv[]) +{ + FreeList avail; + WORD_b *p1, *p2, *p3, *p4; + + printf("15\n InitSpace_b ...\n"); //15.InitSpace_bPrintLayout_b + { + printf("ʼһڴ "); + InitSpace_b(avail); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("2\n AllocBuddy ...\n"); //2.AllocBuddy + { + printf("СΪ 1 ڴ p1 ...\n"); + p1 = AllocBuddy(avail, 1); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("СΪ 2 ڴ p2 ...\n"); + { + p2 = AllocBuddy(avail, 2); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("СΪ 3 ڴ p3 ...\n"); + { + p3 = AllocBuddy(avail, 3); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("СΪ 1 ڴ p4 ...\n"); + { + p4 = AllocBuddy(avail, 1); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("34\n Reclaim_b ...\n"); //34.BuddyReclaim_b + { + printf("ڴ p1 ...\n"); + Reclaim_b(avail, &p1); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("ڴ p2 ...\n"); + { + Reclaim_b(avail, &p2); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("ڴ p3 ...\n"); + { + Reclaim_b(avail, &p3); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + printf("ڴ p4 ...\n"); + { + Reclaim_b(avail, &p4); + PrintLayout_b(avail); + printf("\n"); + } + PressEnter; + + return 0; +} + diff --git a/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem.c b/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem.c new file mode 100644 index 0000000..4c2cd6e --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem.c @@ -0,0 +1,182 @@ +/***************************** + * * + * ļ: 08 ̬洢 * + * * + * ļ: BuddySystem.c * + * * + * : 8.2 * + * * + *****************************/ + +#ifndef BUDDYSYSTEM_C +#define BUDDYSYSTEM_C + +#include "BuddySystem.h" //**08 ̬洢**// + +void InitSpace_b(FreeList avail) +{ + int k; + WORD_b *r; + + for(k=0; k<=M; k++) + { + avail[k].nodesize = (int)pow(2, k); + avail[k].first = NULL; + } + + r = (WORD_b *)malloc((int)pow(2, M)*sizeof(WORD_b)); + if(!r) + exit(OVERFLOW); + r->llink = r->rlink = r; + r->tag = 0; + r->kval = M; + + avail[M].first = r; + + start = r; + end = r + avail[M].nodesize - 1; +} + +/*TTTT[ +U 㷨8.2U +^TTTT*/ +WORD_b* AllocBuddy(FreeList avail, int n) //avail[0..m]ΪÿռnΪ +{ //־ڷnڴ + int k, i; + WORD_b *pa, *pre, *suc, *pi; + + for(k=0; k<=M && (avail[k].nodesizeM) + return NULL; //ʧܣNULL + else //з + { + pa = avail[k].first; //ָɷӱĵһ + pre = pa->llink; //ֱָǰͺ + suc = pa->rlink; + + if(pa==suc) + avail[k].first = NULL; + else + { + pre->rlink = suc; + suc->llink = pre; + avail[k].first = suc; + } + + for(i=1; k-i>=0 && avail[k-i].nodesize>=n; i++) + { + pi = pa + (int)pow(2, k-i); + pi->rlink = pi; + pi->llink = pi; + pi->tag = 0; + pi->kval = k - i; + avail[k-i].first = pi; + } + + pa->tag = 1; + pa->kval = k - (--i); + } + + return pa; +} + +WORD_b* Buddy(WORD_b* p) //startԭʼп +{ + int s, m, n; + + s = p - start; + m = (int)pow(2, p->kval); + n = (int)pow(2, p->kval+1); + + if(s%n==0) + return p + m; + + if(s%n==m) + return p - m; +} + +void Reclaim_b(FreeList avail, WORD_b** p) +{ + WORD_b* s; + + s = Buddy(*p); //sָpĻĵַ + + while(s>=start && s<=end && s->tag==0 && s->kval==(*p)->kval) + { + if(s->llink==s && s->rlink==s) //Ͻһ + avail[s->kval].first = NULL; + else + { + s->llink->rlink = s->rlink; + s->rlink->llink = s->llink; + + if(avail[s->kval].first==s) //s׽ + avail[s->kval].first = s->rlink; + } + + if((int)(*p-start)%(int)pow(2, (*p)->kval+1)==0) //pΪǰ + (*p)->kval++; + else + { + s->kval = (*p)->kval + 1; + *p = s; + } + + s = Buddy(*p); + } + + (*p)->tag = 0; + if(avail[(*p)->kval].first==NULL) + avail[(*p)->kval].first = (*p)->llink = (*p)->rlink = *p; + else + { + (*p)->rlink = avail[(*p)->kval].first; + (*p)->llink = (*p)->rlink->llink; + (*p)->rlink->llink = *p; + (*p)->llink->rlink = *p; + avail[(*p)->kval].first = *p; + } + + *p = NULL; +} + +void PrintLayout_b(FreeList avail) +{ + int k; + WORD_b *r; + int mark; + + for(k=0,mark=0; k<=M; k++) //жڴǷռ + { + if(avail[k].first) + { + mark = 1; + break; + } + } + + if(!mark) + printf("ڴѱռ"); + else + { + printf("пֹΧ"); + for(k=0; k<=M; k++) + { + r = avail[k].first; + if(r) + { + printf("%d%d", r-start+1, r+(int)pow(2, r->kval)-start); + while(r->rlink!=avail[k].first) + { + r = r->rlink; + printf("%d%d", r-start+1, r+(int)pow(2, r->kval)-start); + } + } + } + } + printf("\n"); +} + +#endif diff --git a/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem.h b/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem.h new file mode 100644 index 0000000..97bd52c --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/02 BuddySystem/BuddySystem.h @@ -0,0 +1,65 @@ +/***************************** + * * + * ļ: 08 ̬洢 * + * * + * ļ: BuddySystem.h * + * * + * : ϵͳ * + * * + *****************************/ + +#ifndef BUDDYSYSTEM_H +#define BUDDYSYSTEM_H + +#include +#include +#include +#include "../../01 /Status.h" //**01 **// + +/* 궨 */ +#define M 3 //ÿռ64kֵ2ݴΣӱĸΪM+1 + +/* Ͷ */ +typedef struct WORD_b +{ + struct WORD_b *llink; //ָǰ + int tag; //־0У1ռ + int kval; //СֵΪ2ݴk + struct WORD_b *rlink; //ͷָ̽ +}WORD_b; //WORD_bڴͣĵһҲΪhead +typedef struct HeadNode +{ + int nodesize; //ĿпĴС + WORD_b *first; //ıͷָ +}FreeList[M+1]; //ͷ + +/* ȫֱ */ +WORD_b *start, *end; //ڴյ + +/* ϵͳб */ +void InitSpace_b(FreeList avail); +/* +(01)ʼһڴ顣 +*/ + +WORD_b* AllocBuddy(FreeList avail, int n); +/* +(02)㷨8.2㷨 +*/ + +WORD_b* Buddy(WORD_b* p); +/* +(03)pڴĻڴַ +*/ + +void Reclaim_b(FreeList avail, WORD_b** p); +/* +(04)㷨 +*/ + +void PrintLayout_b(FreeList avail); +/* +(05)ǰڴַֹ +*/ + +#endif diff --git a/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection-main.c b/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection-main.c new file mode 100644 index 0000000..dead557 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection-main.c @@ -0,0 +1,73 @@ +/************************************ + * * + * ļ: 08 ̬洢 * + * * + * ļ: GarbageCollection-main.c * + * * + * : õԪѼغ * + * * + ************************************/ + +#include +#include "GarbageCollection.c" //**08 ̬洢**// + +/* ԭ */ +void Traverse(GList L, void(Visit)(GList)); +void print(GList L); + +int main(int argc, char *argv[]) +{ + GList G; + + printf(""); + { + SString S; + char *s = "((),(e),(a,(b,c,d)))"; + + StrAssign_Sq(S, s); + InitGList_GL_H_T(&G); + CreateGList_GL_H_T_1(&G, S); + Output_GL_H_T(G, Head); + printf("\n\n"); + } + PressEnter; + + printf("1\n MakeList ...\n"); //1.MakeList + { + printf("ǰı־״̬...\n"); + Traverse(G, print); + printf("\n"); + MakeList(G); + + PressEnter; + + printf("ʺı־״̬...\n"); + Traverse(G, print); + printf("\n"); + } + PressEnter; + + return 0; +} + +void Traverse(GList L, void(Visit)(GList)) +{ + if(L) + { + Visit(L); + + if(L->tag==List) + { + Traverse(L->Union.ptr.hp, Visit); + Traverse(L->Union.ptr.tp, Visit); + } + } +} + +void print(GList L) +{ + if(L->tag==Atom) + printf("mark = %d ԭӽ㣺%c\n", L->mark, L->Union.atom); + else + printf("mark = %d \n", L->mark); +} diff --git a/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection.c b/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection.c new file mode 100644 index 0000000..e217489 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection.c @@ -0,0 +1,85 @@ +/******************************* + * * + * ļ: 08 ̬洢 * + * * + * ļ: GarbageCollection.c * + * * + * : 8.3 * + * * + ******************************/ + +#ifndef GARBAGECOLLECTION_C +#define GARBAGECOLLECTION_C + +#include "GarbageCollection.h" //**08 ̬洢**// + +/*TTTT[ +U 㷨8.3U +^TTTT*/ +void MakeList(GList G) +{ + GList t, p, q; + + Status finished; + + if(G && G->mark==0) + { + t = NULL; //tΪpĸ + p = G; + finished = FALSE; + + while(!finished) + { + while(p->mark==0) + { + p->mark = 1; //MakeHead(p)ϸ + q = p->Union.ptr.hp; //qָpıͷ + + if(q!=NULL && q->mark==0) + { + if(q->tag==Atom) //ͷΪԭӽ + q->mark = 1; + else //ӱ + { + p->Union.ptr.hp = t; + p->tag = Atom; + t = p; + p = q; + } + } + } //ɶԱͷı + + q = p->Union.ptr.tp; + + if(q!=NULL && q->mark==0) //β + { + p->Union.ptr.tp = t; + t = p; + p = q; + } + else //BackTrack(finished)ϸ + { + while(t && t->tag==List) //㣬ӱβ + { + q = t; + t = q->Union.ptr.tp; + q->Union.ptr.tp = p; + p = q; + } + + if(t==NULL) // + finished = TRUE; + else //ӱͷ + { + q = t; + t = q->Union.ptr.hp; + q->Union.ptr.hp = p; + p = q; + p->tag = List; + } //β + } + } + } +} + +#endif diff --git a/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection.h b/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection.h new file mode 100644 index 0000000..e26b303 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/03 GarbageCollection/GarbageCollection.h @@ -0,0 +1,24 @@ +/******************************* + * * + * ļ: 08 ̬洢 * + * * + * ļ: GarbageCollection.h * + * * + * : õԪѼ * + * * + ******************************/ + +#ifndef GARBAGECOLLECTION_H +#define GARBAGECOLLECTION_H + +#include +#include "../../01 /Status.h" //**01 **// +#include "../../05 ͹/05 GeneralizedList-H&T/GeneralizedList-H-T.c" //**05 ͹**// + +/* õԪռб */ +void MakeList(GList G); +/* +(01)㷨8.3ջ +*/ + +#endif diff --git a/▲课本算法实现/▲08 动态存储管理/04 StorageCompacting/StorageCompacting-main.c b/▲课本算法实现/▲08 动态存储管理/04 StorageCompacting/StorageCompacting-main.c new file mode 100644 index 0000000..f7e848c --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/04 StorageCompacting/StorageCompacting-main.c @@ -0,0 +1,80 @@ +/************************************ + * * + * ļ: 08 ̬洢 * + * * + * ļ: StorageCompacting-main.c * + * * + * : 洢غ * + * * + ************************************/ + +#include +#include "StorageCompacting.c" //**08 ̬洢**// + +int main(int argc, char *argv[]) +{ + int *p1, *p4; + char *p2, *p5; + float *p3; + + printf("1\n InitMemory ...\n"); //1.InitMemory + { + printf("ʼһСΪ %d ڴ...\n", MAX); + InitMemory(MAX); + printf("\n"); + } + PressEnter; + + printf("5\n PrintLayout ...\n"); //5.PrintLayout + { + printf("ǰڴ...\n"); + PrintLayout(); + printf("\n"); + } + PressEnter; + + printf("23\n MallocMemoryCompressMemory ...\n");//23.MallocMemoryCompressMemory + { + printf("СΪ %d ڴ p1...\n", 100*sizeof(int)); + p1 = (int*)MallocMemory(100*sizeof(int)); + PrintLayout(); + printf("\n"); + PressEnter; + + printf("СΪ %d ڴ p2...\n", 100*sizeof(char)); + p2 = (char*)MallocMemory(100*sizeof(char)); + PrintLayout(); + printf("\n"); + PressEnter; + + printf("СΪ %d ڴ p3...\n", 100*sizeof(float)); + p3 = (float*)MallocMemory(100*sizeof(float)); + PrintLayout(); + printf("\n"); + } + PressEnter; + + printf("4\n FreeMemory ...\n"); //4.FreeMemory + { + printf("ͷ p2 ָڴ...\n"); + FreeMemory(p2); + PrintLayout(); + printf("\n"); + PressEnter; + + printf("СΪ %d ڴ p5...\n", 200*sizeof(char)); + p5 = (char*)MallocMemory(200*sizeof(char)); + PrintLayout(); + printf("\n"); + PressEnter; + + printf("СΪ %d ڴ p4...\n", sizeof(int)); + p4 = (int*)MallocMemory(100*sizeof(int)); + PrintLayout(); + printf("\n"); + } + PressEnter; + + return 0; +} + diff --git a/▲课本算法实现/▲08 动态存储管理/04 StorageCompacting/StorageCompacting.c b/▲课本算法实现/▲08 动态存储管理/04 StorageCompacting/StorageCompacting.c new file mode 100644 index 0000000..966d1a2 --- /dev/null +++ b/▲课本算法实现/▲08 动态存储管理/04 StorageCompacting/StorageCompacting.c @@ -0,0 +1,98 @@ +/******************************* + * * + * ļ: 08 ̬洢 * + * * + * ļ: StorageCompacting.c * + * * + *******************************/ + +#ifndef STORAGECOMPACTING_C +#define STORAGECOMPACTING_C + +#include "StorageCompacting.h" //**08 ̬洢**// + +void InitMemory(int n) +{ + void *p = malloc(n); + + start = (int)p; + end = start + n - 1; + cur = start; +} + +void* MallocMemory(int n) +{ + void *p; + + if(cur+n-1>end) //ռ䲻ѹ + cur = CompressMemory(); + + if(cur+n-1>end) //ѹռȻ + { + printf("ڴ޷ռ䣡\n"); + return NULL; + } + else + { + p = (void*)cur; + + Record[0].length++; //ڴַӴ˼¼ + Record[Record[0].length].stadr = cur; + Record[Record[0].length].length = n; + + cur += n; + } + + return p; +} + +void FreeMemory(void* ptr) +{ + int i, j; + + for(i=1; i<=Record[0].length; i++) + { + if(Record[i].stadr==(int)ptr) //ڴַѹ + { + for(j=i; j +#include +#include +#include "../../01 /Status.h" //**01 **// + +/* 궨 */ +#define MAX 1000 + +/* ȫֱ */ +struct +{ + int stadr; //ǰڴʼַ + int length; //ǰڴС +}Record[MAX+1]; //ڴַ + +int start, end; //ڴ׺ף̶ +int cur; //ǰڴ㣨 + +/* 洢б */ +void InitMemory(int n); +/* +(01)ʼһСΪ n Ŀڴ顣 +*/ + +void* MallocMemory(int n); +/* +(02)һСΪ n Ŀڴ飬ɹַ +*/ + +void FreeMemory(void* ptr); +/* +(03)ͷŵַ ptr Ŀڴ顣 +*/ + +int CompressMemory(); +/* +(04)洢㷨ѹڴ鵱ǰʼַ +*/ + +void PrintLayout(); +/* +(05)ǰСǿڴ +*/ + +#endif