From 88c08be0dc266c8d73201ea4b82d80d38dceee0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=B7=E5=BB=BA=E4=BC=9F?= Date: Thu, 16 Apr 2020 11:34:18 +0800 Subject: [PATCH] =?UTF-8?q?:bulb:=20<08=20=E5=8A=A8=E6=80=81=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E7=AE=A1=E7=90=86>=E4=B9=A0=E9=A2=98=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLion/ExerciseBook/08.11-08.12/08.11-08.12.c | 126 +++++ CLion/ExerciseBook/08.11-08.12/CMakeLists.txt | 12 + CLion/ExerciseBook/08.11-08.12/SqStack.c | 90 ++++ CLion/ExerciseBook/08.11-08.12/SqStack.h | 59 +++ CLion/ExerciseBook/08.13/08.13.c | 65 +++ CLion/ExerciseBook/08.13/BoundaryTagMethod.c | 330 +++++++++++++ CLion/ExerciseBook/08.13/BoundaryTagMethod.h | 96 ++++ CLion/ExerciseBook/08.13/CMakeLists.txt | 12 + CLion/ExerciseBook/08.14/08.14.c | 66 +++ CLion/ExerciseBook/08.14/BuddySystem.c | 283 +++++++++++ CLion/ExerciseBook/08.14/BuddySystem.h | 89 ++++ CLion/ExerciseBook/08.14/CMakeLists.txt | 12 + CLion/ExerciseBook/08.15/08.15.c | 85 ++++ CLion/ExerciseBook/08.15/CMakeLists.txt | 12 + CLion/ExerciseBook/08.15/MemoryManager.c | 131 ++++++ CLion/ExerciseBook/08.15/MemoryManager.h | 57 +++ CLion/ExerciseBook/08.16/08.16.c | 441 +++++++++++++++++ CLion/ExerciseBook/08.16/CMakeLists.txt | 12 + CLion/ExerciseBook/08.16/MemoryManager.c | 239 ++++++++++ CLion/ExerciseBook/08.16/MemoryManager.h | 63 +++ CLion/ExerciseBook/08.16/SqList.c | 173 +++++++ CLion/ExerciseBook/08.16/SqList.h | 94 ++++ CLion/ExerciseBook/08.16/TestData_8_10.md | 17 + CLion/ExerciseBook/08.16/习题8.10测试数据.png | Bin 0 -> 56307 bytes CLion/ExerciseBook/CMakeLists.txt | 6 + .../ExerciseBook/08.11-08.12/08.11-08.12.cpp | 127 +++++ .../ExerciseBook/08.11-08.12/08.11-08.12.dev | 82 ++++ Dev-C++/ExerciseBook/08.11-08.12/SqStack.cpp | 91 ++++ Dev-C++/ExerciseBook/08.11-08.12/SqStack.h | 60 +++ Dev-C++/ExerciseBook/08.13/08.13.cpp | 66 +++ Dev-C++/ExerciseBook/08.13/08.13.dev | 82 ++++ .../ExerciseBook/08.13/BoundaryTagMethod.cpp | 331 +++++++++++++ .../ExerciseBook/08.13/BoundaryTagMethod.h | 97 ++++ Dev-C++/ExerciseBook/08.14/08.14.cpp | 67 +++ Dev-C++/ExerciseBook/08.14/08.14.dev | 82 ++++ Dev-C++/ExerciseBook/08.14/BuddySystem.cpp | 284 +++++++++++ Dev-C++/ExerciseBook/08.14/BuddySystem.h | 90 ++++ Dev-C++/ExerciseBook/08.15/08.15.cpp | 86 ++++ Dev-C++/ExerciseBook/08.15/08.15.dev | 82 ++++ Dev-C++/ExerciseBook/08.15/MemoryManager.cpp | 132 ++++++ Dev-C++/ExerciseBook/08.15/MemoryManager.h | 58 +++ Dev-C++/ExerciseBook/08.16/08.16.cpp | 443 ++++++++++++++++++ Dev-C++/ExerciseBook/08.16/08.16.dev | 111 +++++ Dev-C++/ExerciseBook/08.16/MemoryManager.cpp | 240 ++++++++++ Dev-C++/ExerciseBook/08.16/MemoryManager.h | 64 +++ Dev-C++/ExerciseBook/08.16/SqList.cpp | 174 +++++++ Dev-C++/ExerciseBook/08.16/SqList.h | 95 ++++ Dev-C++/ExerciseBook/08.16/TestData_8_10.md | 17 + .../ExerciseBook/08.16/习题8.10测试数据.png | Bin 0 -> 56307 bytes .../ExerciseBook/08.11-08.12/08.11-08.12.c | 126 +++++ .../08.11-08.12/08.11-08.12.vcxproj | 76 +++ .../08.11-08.12/08.11-08.12.vcxproj.filters | 30 ++ .../08.11-08.12/08.11-08.12.vcxproj.user | 3 + VisualC++/ExerciseBook/08.11-08.12/SqStack.c | 90 ++++ VisualC++/ExerciseBook/08.11-08.12/SqStack.h | 59 +++ VisualC++/ExerciseBook/08.13/08.13.c | 65 +++ VisualC++/ExerciseBook/08.13/08.13.vcxproj | 76 +++ .../ExerciseBook/08.13/08.13.vcxproj.filters | 30 ++ .../ExerciseBook/08.13/08.13.vcxproj.user | 3 + .../ExerciseBook/08.13/BoundaryTagMethod.c | 330 +++++++++++++ .../ExerciseBook/08.13/BoundaryTagMethod.h | 96 ++++ VisualC++/ExerciseBook/08.14/08.14.c | 66 +++ VisualC++/ExerciseBook/08.14/08.14.vcxproj | 76 +++ .../ExerciseBook/08.14/08.14.vcxproj.filters | 30 ++ .../ExerciseBook/08.14/08.14.vcxproj.user | 3 + VisualC++/ExerciseBook/08.14/BuddySystem.c | 283 +++++++++++ VisualC++/ExerciseBook/08.14/BuddySystem.h | 89 ++++ VisualC++/ExerciseBook/08.15/08.15.c | 85 ++++ VisualC++/ExerciseBook/08.15/08.15.vcxproj | 76 +++ .../ExerciseBook/08.15/08.15.vcxproj.filters | 30 ++ .../ExerciseBook/08.15/08.15.vcxproj.user | 3 + VisualC++/ExerciseBook/08.15/MemoryManager.c | 131 ++++++ VisualC++/ExerciseBook/08.15/MemoryManager.h | 57 +++ VisualC++/ExerciseBook/08.16/08.16.c | 442 +++++++++++++++++ VisualC++/ExerciseBook/08.16/08.16.vcxproj | 81 ++++ .../ExerciseBook/08.16/08.16.vcxproj.filters | 41 ++ .../ExerciseBook/08.16/08.16.vcxproj.user | 3 + VisualC++/ExerciseBook/08.16/MemoryManager.c | 240 ++++++++++ VisualC++/ExerciseBook/08.16/MemoryManager.h | 63 +++ VisualC++/ExerciseBook/08.16/SqList.c | 173 +++++++ VisualC++/ExerciseBook/08.16/SqList.h | 94 ++++ VisualC++/ExerciseBook/08.16/TestData_8_10.md | 17 + .../ExerciseBook/08.16/习题8.10测试数据.png | Bin 0 -> 56307 bytes VisualC++/ExerciseBook/ExerciseBook.sdf | Bin 8343552 -> 8343552 bytes VisualC++/ExerciseBook/ExerciseBook.sln | 30 ++ VisualC++/ExerciseBook/ExerciseBook.suo | Bin 332800 -> 345600 bytes 86 files changed, 8628 insertions(+) create mode 100644 CLion/ExerciseBook/08.11-08.12/08.11-08.12.c create mode 100644 CLion/ExerciseBook/08.11-08.12/CMakeLists.txt create mode 100644 CLion/ExerciseBook/08.11-08.12/SqStack.c create mode 100644 CLion/ExerciseBook/08.11-08.12/SqStack.h create mode 100644 CLion/ExerciseBook/08.13/08.13.c create mode 100644 CLion/ExerciseBook/08.13/BoundaryTagMethod.c create mode 100644 CLion/ExerciseBook/08.13/BoundaryTagMethod.h create mode 100644 CLion/ExerciseBook/08.13/CMakeLists.txt create mode 100644 CLion/ExerciseBook/08.14/08.14.c create mode 100644 CLion/ExerciseBook/08.14/BuddySystem.c create mode 100644 CLion/ExerciseBook/08.14/BuddySystem.h create mode 100644 CLion/ExerciseBook/08.14/CMakeLists.txt create mode 100644 CLion/ExerciseBook/08.15/08.15.c create mode 100644 CLion/ExerciseBook/08.15/CMakeLists.txt create mode 100644 CLion/ExerciseBook/08.15/MemoryManager.c create mode 100644 CLion/ExerciseBook/08.15/MemoryManager.h create mode 100644 CLion/ExerciseBook/08.16/08.16.c create mode 100644 CLion/ExerciseBook/08.16/CMakeLists.txt create mode 100644 CLion/ExerciseBook/08.16/MemoryManager.c create mode 100644 CLion/ExerciseBook/08.16/MemoryManager.h create mode 100644 CLion/ExerciseBook/08.16/SqList.c create mode 100644 CLion/ExerciseBook/08.16/SqList.h create mode 100644 CLion/ExerciseBook/08.16/TestData_8_10.md create mode 100644 CLion/ExerciseBook/08.16/习题8.10测试数据.png create mode 100644 Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.cpp create mode 100644 Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.dev create mode 100644 Dev-C++/ExerciseBook/08.11-08.12/SqStack.cpp create mode 100644 Dev-C++/ExerciseBook/08.11-08.12/SqStack.h create mode 100644 Dev-C++/ExerciseBook/08.13/08.13.cpp create mode 100644 Dev-C++/ExerciseBook/08.13/08.13.dev create mode 100644 Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.cpp create mode 100644 Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.h create mode 100644 Dev-C++/ExerciseBook/08.14/08.14.cpp create mode 100644 Dev-C++/ExerciseBook/08.14/08.14.dev create mode 100644 Dev-C++/ExerciseBook/08.14/BuddySystem.cpp create mode 100644 Dev-C++/ExerciseBook/08.14/BuddySystem.h create mode 100644 Dev-C++/ExerciseBook/08.15/08.15.cpp create mode 100644 Dev-C++/ExerciseBook/08.15/08.15.dev create mode 100644 Dev-C++/ExerciseBook/08.15/MemoryManager.cpp create mode 100644 Dev-C++/ExerciseBook/08.15/MemoryManager.h create mode 100644 Dev-C++/ExerciseBook/08.16/08.16.cpp create mode 100644 Dev-C++/ExerciseBook/08.16/08.16.dev create mode 100644 Dev-C++/ExerciseBook/08.16/MemoryManager.cpp create mode 100644 Dev-C++/ExerciseBook/08.16/MemoryManager.h create mode 100644 Dev-C++/ExerciseBook/08.16/SqList.cpp create mode 100644 Dev-C++/ExerciseBook/08.16/SqList.h create mode 100644 Dev-C++/ExerciseBook/08.16/TestData_8_10.md create mode 100644 Dev-C++/ExerciseBook/08.16/习题8.10测试数据.png create mode 100644 VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.c create mode 100644 VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj create mode 100644 VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.user create mode 100644 VisualC++/ExerciseBook/08.11-08.12/SqStack.c create mode 100644 VisualC++/ExerciseBook/08.11-08.12/SqStack.h create mode 100644 VisualC++/ExerciseBook/08.13/08.13.c create mode 100644 VisualC++/ExerciseBook/08.13/08.13.vcxproj create mode 100644 VisualC++/ExerciseBook/08.13/08.13.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/08.13/08.13.vcxproj.user create mode 100644 VisualC++/ExerciseBook/08.13/BoundaryTagMethod.c create mode 100644 VisualC++/ExerciseBook/08.13/BoundaryTagMethod.h create mode 100644 VisualC++/ExerciseBook/08.14/08.14.c create mode 100644 VisualC++/ExerciseBook/08.14/08.14.vcxproj create mode 100644 VisualC++/ExerciseBook/08.14/08.14.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/08.14/08.14.vcxproj.user create mode 100644 VisualC++/ExerciseBook/08.14/BuddySystem.c create mode 100644 VisualC++/ExerciseBook/08.14/BuddySystem.h create mode 100644 VisualC++/ExerciseBook/08.15/08.15.c create mode 100644 VisualC++/ExerciseBook/08.15/08.15.vcxproj create mode 100644 VisualC++/ExerciseBook/08.15/08.15.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/08.15/08.15.vcxproj.user create mode 100644 VisualC++/ExerciseBook/08.15/MemoryManager.c create mode 100644 VisualC++/ExerciseBook/08.15/MemoryManager.h create mode 100644 VisualC++/ExerciseBook/08.16/08.16.c create mode 100644 VisualC++/ExerciseBook/08.16/08.16.vcxproj create mode 100644 VisualC++/ExerciseBook/08.16/08.16.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/08.16/08.16.vcxproj.user create mode 100644 VisualC++/ExerciseBook/08.16/MemoryManager.c create mode 100644 VisualC++/ExerciseBook/08.16/MemoryManager.h create mode 100644 VisualC++/ExerciseBook/08.16/SqList.c create mode 100644 VisualC++/ExerciseBook/08.16/SqList.h create mode 100644 VisualC++/ExerciseBook/08.16/TestData_8_10.md create mode 100644 VisualC++/ExerciseBook/08.16/习题8.10测试数据.png diff --git a/CLion/ExerciseBook/08.11-08.12/08.11-08.12.c b/CLion/ExerciseBook/08.11-08.12/08.11-08.12.c new file mode 100644 index 0000000..50f7aac --- /dev/null +++ b/CLion/ExerciseBook/08.11-08.12/08.11-08.12.c @@ -0,0 +1,126 @@ +#include +#include "Status.h" +#include "SqStack.h" + +/* 宏定义 */ +#define MAXSIZE 200 // 内存总大小 + + +/* 空闲空间类型定义 */ +typedef struct { + void* base; // 可用空间内存的起始地址 + int size; // 空闲空间大小(按字节计数) + SqStack block; // 已经使用的内存块大小,先申请的内存信息先入栈 +} Space; + + +// 初始化内存空间及内存信息栈 +void InitSpace(Space* space); + +// 打印内存布局,查看当前内存的使用情况 +void PrintMemoryLayout(Space space); + +// 申请大小为n的内存块,返回申请到的内存起始地址 +void* Algo_8_11(Space* space, int n); + +// 回收内存,遵循"最后分配者最先释放"的原则 +Status Algo_8_12(Space* space); + + +int main(int argc, char* argv[]) { + Space space; + int s[5] = {50, 50, 150, 100, 50}; // 定义内存申请数量 + int i; + + // 初始化内存 + InitSpace(&space); + PrintMemoryLayout(space); + printf("\n"); + + // 申请/释放内存 + for(i = 0; i < 5; i++) { + printf("申请 %d 个内存后...\n", s[i]); + Algo_8_11(&space, s[i]); + PrintMemoryLayout(space); + printf("\n"); + } + + return 0; +} + + +// 初始化一块空闲空间 +void InitSpace(Space* space) { + // 申请MAX字节的空间(假设总能初始化成功) + space->base = malloc(MAXSIZE); + space->size = MAXSIZE; + + // 初始化内存信息栈 + InitStack(&(space->block)); +} + +// 打印内存布局,查看当前内存的使用情况 +void PrintMemoryLayout(Space space) { + int i; + + for(i = 1; i <= MAXSIZE; i++) { + if(i <= space.size) { + printf("□"); + } else { + printf("■"); + } + + // 预定每隔20个换一下行 + if(i % 20 == 0) { + printf("\n"); + } + } + + if(MAXSIZE % 20 != 0) { + printf("\n"); + } +} + +// 申请大小为n的内存块,返回申请到的内存起始地址 +void* Algo_8_11(Space* space, int n) { + + /* + * 如果可用的内存数量少于申请的内存数量, + * 则需要释放最近申请使用的内存以腾出空间。 + */ + while(space->size < n && Algo_8_12(space) == OK) { + // 直到空闲内存满足申请要求,或者全部占用内存已经释放,才会退出循环 + } + + // 如果没有足够的内存可用,则返回空指针 + if(space->size < n) { + return NULL; + } + + // 可用空间减小 + space->size -= n; + + // 记下成功申请到的内存 + Push(&(space->block), n); + + // 返回申请到的内存起始地址 + return space->base + space->size; +} + +// 回收内存,遵循"最后分配者最先释放"的原则 +Status Algo_8_12(Space* space) { + int e; + + // 已经没有可释放内存时,返回ERROR + if(StackEmpty(space->block)) { + return ERROR; + } + + // 将最后申请的内存释放掉 + Pop(&(space->block), &e); + + // 可用空间增大 + space->size += e; + + return OK; +} diff --git a/CLion/ExerciseBook/08.11-08.12/CMakeLists.txt b/CLion/ExerciseBook/08.11-08.12/CMakeLists.txt new file mode 100644 index 0000000..33be287 --- /dev/null +++ b/CLion/ExerciseBook/08.11-08.12/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(08.11-08.12 SqStack.h SqStack.c 08.11-08.12.c) +# 链接公共库 +target_link_libraries(08.11-08.12 Scanf_lib) + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/08.11-08.12/SqStack.c b/CLion/ExerciseBook/08.11-08.12/SqStack.c new file mode 100644 index 0000000..d709204 --- /dev/null +++ b/CLion/ExerciseBook/08.11-08.12/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * 栈的顺序存储结构(顺序栈) + ==========================*/ + +#include "SqStack.h" //**▲03 栈和队列**// + +/* + * 初始化 + * + * 构造一个空栈。初始化成功则返回OK,否则返回ERROR。 + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * 判空 + * + * 判断顺序栈中是否包含有效数据。 + * + * 返回值: + * TRUE : 顺序栈为空 + * FALSE: 顺序栈不为空 + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // 栈满时,追加存储空间 + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 存储分配失败 + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // 进栈先赋值,栈顶指针再自增 + *(S->top++) = e; + + return OK; +} + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // 出栈栈顶指针先递减,再赋值 + *e = *(--(*S).top); + + return OK; +} diff --git a/CLion/ExerciseBook/08.11-08.12/SqStack.h b/CLion/ExerciseBook/08.11-08.12/SqStack.h new file mode 100644 index 0000000..e840954 --- /dev/null +++ b/CLion/ExerciseBook/08.11-08.12/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * 栈的顺序存储结构(顺序栈) + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define STACK_INIT_SIZE 100 // 顺序栈存储空间的初始分配量 +#define STACKINCREMENT 10 // 顺序栈存储空间的分配增量 + +/* 顺序栈元素类型定义 */ +typedef int SElemType; + +// 顺序栈元素结构 +typedef struct { + SElemType* base; // 栈底指针 + SElemType* top; // 栈顶指针 + int stacksize; // 当前已分配的存储空间,以元素为单位 +} SqStack; + + +/* + * 初始化 + * + * 构造一个空栈。初始化成功则返回OK,否则返回ERROR。 + */ +Status InitStack(SqStack* S); + +/* + * 判空 + * + * 判断顺序栈中是否包含有效数据。 + * + * 返回值: + * TRUE : 顺序栈为空 + * FALSE: 顺序栈不为空 + */ +Status StackEmpty(SqStack S); + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e); + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/CLion/ExerciseBook/08.13/08.13.c b/CLion/ExerciseBook/08.13/08.13.c new file mode 100644 index 0000000..14977f0 --- /dev/null +++ b/CLion/ExerciseBook/08.13/08.13.c @@ -0,0 +1,65 @@ +#include +#include "BoundaryTagMethod.h" //**▲08 动态存储管理**// + +/* + * 边界标识法的内存回收算法 + * + * 对指针p处的内存进行释放 + */ +void Algo_8_13(Space* pav, Space p); + + +int main(int argc, char* argv[]) { + Space pav; + Space p[12]; // 记录申请到的内存的指针 + int s[12] = {10, 20, 30, 50, 5, 15, 10, 5, 15, 15, 2, 20}; // 申请的空间大小 + int i = 0; + + printf("████████ InitSpace \n"); + { + int max = 200; // 初值建议为20的倍数,目的是打印出来可以对齐 + + printf("初始化包含 %d 个\"字\"的内存块后,当前内存布局为:\n", max); + pav = InitSpace(max); + PrintMemoryLayout(); + printf("\n"); + } + PressEnterToContinue(debug); + + printf("████████ AllocBoundTag \n"); + { + for(i = 0; i < 12; i++) { + printf("████ %2d> 申请 %d 个\"字\"的内存后,当前内存布局为:\n", i + 1, s[i]); + p[i] = AllocBoundTag(&pav, s[i]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + printf("████████ FreeBoundTag \n"); + { + // 定义一个指针回收顺序 + int a[10] = {7, 3, 10, 6, 8, 5, 11, 1, 0, 4}; + + for(i = 0; i < 10; i++) { + printf("回收 p%d 指向的内存...\n", a[i] + 1); + Algo_8_13(&pav, p[a[i]]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * 边界标识法的内存回收算法 + * + * 对指针p处的内存进行释放 + */ +void Algo_8_13(Space* pav, Space p) { + FreeBoundTag(pav, p); +} diff --git a/CLion/ExerciseBook/08.13/BoundaryTagMethod.c b/CLion/ExerciseBook/08.13/BoundaryTagMethod.c new file mode 100644 index 0000000..cb98ca3 --- /dev/null +++ b/CLion/ExerciseBook/08.13/BoundaryTagMethod.c @@ -0,0 +1,330 @@ +/*============== + * 边界标识法 + * + * 包含算法: 8.1 + ===============*/ + +#include "BoundaryTagMethod.h" //**▲08 动态存储管理**// + +/* + * 全局变量:永远指向初始空间的头部。 + * 该变量有两个作用: + * 1.用来追踪内存布局,即查看内存的使用情况。 + * 2.指示内存的起始和结尾 + */ +static Space av; + +// 记录空间容量,用于追踪内存布局 +static int len; + + +/* + * 初始化一块总大小为n个字的内存,并返回指向该内存的起点的指针 + * 注:返回的初始内存已经包含了head和foot。 + */ +Space InitSpace(int n) { + Space space, head, foot; + + // 初始化空闲内存 + space = (Space) malloc(n * sizeof(WORD)); + if(space == NULL) { + return NULL; + } + + // 初始化头部信息 + head = space; + head->llink = space; // 前驱指向自身 + head->rlink = space; // 后继指向自身 + head->size = n; // 空间大小,已经包含了head和foot + head->tag = 0; // 标记空间空闲 + + // 初始化底部信息 + foot = FootLoc(head); // 初始化底部指针 + foot->uplink = head; // 底部域链接到本结点的头部 + foot->tag = 0; // 标记空间空闲 + + // 记下空间的起始位置和容量 + av = space; + len = n; + + return space; +} + +/* + * ████████ 算法8.1 ████████ + * + * 边界标识法的内存分配算法 + * + * 从空间pav中申请一块大小至少为n的空间,并返回指向申请到的空间的指针。如果分配失败,则返回NULL。 + * 为了使分配后的剩余块尽量均匀分布,每次分配完之后都要把空间指针pav向前移动,具体描述参见教材。 + * + * 注: + * 1.这里采用首次拟合法,即一遇到满足条件的内存块就进行分配操作。 + * 2.为了避免空间碎片化过快,这里增加了一个容差e,具体含义参考教材描述。 + * 3.这里申请分配n个字的空间,指的是已经完成换算的空间。 + * 比如用户想要容量为10个字的空间,但每个空间又包含head和foot这两个字存储空间使用信息, + * 因此实际上分配的空间大小应为12个字,这个"12"就是n的含义。 + * 教材中提到"head和foot在分配时忽略不计",这样是为了伪码书写的方便。实际写代码时,这两个空间是不能忽略的。 + * 但是如果按照上面的描述,把n解释为已经换算后空间,而不是用户原始申请的空间, + * 那么既满足了没有忽略空间,又满足了在书面效果上,跟教材伪码统一,可谓两全其美。 + */ +Space AllocBoundTag(Space* pav, int n) { + Space p, f; + + /* + * 增加一个判断:如果换算后的空间容量小于3,则直接返回。 + * 因为head和foot本身就占了2个字空间,用户至少申请1个字的话,总申请空间至少为3个字。 + */ + if(n < 3) { + printf("日志:分配失败!申请的\"字\"数应当不小于3\n"); + return NULL; + } + + // 查找不小于n的空闲块 + for(p = *pav; p && p->size < n && p->rlink != *pav; p = p->rlink) { + } + + // 找不到合适的空闲块,返回空指针 + if(!p || p->size < n) { + return NULL; + } + + /* 至此,p指向了满足条件的空闲块 */ + + // 让f指向该空闲块的底部 + f = FootLoc(p); + + // pav指向p结点的后继结点,即指向下一个空闲块 + *pav = p->rlink; + + // 如果空闲块比申请的容量大不了多少,则需要整块分配,即不保留<=e的剩余量 + if(p->size - n <= e) { + // 由于上面已经让pav指向了下一个空闲块,所以如果pav与p相等,说明此时只有一个空闲块了(注意空闲块链表是双循环的) + if(*pav == p) { + *pav = NULL; // 如果仅剩一个空闲块了,那么被占用后,可利用空间表变为空表 + + // 否则,在表中删除分配的结点 + } else { + (*pav)->llink = p->llink; // 修改pav的前驱 + p->llink->rlink = *pav; // 修改pav前驱的后继 + + /* 在上述操作中,p结点的前驱与后继并没有改变,这是为了方便将来的回收操作 */ + } + + // 更新占用块为占用状态 + p->tag = f->tag = 1; + + printf("日志:分配成功!申请 %d 个\"字\",实际分配了 %d 个\"字\"。空闲空间容量为 %d ...\n", n, n + e, AvailableSpace(*pav)); + + // 如果空闲块很大,则从中间切割,占用后面的n个字 + } else { + f->tag = 1; // 修改分配块的底部标志,表示其处于占用状态 + p->size -= n; // 设置剩余块大小 + + f = FootLoc(p); // 计算剩余块的新底部位置 + f->tag = 0; // 设置新底部标志为空闲 + f->uplink = p; // 新底部依然指向空闲块头部 + + p = f + 1; // 计算分配块的新头部位置 + p->tag = 1; // 设置分配块新头部标志为占用 + p->size = n; // 设置分配块的容量 + + // 修改分配块底部的链接(教材中缺失了此步骤) + (FootLoc(p))->uplink = p; + + printf("日志:分配成功!申请并分配了 %d 个\"字\"。空闲空间容量为 %d ...\n", n, AvailableSpace(*pav)); + } + + // 返回分配块首地址 + return p; +} + +/* + * 边界标识法的内存回收算法 + * + * 对指针p处的内存进行释放(这类似于free(),只是对内存进行释放操作,至于置空指针p的操作,应交给调用方完成) + * + * 注:以下描述中的"释放块"就是指针p指向的内存 + */ +void FreeBoundTag(Space* pav, Space p) { + Space h, f, q; + int Ltag, Rtag; + + if(p == NULL) { + printf("日志:回收失败!内存指针为空。空闲空间容量为 %d ...\n", AvailableSpace(*pav)); + return; + } + + Ltag = p == av ? 1 : (p - 1)->tag; // 块p的左邻区标志。特别注意,如果块p位于内存起始处,则认为它的左邻区为占用。 + Rtag = (p + p->size) == (av + len) ? 1 : (p + p->size)->tag; // 块p的右邻区标志。特别注意,如果块p位于内存结尾处,则认为它的右邻区为占用。 + + /* + * 1.释放块的左、右邻区均为占用块 + * + * 此时仅需要将块p插入到pav所指结点的之前即可(当然,插入到之后也是可以的) + */ + if(Ltag == 1 && Rtag == 1) { + printf("日志:\"释放块\"的容量为 %d ,且它的左、右邻区均为占用块...\n", p->size); + + f = FootLoc(p); + f->uplink = p; + f->tag = 0; + + p->tag = 0; + + // 空闲链表为空时,直接将块p变为新的独立的空闲块 + if((*pav) == NULL) { + *pav = p->llink = p->rlink = p; + + // 否则,将块p插入到pav之前 + } else { + q = (*pav)->llink; + p->rlink = *pav; + p->llink = q; + q->rlink = (*pav)->llink = p; + + // 令刚释放的结点成为下次分配空间时最先查找的结点 + *pav = p; + } + + printf("日志:回收成功!空闲空间容量为 %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 2.释放块的左邻区为空闲块,右邻区为占用块 + * + * 此时需要合并左邻区与释放块 + */ + if(Ltag == 0 && Rtag == 1) { + printf("日志:\"释放块\"的容量为 %d ,且它的左邻区为空闲块,右邻区为占用块...\n", p->size); + + h = (p - 1)->uplink; // 左邻区的头部,这将成为合并后的新块的头部 + h->size += p->size; // 左邻区容量增大 + + f = FootLoc(p); // 将释放块的底部做为合并后的新块的底部 + f->uplink = h; + f->tag = 0; + + printf("日志:回收成功!空闲空间容量为 %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 3.释放块的左邻区为占用块,右邻区为空闲块 + * + * 此时需要合并释放块与右邻区 + */ + if(Ltag == 1 && Rtag == 0) { + printf("日志:\"释放块\"的容量为 %d ,且它的左邻区为占用块,右邻区为空闲块...\n", p->size); + + h = p + p->size; // 右邻区的头部 + + f = FootLoc(h); // 右邻区的底部,这将成为合并后的新块的底部 + f->uplink = p; // 释放块的头部将作为合并后新块的头部 + + p->tag = 0; + p->size += h->size; + + // 释放块的头部链接域要更新为与右邻区头部的链接域一致 + p->llink = h->llink; + p->rlink = h->rlink; + h->llink->rlink = p; + h->rlink->llink = p; + + // pav指向合并后的结点的新头部 + *pav = p; + + printf("日志:回收成功!空闲空间容量为 %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 4.释放块的左、右邻区均为空闲块 + * + * 此时需要合并左邻区、释放块、右邻区 + */ + if(Ltag == 0 && Rtag == 0) { + printf("日志:\"释放块\"的容量为 %d ,且它的左、右邻区均为空闲块...\n", p->size); + + h = (p - 1)->uplink; // 左邻区的头部,这将成为合并后的新块的头部 + q = p + p->size; // 右邻区的头部 + f = FootLoc(q); // 右邻区的底部,这将成为合并后的新块的底部 + + h->size += p->size + q->size; // 合并后的新块大小 + f->uplink = h; // 新块底部信息也要更新 + + // 移除右邻区 + q->rlink->llink = q->llink; + q->llink->rlink = q->rlink; + + printf("日志:回收成功!空闲空间容量为 %d ...\n", AvailableSpace(*pav)); + + return; + } +} + +/* + * 打印内存布局,查看当前内存的使用情况 + * 注:仅限内部测试使用 + */ +void PrintMemoryLayout() { + Space p; + int count; + int i; + + p = av; + count = av->size; + + for(i = 1; i <= count; i++) { + if(p->tag == 0) { + printf("□"); + } else { + printf("■"); + } + + if(i == count && count < len) { + p = p + p->size; + count += p->size; + printf("|"); + } else { + printf(" "); + } + + // 每隔20个换一下行 + if(i % 20 == 0) { + printf("\n"); + } + } + + if(len % 20 != 0) { + printf("\n"); + } +} + +/* + * 计算可用的空闲空间容量 + * + * 注:仅限内部使用,用在日志打印中 + */ +static int AvailableSpace(Space pav) { + Space p; + int count; + + if(pav == NULL) { + return 0; + } + + p = pav; + count = 0; + + do { + count += p->size; + p = p->rlink; + } while(p != pav); + + return count; +} diff --git a/CLion/ExerciseBook/08.13/BoundaryTagMethod.h b/CLion/ExerciseBook/08.13/BoundaryTagMethod.h new file mode 100644 index 0000000..78ba5d0 --- /dev/null +++ b/CLion/ExerciseBook/08.13/BoundaryTagMethod.h @@ -0,0 +1,96 @@ +/*============== + * 边界标识法 + * + * 包含算法: 8.1 + ===============*/ + +#ifndef BOUNDARYTAGMETHOD_H +#define BOUNDARYTAGMETHOD_H + +#include +#include +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define e 5 // 分配空间时用到的容差 +#define FootLoc(p) p+(p->size)-1 // 将p指针定位到p所指内存块的底部 + + +/* + * 内存"字"的类型定义 + * + * 所谓"字"是指空间分配的最小单位,它不是字节。 + * 一个"字"有多大,取决于对"字"结构是如何定义的。 + */ +typedef struct WORD { + + /* + * 注: + * 教材中将llink和uplink封装在了一个联合体中,个人感觉这个封装有些鸡肋。 + * 一方面,head和foot的公共部分其实只有tag,如果真想用联合体,那么应当把size和rlink也封装起来。 + * 另一方面,这个封装节省的空间很有限,而且直接影响了代码的可读性。 + * 这里只是教学代码,而不是真实的系统代码,所以空间考虑在其次,原理展示为首要任务。 + * 此外,教材中的伪码中也并没有考虑这个联合体,而是直接进行操作的。 + * 综上所述,这里去除了教材中的联合体结构。 + * 如想观察带有联合体的写法,可以参考CFree分支的代码。 + */ + + int tag; // 块标志,0空闲,1占用,头部和尾部均有 + + struct WORD* llink; // 头部域,指向前驱结点 + struct WORD* rlink; // 头部域,指向后继结点 + int size; // 头部域,块大小 + + struct WORD* uplink; // 底部域,指向本结点头部 +} WORD; + +typedef WORD* Space; // Space:指向可利用空间的指针类型 + + +/* + * 初始化一块大小为n个字的内存,并返回指向该内存的起点的指针 + * 注:返回的初始内存已经包含了head和foot。 + */ +Space InitSpace(int n); + +/* + * ████████ 算法8.1 ████████ + * + * 边界标识法的内存分配算法 + * + * 从空间pav中申请一块大小至少为n的空间,并返回指向申请到的空间的指针。如果分配失败,则返回NULL。 + * 为了使分配后的剩余块尽量均匀分布,每次分配完之后都要把空间指针pav向前移动,具体描述参见教材。 + * + * 注: + * 1.这里采用首次拟合法,即一遇到满足条件的内存块就进行分配操作。 + * 2.为了避免空间碎片化过快,这里增加了一个容差e,具体含义参考教材描述。 + * 3.这里申请分配n个字的空间,指的是已经完成换算的空间。 + * 比如用户想要容量为10个字的空间,但每个空间又包含head和foot这两个字存储空间使用信息, + * 因此实际上分配的空间大小应为12个字,这个"12"就是n的含义。 + * 教材中提到"head和foot在分配时忽略不计",这样是为了伪码书写的方便。实际写代码时,这两个空间是不能忽略的。 + * 但是如果按照上面的描述,把n解释为已经换算后空间,而不是用户原始申请的空间, + * 那么既满足了没有忽略空间,又满足了在书面效果上,跟教材伪码统一,可谓两全其美。 + */ +Space AllocBoundTag(Space* pav, int n); + +/* + * 边界标识法的内存回收算法 + * + * 对指针p处的内存进行释放 + */ +void FreeBoundTag(Space* pav, Space p); + +/* + * 打印内存布局,查看当前内存的使用情况 + * 注:仅限内部测试使用 + */ +void PrintMemoryLayout(); + +/* + * 计算可用的空闲空间容量 + * + * 注:仅限内部使用,用在日志打印中 + */ +static int AvailableSpace(Space pav); + +#endif diff --git a/CLion/ExerciseBook/08.13/CMakeLists.txt b/CLion/ExerciseBook/08.13/CMakeLists.txt new file mode 100644 index 0000000..fc2dfaf --- /dev/null +++ b/CLion/ExerciseBook/08.13/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(08.13 BoundaryTagMethod.h BoundaryTagMethod.c 08.13.c) +# 链接公共库 +target_link_libraries(08.13 Scanf_lib) + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/08.14/08.14.c b/CLion/ExerciseBook/08.14/08.14.c new file mode 100644 index 0000000..4d45352 --- /dev/null +++ b/CLion/ExerciseBook/08.14/08.14.c @@ -0,0 +1,66 @@ +#include +#include "BuddySystem.h" //**▲08 动态存储管理**// + +/* + * 伙伴系统的内存回收算法 + * + * 对指针p处的内存进行释放(这类似于free(),只是对内存进行释放操作,至于置空指针p的操作,应交给调用方完成) + * + * 注:这里没有验证p的取值,调用方应当确保p在合规的范围 + */ +void Algo_8_14(FreeList avail, WORD* p); + + +int main(int argc, char* argv[]) { + FreeList avail; + WORD* p[8]; // 记录申请到的内存的指针 + int s[8] = {4, 5, 6, 7, 1, 5, 3, 9}; // 申请的空间大小 + int i; + + printf("████████ InitSpace \n"); + { + printf("初始化一个内存块...\n"); + InitSpace(avail); + PrintMemoryLayout(); + printf("\n"); + } + PressEnterToContinue(debug); + + printf("████████ AllocBuddy \n"); + { + for(i = 0; i < 8; i++) { + printf("申请大小为 %d 个字的内存块...\n", s[i]); + p[i] = AllocBuddy(avail, s[i]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + printf("████████ FreeBuddy \n"); + { + // 定义一个指针回收顺序 + int a[8] = {2, 0, 5, 7, 1, 4, 3, 6}; + + for(i = 0; i < 8; i++) { + Algo_8_14(avail, p[a[i]]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * 伙伴系统的内存回收算法 + * + * 对指针p处的内存进行释放(这类似于free(),只是对内存进行释放操作,至于置空指针p的操作,应交给调用方完成) + * + * 注:这里没有验证p的取值,调用方应当确保p在合规的范围 + */ +void Algo_8_14(FreeList avail, WORD* p) { + FreeBuddy(avail, p); +} diff --git a/CLion/ExerciseBook/08.14/BuddySystem.c b/CLion/ExerciseBook/08.14/BuddySystem.c new file mode 100644 index 0000000..6a3dd95 --- /dev/null +++ b/CLion/ExerciseBook/08.14/BuddySystem.c @@ -0,0 +1,283 @@ +/*============== + * 伙伴系统 + * + * 包含算法: 8.2 + ===============*/ + +#include "BuddySystem.h" + +// 记录内存的起始地址,在计算伙伴块时候需要用到 +WORD* start; + + +/* + * 初始化一块大小为2^M个字的内存,并返回指向该内存的起点的指针 + * 注:返回的初始内存已经包含了head。 + */ +void InitSpace(FreeList avail) { + int k; + WORD* r; + + // 遍历M+1个元素 + for(k = 0; k <= M; k++) { + avail[k].nodesize = (int) pow(2, k); + avail[k].first = NULL; + } + + r = (WORD*) malloc((int) pow(2, M) * sizeof(WORD)); + if(r == NULL) { + exit(OVERFLOW); + } + + // 设置头部信息 + r->llink = r->rlink = r; + r->tag = 0; + r->kval = M; + + avail[M].first = r; + + start = r; +} + +/* + * ████████ 算法8.2 ████████ + * + * 伙伴系统的内存分配算法 + * + * 从空间avail中申请一块大小至少为n(原始值)的空间,并返回指向申请到的空间的指针。如果分配失败,则返回NULL。 + * + * 注: + * 1.这里采用首次拟合法,即一遇到满足条件的内存块就进行分配操作。 + * 2.这里申请分配n个字的空间,指的是用户申请的原始空间。 + * 实际在申请时,还要考虑到每个块前面有1个字的head信息,即经过换算后,实际需要申请(n+1)个字。 + * 这里的n与算法8.1里面的n含义正好相反,需要注意。 + */ +WORD* AllocBuddy(FreeList avail, int n) { + int k, i; + WORD* pa, * pre, * suc, * pi; + + /* + * 增加一个判断:如果换算后的空间容量小于1,则直接返回。 + */ + if(n < 1) { + printf("日志:分配失败!申请的\"字\"数应当不小于1\n"); + return NULL; + } + + // 查找不小于n的空闲块 + for(k = 0; k <= M && (avail[k].nodesize < n + 1 || !avail[k].first); k++) { + } + + // 找不到合适的空闲块,返回空指针 + if(k > M) { + printf("日志:分配失败!没有足够的空闲块\n"); + return NULL; + } + + 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; + } + + /* + * 从k-1处开始逆向遍历FreeList数组,向其中填充剩余的空闲块。 + * 剩余的空闲块是对剩余可用空间的拆分。 + * + * 这里用到一个公式:2^m-2^n = 2^n+2^(n+1)+...+2^(m-1) + * 比如初始容量为2^16,此时总共申请1500个字,那么需要分配一块2^11的空闲块给它。 + * 分配完之后,剩余的容量为:2^16-2^11 = 2^11+2^12+2^13+2^14+2^15。 + * 这些剩余容量可以拆分为5个空闲块,分别存储到15、14、13、12、11这五个索引处。 + */ + for(i = 1; k - i >= 0 && avail[k - i].nodesize >= n + 1; i++) { + pi = pa + (int) pow(2, k - i); // 每次将pi指向剩余空间的后一半 + pi->rlink = pi->llink = pi; // 初始化pi的前驱和后继 + pi->tag = 0; // 标记为空闲块 + pi->kval = k - i; // 设置该块的容量标志,真实容量为2^(k-i) + avail[k - i].first = pi; + + /* + * 注: + * 上面分解出来的pi直接添加到了avail中,并没有考虑同位置处会不会有别的容量相同的空闲块。 + * 这里不需要考虑的原因是如果同位置处已经存在别的容量相同的空闲块, + * 那么这里根本不需要分解剩余空间,换句话说,连这个循环都进不来。 + * 只要进来这个循环,说明目标位置处已经为空了,没有找到合适的空闲块,所以这才进一步向高游标处寻找空闲块。 + */ + } + + // 最后剩下的最靠前的空间就是需要分配的空间(这里没有设置pa的前驱和后继,因为没必要) + pa->tag = 1; + pa->kval = k - (--i); + + printf("日志:分配成功!用户申请 %d 个字,系统申请 %d 个字,实际分配 %d 个字\n", n, n + 1, (int) pow(2, pa->kval)); + + return pa; +} + +/* + * 伙伴系统的内存回收算法 + * + * 对指针p处的内存进行释放(这类似于free(),只是对内存进行释放操作,至于置空指针p的操作,应交给调用方完成) + * + * 注:这里没有验证p的取值,调用方应当确保p在合规的范围 + */ +void FreeBuddy(FreeList avail, WORD* p) { + int k; + WORD* r; + WORD* buddy = Buddy(p); + + if(p == NULL) { + return; + } + + /* + * 这里将p结点简单地插入到avail中,包含三种情形: + * 1.伙伴块非空闲 + * 2.伙伴空闲,但是伙伴的大小跟p的大小不一致,说明伙伴还没拼合好 + * 3.p拼接成了最后一个最大的空闲块 + */ + if(buddy->tag == 1 || buddy->kval != p->kval || p->kval == M) { + for(k = 0; k <= M && k < p->kval; k++) { + // 查找p结点应当进入的插槽 + } + + // 找到插槽,采用头插法将空闲块插入到目标插槽 + if(k <= M && k == p->kval) { + p->tag = 0; + + if(avail[k].first == NULL) { + p->llink = p->rlink = p; + } else { + p->llink = avail[k].first->llink; + p->rlink = avail[k].first; + p->llink->rlink = p; + p->rlink->llink = p; + } + + avail[k].first = p; + + printf("日志:回收成功![%d, (2^%d)]进入插槽 %d 的空闲块链表上\n", (int) (p - start), k, k); + } + + // 如果伙伴块是空闲的,此时应当进行合并操作 + } else { + for(k = 0; k <= M && k < p->kval; k++) { + // 查找伙伴块所在的插槽 + } + + // 找到插槽,将伙伴块从空闲块链表中摘下来 + if(k <= M && k == p->kval) { + // 伙伴在链表第一个位置 + if(avail[k].first == buddy) { + buddy->rlink->llink = buddy->llink; + buddy->llink->rlink = buddy->rlink; + + avail[k].first = buddy->rlink; + + // 伙伴在中间位置 + } else { + for(r = avail[k].first; r->rlink != buddy; r = r->rlink) { + // 查找伙伴,r指向伙伴的前驱 + } + + r->rlink = buddy->rlink; + buddy->rlink->llink = r; + } + + printf("日志:合并成功![%d, (2^%d)]和[%d, (2^%d)]合并成了", (int) (p - start), k, (int) (buddy - start), k); + + // 合并之前,需要确定哪个伙伴靠前 + if(p < buddy) { + p->tag = 0; + } else { + p = buddy; + } + + p->kval = k + 1; // 指数增一后,即完成合并 + + printf("[%d, (2^%d)]\n", (int) (p - start), k + 1); + + // 出现新的空闲块之后,要进入递归,查看该空闲块是否也存在空闲伙伴 + FreeBuddy(avail, p); + } + } +} + +/* + * 打印内存布局,查看当前内存的使用情况 + * 注:仅限内部测试使用 + */ +void PrintMemoryLayout() { + int i, count, total; + WORD* p; + + printf("|"); + + p = start; + count = (int) pow(2, p->kval); + + for(i = 1; i <= count; i++) { + if(p->tag == 0) { + printf("_"); + } else { + printf("*"); + } + + // 进入到下一个块 + if(i == count && count < (int) pow(2, M)) { + p = start + count; + count += (int) pow(2, p->kval); + printf("|"); + } + } + + printf("|\n"); +} + +/* + * 查找块p的伙伴 + * + * 将一个空闲块对半分裂后,会生成的两个小空闲块,这两个小空闲块互为伙伴。 + * + * 计算伙伴的算法为: + * 对于起始地址为p,大小为2^k的内存块: + * 1.若 p MOD 2^(k+1) == 0 ,则p的伙伴块的起始地址为p+2^k, + * 2.若 p MOD 2^(k+1) == 2^k ,则p的伙伴块的起始地址为p-2^k。 + * + * 注:仅限内部使用,用在回收算法中 + */ +static WORD* Buddy(WORD* p) { + long s, m, n; + + if(p == NULL) { + return NULL; + } + + // start是整个空闲块的绝对起始地址,s是p在伙伴系统中的绝对地址,从0开始 + s = p - start; + if(s < 0) { + return NULL; + } + + m = (long) pow(2, p->kval); + n = (long) pow(2, p->kval + 1); + + if(s % n == 0) { + return p + m; + } + + if(s % n == m) { + return p - m; + } + + return NULL; +} diff --git a/CLion/ExerciseBook/08.14/BuddySystem.h b/CLion/ExerciseBook/08.14/BuddySystem.h new file mode 100644 index 0000000..82afb5b --- /dev/null +++ b/CLion/ExerciseBook/08.14/BuddySystem.h @@ -0,0 +1,89 @@ +/*============== + * 伙伴系统 + * + * 包含算法: 8.2 + ===============*/ + +#ifndef BUDDYSYSTEM_H +#define BUDDYSYSTEM_H + +#include +#include +#include +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define M 6 // 假设总空间大小为2^M个字,子表个数为M+1 + + +/* + * 内存"字"的类型定义 + * + * 所谓"字"是指空间分配的最小单位,它不是字节。 + * 一个"字"有多大,取决于对"字"结构是如何定义的。 + */ +typedef struct WORD { + struct WORD* llink; // 头部域的前驱指针 + struct WORD* rlink; // 头部域的后继指针 + int tag; // 头部域的块标志,0:空闲,1:占用 + int kval; // 指示块的大小,比如其值为K时,表示该块的大小为2^K +} WORD; + +// 表头向量类型 +typedef struct HeadNode { + int nodesize; // 该链表的空闲块的大小 + WORD* first; // 该链表的表头指针 +} FreeList[M + 1]; + + +/* + * 初始化一块大小为2^M个字的内存,并返回指向该内存的起点的指针 + * 注:返回的初始内存已经包含了head。 + */ +void InitSpace(FreeList avail); + +/* + * ████████ 算法8.2 ████████ + * + * 伙伴系统的内存分配算法 + * + * 从空间avail中申请一块大小至少为n(原始值)的空间,并返回指向申请到的空间的指针。如果分配失败,则返回NULL。 + * + * 注: + * 1.这里采用首次拟合法,即一遇到满足条件的内存块就进行分配操作。 + * 2.这里申请分配n个字的空间,指的是用户申请的原始空间。 + * 实际在申请时,还要考虑到每个块前面有1个字的head信息,即经过换算后,实际需要申请(n+1)个字。 + * 这里的n与算法8.1里面的n含义正好相反,需要注意。 + */ +WORD* AllocBuddy(FreeList avail, int n); + +/* + * 伙伴系统的内存回收算法 + * + * 对指针p处的内存进行释放(这类似于free(),只是对内存进行释放操作,至于置空指针p的操作,应交给调用方完成) + * + * 注:这里没有验证p的取值,调用方应当确保p在合规的范围 + */ +void FreeBuddy(FreeList avail, WORD* p); + +/* + * 打印内存布局,查看当前内存的使用情况 + * 注:仅限内部测试使用 + */ +void PrintMemoryLayout(); + +/* + * 查找块p的伙伴 + * + * 将一个空闲块对半分裂后,会生成的两个小空闲块,这两个小空闲块互为伙伴。 + * + * 计算伙伴的算法为: + * 对于起始地址为p,大小为2^k的内存块: + * 1.若 p MOD 2^(k+1) == 0 ,则p的伙伴块的起始地址为p+2^k, + * 2.若 p MOD 2^(k+1) == 2^k ,则p的伙伴块的起始地址为p-2^k。 + * + * 注:仅限内部使用,用在回收算法中 + */ +static WORD* Buddy(WORD* p); + +#endif diff --git a/CLion/ExerciseBook/08.14/CMakeLists.txt b/CLion/ExerciseBook/08.14/CMakeLists.txt new file mode 100644 index 0000000..b16cd5a --- /dev/null +++ b/CLion/ExerciseBook/08.14/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(08.14 BuddySystem.h BuddySystem.c 08.14.c) +# 链接公共库 +target_link_libraries(08.14 Scanf_lib) + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/08.15/08.15.c b/CLion/ExerciseBook/08.15/08.15.c new file mode 100644 index 0000000..99a64a2 --- /dev/null +++ b/CLion/ExerciseBook/08.15/08.15.c @@ -0,0 +1,85 @@ +#include +#include "MemoryManager.h" + +/* + * 内存整理 + * + * 将空闲块收集起来,链接成一条空闲块链表。 + */ +void Algo_8_15(Space* space); + + +int main(int argc, char** argv) { + Space space; + int i; + int a[11] = {10, 20, 30, 15, 20, 5, -1, -3, 0, 15, 10}; + WORD* p[11]; + + InitSpace(&space); + printf("初始内存布局:\n"); + PrintMemoryLayout(space); + + /* + * 注: + * 申请a[4]时,仅剩25个"字",当前容差是5,因此本次会直接分配20+5=25个"字" + * 申请a[5]时,已经没有可用的字,所以申请失败 + * 申请a[10]时,处在容差范围内,会整块分配 + */ + for(i = 0; i < 11; i++) { + if(a[i] > 0) { + printf("+ 申请 %d 个字的存储\n", a[i]); + p[i] = AllocMemory(&space, a[i]); + } else { + printf("- 释放 %d 个字的存储\n", a[-a[i]]); + FreeMemory(&space, p[-a[i]]); + } + + PrintMemoryLayout(space); + + if(i == 8) { + printf("内存整理...\n"); + Algo_8_15(&space); + PrintMemoryLayout(space); + } + } +} + + +/* + * 内存整理 + * + * 将空闲块收集起来,链接成一条空闲块链表。 + */ +void Algo_8_15(Space* space) { + WORD* p, * q; + + space->avail = NULL; + + q = NULL; + + // 遍历整个堆 + for(p = space->lowbound; p < space->highbound; p += p->cellsize) { + if(p->tag == 1) { + continue; + } + + // 先把后继置空 + p->next = NULL; + + // 遇到了第一个空闲块 + if(space->avail == NULL) { + space->avail = p; + q = p; + continue; + } + + // 如果两个空闲块地址不相邻,则进行链接 + if(q + q->cellsize != p) { + q->next = p; + + // 对于地址相邻的空闲块,要合并 + } else { + q->cellsize += p->cellsize; + } + } +} diff --git a/CLion/ExerciseBook/08.15/CMakeLists.txt b/CLion/ExerciseBook/08.15/CMakeLists.txt new file mode 100644 index 0000000..b95af1c --- /dev/null +++ b/CLion/ExerciseBook/08.15/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(08.15 MemoryManager.h MemoryManager.c 08.15.c) +# 链接公共库 +target_link_libraries(08.15 Scanf_lib) + +# 记录要拷贝到*.exe目录下的资源文件(这里拷贝了TestData.md文件) +file(GLOB TestData TestData*) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/08.15/MemoryManager.c b/CLion/ExerciseBook/08.15/MemoryManager.c new file mode 100644 index 0000000..a2822cb --- /dev/null +++ b/CLion/ExerciseBook/08.15/MemoryManager.c @@ -0,0 +1,131 @@ +/*======================= + * 存储管理,适用于习题8.15 + ========================*/ + +#include "MemoryManager.h" + +// 初始化一片可用的存储 +void InitSpace(Space* space) { + space->avail = (WORD*) malloc(MAXSIZE * sizeof(WORD)); + space->avail->tag = 0; + space->avail->cellsize = MAXSIZE; + space->avail->next = NULL; + + space->lowbound = space->avail; + space->highbound = space->avail + MAXSIZE; +} + +// 分配大小为n的内存,并返回指向该内存的虚拟地址 +WORD* AllocMemory(Space* space, int n) { + WORD* p, * q; + + if(space->avail == NULL) { + return NULL; + } + + p = space->avail; + q = NULL; + + // 如果第一个空闲块不满足条件 + if(p->cellsize < n) { + // 查找满足条件的空闲内存 + while(p != NULL && p->cellsize < n) { + q = p; + p = p->next; + } + } + + // 没有符合条件的空闲内存 + if(p == NULL) { + return NULL; + } + + // 在容差范围内,则整块分配 + if(p->cellsize - e <= n) { + if(q == NULL) { + space->avail = p->next; + } else { + q->next = p->next; + } + + // 分割空闲块 + } else { + + if(q == NULL) { + space->avail += n; + space->avail->tag = 0; + space->avail->cellsize = p->cellsize - n; + space->avail->next = p->next; + } else { + q->next = p + n; + q->next->tag = 0; + q->next->cellsize = p->cellsize - n; + } + + p->cellsize = n; + } + + // 标记为占用 + p->tag = 1; + + return p; +} + +// 释放指针p处的内存 +void FreeMemory(Space* space, WORD* p) { + p->tag = 0; // 简单地标记为空闲,以待后续整理 +} + +// 打印内存布局 +void PrintMemoryLayout(Space space) { + int i, count; + WORD* p; + + // 遍历所有块 + for(p = space.lowbound; p < space.highbound; p += p->cellsize) { + if(p->tag == 0) { + p->flag = -1; // 暂时标记为"不可用"的空闲块 + } else { + p->flag = 1; // 标记为占用 + } + } + + // 遍历空闲块链表 + for(p = space.avail; p != NULL; p = p->next) { + p->flag = 0; // 更新为"可用"的空闲块 + } + + count = 0; + + for(p = space.lowbound; p < space.highbound; p += p->cellsize) { + for(i = 0; i < p->cellsize; i++) { + switch(p->flag) { + case -1: + printf("△"); + break; + case 0: + printf("□"); + break; + case 1: + printf("■"); + break; + default: + printf("错误的标记!\n"); + return; + } + + count++; + // 每隔20个字换一下行 + if(count % 20 == 0) { + printf("\n"); + } + } + + } + + if(count % 20 != 0) { + printf("\n"); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/08.15/MemoryManager.h b/CLion/ExerciseBook/08.15/MemoryManager.h new file mode 100644 index 0000000..7f387a8 --- /dev/null +++ b/CLion/ExerciseBook/08.15/MemoryManager.h @@ -0,0 +1,57 @@ +/*======================= + * 存储管理,适用于习题8.15 + ========================*/ + +#include +#include +#include + +#ifndef MEMORYMANAGER_H +#define MEMORYMANAGER_H + + +/* 宏定义 */ +#define MAXSIZE 100 // 内存总容量 +#define e 5 // 分配空间时用到的容差 + + +/* + * 内存"字"的类型定义 + * + * 所谓"字"是指空间分配的最小单位,它不是字节。 + * 一个"字"有多大,取决于对"字"结构是如何定义的。 + */ +typedef struct WORD { + int tag; // 块标志,0空闲,1占用 + int cellsize; // 当前块的大小 + struct WORD* next; // 指向下一个空闲块 + + + /* + * 使用标记,0代表空闲,1代表占用,-1代表虽然空闲,但是不在空闲链表中。 + * 这个标记仅用来测试打印功能,并没有其它实质性的用处。 + */ + int flag; +} WORD; + +// "堆"空间 +typedef struct { + struct WORD* lowbound; // 空间下界 + struct WORD* highbound; // 空间上界 + struct WORD* avail; // 指向可用空间链表 +} Space; + + +// 初始化一片可用的存储 +void InitSpace(Space* space); + +// 分配大小为n的内存,并返回指向该内存的虚拟地址 +WORD* AllocMemory(Space* space, int n); + +// 释放指针p处的内存 +void FreeMemory(Space* space, WORD* p); + +// 打印内存布局 +void PrintMemoryLayout(Space space); + +#endif diff --git a/CLion/ExerciseBook/08.16/08.16.c b/CLion/ExerciseBook/08.16/08.16.c new file mode 100644 index 0000000..67822d2 --- /dev/null +++ b/CLion/ExerciseBook/08.16/08.16.c @@ -0,0 +1,441 @@ +#include +#include +#include +#include "MemoryManager.h" + +/* + * 存储紧缩算法 + * + * 该算法的实现过程与存储管理方案息息相关。 + * 此处的紧缩算法是建立在自己实现的MemoryManager之上的。 + * 如果有别的存储管理方案,那么紧缩算法也需要随之改变。 + * + * 具体步骤的描述参见教材。 + */ +void Algo_8_16(Space* space); + +// 依照内存记录的首地址对内存记录进行排序时用到的比较器,该方法仅限内部使用 +static int qsortCompar(const void* r1, const void* r2); + +// 查找一条内存记录的索引,该内存记录拥有旧地址oldAddr,该方法仅限内部使用 +static int search(Space space, int oldAddr); + +// 对习题8.10给出的数据进行测试 +void Test_8_10(Space* space, char* path); + +// 使用自定义的测试数据,这里还可以测试用户变量的变更情况 +void TestCustom(Space* space, int* p[]); + + +int main(int argc, char** argv) { + +// printf("=== 使用习题8.10中的测试数据 ===\n\n"); +// { +// Space space; +// +// // 初始化一片可用的存储 +// InitSpace(&space); +// printf("初始内存布局:\n"); +// PrintMemoryLayout(space); +// +// // 测试习题8.10的数据 +// Test_8_10(&space, "TestData_8_10.md"); +// printf("习题8.10中的内存布局:\n"); +// PrintMemoryLayout(space); +// +// // 存储紧缩 +// Algo_8_16(&space); +// printf("进行存储紧缩后的内存布局:\n"); +// PrintMemoryLayout(space); +// } + + printf("=== 使用自定义的测试数据 ===\n\n"); + { + Space space; + int* p[10]; // 用户变量表(虚拟地址) + char* data = (char*)malloc(sizeof(char)); + + // 初始化一片可用的存储 + InitSpace(&space); + printf("初始内存布局:\n"); + PrintMemoryLayout(space); + + // 自定义数据 + TestCustom(&space, p); + + // 存储紧缩 + Algo_8_16(&space); + printf("进行存储紧缩后的内存布局:\n"); + PrintMemoryLayout(space); + + printf("对照内存布局,验证用户变量是否已经同步更新:\n"); + memmove(data, getPtr(space, p[9]), 1); + printf("p10 = %d\n", *data); + memmove(data, getPtr(space, p[6]), 1); + printf("p7 = %d\n", *data); + memmove(data, getPtr(space, p[7]), 1); + printf("p8 = %d\n", *data); + memmove(data, getPtr(space, p[5]), 1); + printf("p6 = %d\n", *data); + memmove(data, getPtr(space, p[8]), 1); + printf("p9 = %d\n", *data); + } + +} + + +/* + * 存储紧缩算法 + * + * 该算法的实现过程与存储管理方案息息相关。 + * 此处的紧缩算法是建立在自己实现的MemoryManager之上的。 + * 如果有别的存储管理方案,那么紧缩算法也需要随之改变。 + * + * 具体步骤的描述参见教材。 + */ +void Algo_8_16(Space* space) { + Record* r; + int len; + int i, j, k, count; + int busy, free; + int* oldPtr; // 记录旧的虚拟地址 + + // 当前包含的内存使用记录条数 + len = ListLength(space->recordList); + + /* 0. 对内存记录表进行排序,这有利于后续的内存数据迁移 */ + qsort(space->recordList.elem, len, sizeof(ElemType), qsortCompar); + +// printf("日志0. 对内存记录进行排序(至此,只完成了对首地址的顺序):\n"); +// PrintMemoryLayout(*space); + + + /* 1. 确定经过存储紧缩后,各内存块的新地址,换句话说,经过此步骤,可以生成一个新旧地址对照表 */ + + free = 0; // 统计空闲块的大小 + busy = 0; // 统计占用块的大小,以确定各占用块的新地址 + count = 0; // 统计紧缩后的内存块数量 + j = 0; + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // 忽略空闲块,但是要统计它的大小 + if(r->tag == 0) { + free += r->size; + continue; + } + + // 先统计占用块数量 + count++; + + // 收集占用块,更新其地址信息 + r->oldAddr = r->addr; + r->addr = busy; + busy += r->size; + + // 把新的占用块信息排列到链表前面 + space->recordList.elem[j++] = r; + } + + // 记录空闲块的信息 + if(free != 0) { + // 必须重新分配内存 + r = (Record*) malloc(sizeof(Record)); + r->addr = busy; + r->size = free; + r->tag = 0; + r->oldAddr = -1; + + space->recordList.elem[j] = r; + + count++; + + // 指向最新的空闲块的记录 + space->cur = count; + } + + // 内存使用记录的新长度 + space->recordList.length = count; + +// printf("日志1. 计算新旧地址对照表(至此,只完成了\"占用\"内存的前移,以及\"空闲\"内存的合并):\n"); +// PrintMemoryLayout(*space); + + + /* 2. 检查用户变量表,更新虚拟地址,以便紧缩之后的变量可以正常工作 */ + + // 用户变量表长度 + len = ListLength(space->ptrList); + + for(i = 0; i < len; i++) { + oldPtr = space->ptrList.elem[i]; + + // 获取旧地址在内存记录表中的索引 + k = search(*space, *oldPtr); + + // 更新为新地址 + *oldPtr = ((Record*) (space->recordList.elem[k]))->addr; + } + +// printf("日志2. 用户变量表更新完成(至此,用户变量(虚拟地址指针)已经指向了正确的内存,但是数据显示还不正常:\n"); +// PrintMemoryLayout(*space); + + + /* 3. 检查链接,更新前驱和后继 */ + + len = ListLength(space->recordList); + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // 遇到空闲块时,可以结束循环了 + if(r->tag==0) { + break; + } + + if(r->pre != -1) { + k = search(*space, r->pre); + r->pre = ((Record*) (space->recordList.elem[k]))->addr; + } + + if(r->next != -1) { + k = search(*space, r->next); + r->next = ((Record*) (space->recordList.elem[k]))->addr; + } + } + +// printf("日志3. 内存记录中的前驱和后继已经可以正常显示:\n"); +// PrintMemoryLayout(*space); + + + /* 4. 迁移用户数据 */ + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // 紧缩后的空闲记录一定是排在最后的,所以遇到空闲记录时,就可以结束循环了 + if(r->tag == 0) { + // 将该地址对应的内存处的数据抹掉(这是个可选操作) + memset(getPtr(*space, &(r->addr)), 0, r->size * BYTE); + break; + } + + // 如果新旧地址一样,则无需迁移数据 + if(r->addr == r->oldAddr) { + continue; + } + + memmove(space->base + r->addr * BYTE, space->base + r->oldAddr * BYTE, r->size); + } + +// printf("日志4. 数据迁移完成(至此,可以正常显示所有参数和用户数据:\n"); +// PrintMemoryLayout(*space); + +} + +// 使用自定义的测试数据,这里还可以测试用户变量的变更情况 +void TestCustom(Space* space, int* p[]) { + + printf("+ 为 p1 申请10个内存,并向此内存中写入数据 1 ...\n"); + p[0] = AllocMemory(space, 10); + memset(getPtr(*space, p[0]), 1, 1); + PrintMemoryLayout(*space); + + printf("+ 为 p2 申请50个内存,并向此内存中写入数据 2 ...\n"); + p[1] = AllocMemory(space, 50); + memset(getPtr(*space, p[1]), 2, 1); + PrintMemoryLayout(*space); + + printf("+ 为 p3 申请20个内存,并向此内存中写入数据 3 ...\n"); + p[2] = AllocMemory(space, 20); + memset(getPtr(*space, p[2]), 3, 1); + PrintMemoryLayout(*space); + + printf("- 释放 p2 处的50个内存...\n"); + FreeMemory(space, p[1]); + PrintMemoryLayout(*space); + + printf("+ 为 p4 申请5个内存,并向此内存中写入数据 4 ...\n"); + p[3] = AllocMemory(space, 5); + memset(getPtr(*space, p[3]), 4, 1); + PrintMemoryLayout(*space); + + printf("+ 为 p5 申请10个内存,并向此内存中写入数据 5 ...\n"); + p[4] = AllocMemory(space, 10); + memset(getPtr(*space, p[4]), 5, 1); + PrintMemoryLayout(*space); + + printf("- 释放 p4 处的5个内存...\n"); + FreeMemory(space, p[3]); + PrintMemoryLayout(*space); + + printf("- 释放 p3 处的20个内存...\n"); + FreeMemory(space, p[2]); + PrintMemoryLayout(*space); + + printf("+ 为 p6 申请15个内存,并向此内存中写入数据 6 ...\n"); + p[5] = AllocMemory(space, 15); + memset(getPtr(*space, p[5]), 6, 1); + ((Record*)(space->recordList.elem[2]))->pre = 25; + ((Record*)(space->recordList.elem[2]))->next = 0; + PrintMemoryLayout(*space); + + printf("+ 为 p7 申请10个内存,并向此内存中写入数据 7 ...\n"); + p[6] = AllocMemory(space, 10); + memset(getPtr(*space, p[6]), 7, 1); + ((Record*)(space->recordList.elem[4]))->pre = 60; + ((Record*)(space->recordList.elem[4]))->next = -1; + PrintMemoryLayout(*space); + + printf("+ 为 p8 申请15个内存,并向此内存中写入数据 8 ...\n"); + p[7] = AllocMemory(space, 15); + memset(getPtr(*space, p[7]), 8, 1); + ((Record*)(space->recordList.elem[7]))->pre = -1; + ((Record*)(space->recordList.elem[7]))->next = 15; + PrintMemoryLayout(*space); + + printf("- 释放 p5 处的10个内存...\n"); + FreeMemory(space, p[4]); + PrintMemoryLayout(*space); + + printf("+ 为 p9 申请5个内存,并向此内存中写入数据 9 ...\n"); + p[8] = AllocMemory(space, 5); + memset(getPtr(*space, p[8]), 9, 1); + ((Record*)(space->recordList.elem[3]))->pre = 15; + ((Record*)(space->recordList.elem[3]))->next = 60; + PrintMemoryLayout(*space); + + printf("- 释放 p1 处的10个内存...\n"); + FreeMemory(space, p[0]); + PrintMemoryLayout(*space); + + printf("+ 为 p10 申请5个内存,并向此内存中写入数据 10 ...\n"); + p[9] = AllocMemory(space, 5); + memset(getPtr(*space, p[9]), 10, 1); + ((Record*)(space->recordList.elem[0]))->pre = -1; + ((Record*)(space->recordList.elem[0]))->next = -1; + PrintMemoryLayout(*space); + +} + +// 对习题8.10给出的数据进行测试 +void Test_8_10(Space* space, char* path) { + FILE* fp; + + char line[100]; // 缓存读取到的行 + char* p; // 指向分解出来的数字 + + Record* record; + + // 每行读取到的数据 + int addr; + int size; + int tag; + int pre; + int next; + + // 记录虚拟地址 + int* free[100]; + int* ptr; + + int count; + int i; + + char data; // 用于验证数据迁移的测试数据 + + fp = fopen(path, "r"); + + // 没有有效内容,则直接返回空的顺序表 + if(fp == NULL) { + return; + } + + // 舍弃属于表头的前两行 + fgets(line, 100, fp); + fgets(line, 100, fp); + + count = 0; + i = 0; + data = 0; + + // 如果没有到达文件尾,则一直读取 + while(fgets(line, 100, fp)!=NULL) { + + // 首地址 + p = strtok(line, " |\n\r"); + addr = atoi(p); + + // 块大小 + p = strtok(NULL, " |\n\r"); + size = atoi(p); + + // 标志域 + p = strtok(NULL, " |\n\r"); + tag = atoi(p); + + // 前驱地址 + p = strtok(NULL, " |\n\r"); + pre = atoi(p); + + // 后继地址 + p = strtok(NULL, " |\n\r"); + next = atoi(p); + + // 申请size个内存 + ptr = AllocMemory(space, size); + + // 获取刚刚创建的内存记录的指针,完成前驱和后继的初始化 + record = space->recordList.elem[i++]; + record->pre = pre; + record->next = next; + + /* + * 为刚刚申请的内存赋值,这是为了测试后续的数据迁移是否成功。 + * 注意这里赋值时要将虚拟地址转换为真实地址。 + */ + memset(getPtr(*space, ptr), ++data, 1); + + if(tag == 0) { + // 该地址处的内存后续需要释放 + free[count++] = ptr; + } + } + + fclose(fp); + + // 释放内存 + for(i = 0; i < count; i++) { + FreeMemory(space, free[i]); + } +} + +// 依照内存记录的首地址对内存记录进行排序时用到的比较器,该方法仅限内部使用 +static int qsortCompar(const void* r1, const void* r2) { + Record* record1 = *((Record**) r1); + Record* record2 = *((Record**) r2); + + return record1->addr - record2->addr; +} + +/* + * 查找一条内存记录的索引,该内存记录拥有旧地址oldAddr + * + * 注:这个查找其实很低效,因为: + *   首先,这个查找本身是顺序查找,效率不高; + *   其次,这个查找会被大量重复调用,更导致总效率低效。 + *   更好的算法是使用后续学到的哈希表,将新旧地址存储到哈希表中会极大地加快查找速度。 + * + * 该方法仅限内部使用 + */ +static int search(Space space, int oldAddr) { + int k; + + for(k = 0; k < space.recordList.length; k++) { + // 找到了匹配的旧地址值 + if(oldAddr == ((Record*) (space.recordList.elem[k]))->oldAddr) { + return k; + } + } + + return -1; +} diff --git a/CLion/ExerciseBook/08.16/CMakeLists.txt b/CLion/ExerciseBook/08.16/CMakeLists.txt new file mode 100644 index 0000000..9e4da24 --- /dev/null +++ b/CLion/ExerciseBook/08.16/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(08.16 SqList.h SqList.c MemoryManager.h MemoryManager.c 08.16.c) +# 链接公共库 +target_link_libraries(08.16 Scanf_lib) + +# 记录要拷贝到*.exe目录下的资源文件(这里拷贝了TestData.md文件) +file(GLOB TestData TestData*) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/08.16/MemoryManager.c b/CLion/ExerciseBook/08.16/MemoryManager.c new file mode 100644 index 0000000..f363dcc --- /dev/null +++ b/CLion/ExerciseBook/08.16/MemoryManager.c @@ -0,0 +1,239 @@ +/*======================= + * 存储管理,适用于习题8.16 + ========================*/ + +#include "MemoryManager.h" + +// 初始化一片可用的存储 +void InitSpace(Space* space) { + void* base; // 内存起始地址 + Record* record; // 第一条记录 + + // 初始分配MAXSIZE个字节的内存,且清零 + base = calloc(MAXSIZE, BYTE); + space->base = base; + + // 初始化内存使用记录 + InitList(&(space->recordList)); + + record = (Record*) malloc(sizeof(Record)); + + record->addr = 0; + record->size = MAXSIZE; + record->tag = 0; + record->pre = -1; + record->next = -1; + record->oldAddr = -1; + + // 插入第一条内存使用记录(空闲) + ListInsert(&(space->recordList), 1, record); + + // 第一个可用的空闲块 + space->cur = 1; + + // 初始化地址链表 + InitList(&(space->ptrList)); +} + +// 分配大小为n的内存,并返回指向该内存的虚拟地址 +int* AllocMemory(Space* space, int n) { + int found; // 标记是否找到可用的空闲块 + int i, cur, len; + Record* record; + Record* newRecord; + int* ptr; + + // 记下当前的空闲块记录位置 + i = cur = space->cur; + found = 0; + + // 获取当前内存记录表的长度 + len = ListLength(space->recordList); + + // 查找可用的空闲内存块 + while(1) { + // 获取当前块的内存使用信息 + GetElem(space->recordList, i, (ElemType*) &record); + + // 跳过占用块,已经跳过容量不足的空闲块 + if(record->tag == 1 || record->size < n) { + // 前进到下一条记录,注意是循环的 + i = (i + 1) % len == 0 ? len : (i + 1) % len; + if(i == cur) { + break; // 如果又回到了本次搜索的起点,说明没有找到合适的空闲块 + } + continue; + } + + // 找到合适的空闲块 + found = 1; + break; + } + + // 没找到合适的空闲块 + if(found == 0) { + return NULL; + } + + // 在容差范围内,则整块分配 + if(record->size - e <= n) { + record->tag = 1; // 转换为占用状态 + + // 否则,需要拆分空闲块 + } else { + // 新建一条空闲记录 + newRecord = (Record*) malloc(sizeof(Record)); + newRecord->addr = record->addr + n; + newRecord->size = record->size - n; + newRecord->tag = 0; + newRecord->pre = -1; + newRecord->next = -1; + newRecord->oldAddr = -1; + + // 插入新的空闲记录 + ListInsert(&(space->recordList), len + 1, newRecord); + len += 1; // 链表长度增一 + + // 当前的空闲记录转为使用记录 + record->size = n; + record->tag = 1; + } + + // 构造一个虚拟地址 + ptr = (int*) malloc(sizeof(int)); + ListInsert(&(space->ptrList), ListLength(space->ptrList)+1, ptr); + *ptr = record->addr; + + // 将游标cur指向下一条空闲记录 + while(1) { + // 获取当前块的内存使用信息 + GetElem(space->recordList, i, (ElemType*) &record); + + // 跳过占用块 + if(record->tag == 1) { + // 前进到下一条记录,注意是循环的 + i = (i + 1) % len == 0 ? len : (i + 1) % len; + if(i == cur) { + break; // 如果又回到了本次搜索的起点,说明没有找到合适的空闲块 + } + continue; + } + + // 存储下一个可用空闲块的位置(不管找没找到都存储) + space->cur = i; + + break; + } + + return ptr; // 返回可用内存的虚拟地址 +} + +// 释放虚拟地址p处的内存 +void FreeMemory(Space* space, int* p) { + int i, len; + Record* record; + + // 获取当前内存记录的长度 + len = ListLength(space->recordList); + + // 遍历所有内存记录,查找待释放内存所在的记录 + for(i = 1; i <= len; i++) { + // 获取当前块的内存使用信息 + GetElem(space->recordList, i, (ElemType*) &record); + + // 跳过不匹配的记录 + if(*p != record->addr) { + continue; + } + + // 如果该记录本来就是空闲,则直接返回 + if(record->tag == 0) { + return; + } + + // 将使用记录更改为空闲 + record->tag = 0; + + // 将游标指向刚刚回收的内存 + space->cur = i; + + // 将该地址对应的内存处的数据抹掉(这是个可选操作) + memset(getPtr(*space, p), 0, record->size*BYTE); + + // 查找该虚拟地址在地址表中的位置 + for(i = 0; i < space->ptrList.length; i++) { + if(space->ptrList.elem[i] == p) { + break; + } + } + + // 删除该虚拟地址(用链表后面的数据覆盖前面的数据) + memmove(&(space->ptrList.elem[i]), &(space->ptrList.elem[i + 1]), (space->ptrList.length - i - 1) * sizeof(void*)); + + space->ptrList.length -= 1; + + return; + } + +} + +// 将虚拟地址addr转换为底层的真实地址 +void* getPtr(Space space, const int* addr) { + if(addr == NULL) { + return NULL; + } else { + if(*addr < 0 || *addr > MAXSIZE) { + return NULL; + } + + return space.base + (*addr * BYTE); + } +} + +// 打印内存布局,显示格式为:首地址 块大小 标志域 | 前驱 后继 | 数据 +void PrintMemoryLayout(Space space) { + Record* record; + int i, len; + char* data; + + len = ListLength(space.recordList); + + for(i = 0; i < len; i++) { + record = space.recordList.elem[i]; + + printf("%2d ", record->addr); + printf("%2d ", record->size); + printf("%1d ", record->tag); + + // 接下来输出前驱和后继信息 + printf(" | "); + + if(record->tag == 0) { + printf(" ▍\n"); + continue; + } + + if(record->pre == -1) { + printf(" "); + } else { + printf("%2d ", record->pre); + } + + if(record->next == -1) { + printf(" "); + } else { + printf("%2d ", record->next); + } + + // 接下来输出该内存中的数据,这里只输出第一个字节中存储的数据,只是用于测试 + printf(" ▍ "); + + data = (char*)calloc(1, sizeof(char)); + memmove(data, getPtr(space, &(record->addr)), 1); + printf("%d", *data); + + printf("\n"); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/08.16/MemoryManager.h b/CLion/ExerciseBook/08.16/MemoryManager.h new file mode 100644 index 0000000..65ad38e --- /dev/null +++ b/CLion/ExerciseBook/08.16/MemoryManager.h @@ -0,0 +1,63 @@ +/*======================= + * 存储管理,适用于习题8.16 + ========================*/ + +#ifndef MEMORYMANAGER_H +#define MEMORYMANAGER_H + +#include +#include +#include +#include "SqList.h" + + +#define MAXSIZE 100 // 最大内存量 +#define e 0 // 容差 + +#define BYTE sizeof(char) // 1个字节 + + +// 内存记录类型定义 +typedef struct { + int addr; // 新地址域,存储内存块的当前最新地址,初始值是空间首地址 + int size; // 块大小 + int tag; // 标志域,指示内存是正在使用(1)还是空闲状态(0) + + /* 存储块之间的链接关系,这与用户在虚拟地址层看到的链接关系可能并不一致 */ + int pre; // 前驱 + int next; // 后继 + + int oldAddr; // 进行存储紧缩后的旧地址 +} Record; + +// 可用空间类型定义 +typedef struct { + void* base; // 内存起始地址 + SqList recordList; // 内存使用记录 + int cur; // 记录空闲块的内存记录的位置,初值为1 + + /* + * 记录虚拟地址。 + * 这其实是在模拟操作系统的行为: + * 用户使用的地址跟硬件的实际地址可能并不一致,所以需要操作系统构造一个虚拟地址集。 + */ + SqList ptrList; +} Space; + + +// 初始化一片可用的存储 +void InitSpace(Space* space); + +// 分配大小为n的内存,并返回指向该内存的虚拟地址 +int* AllocMemory(Space* space, int n); + +// 释放虚拟地址p处的内存 +void FreeMemory(Space* space, int* p); + +// 将虚拟地址addr转换为底层的真实地址 +void* getPtr(Space space, const int* addr); + +// 打印内存布局,显示格式为:首地址 块大小 标志域 | 前驱 后继 | 数据 +void PrintMemoryLayout(Space space); + +#endif diff --git a/CLion/ExerciseBook/08.16/SqList.c b/CLion/ExerciseBook/08.16/SqList.c new file mode 100644 index 0000000..36b833a --- /dev/null +++ b/CLion/ExerciseBook/08.16/SqList.c @@ -0,0 +1,173 @@ +/*============================= + * 线性表的顺序存储结构(顺序表) + * + * 包含算法: 2.3、2.4、2.5、2.6 + =============================*/ + +#include "SqList.h" + +/* + * ████████ 算法2.3 ████████ + * + * 初始化 + * + * 初始化成功则返回OK,否则返回ERROR。 + */ +Status InitList(SqList* L) { + // 分配指定容量的内存,如果分配失败,则返回NULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + (*L).length = 0; // 初始化顺序表长度为0 + (*L).listsize = LIST_INIT_SIZE; // 顺序表初始内存分配量 + + return OK; // 初始化成功 +} + +/* + * 计数 + * + * 返回顺序表包含的有效元素的数量。 + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * 取值 + * + * 获取顺序表中第i个元素,将其存储到e中。 + * 如果可以找到,返回OK,否则,返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数,但这不符合编码的通用约定。 + * 通常,i的含义应该指索引,即从0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e) { + // 因为i的含义是位置,所以其合法范围是:[1, length] + if(i < 1 || i > L.length) { + return ERROR; //i值不合法 + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ████████ 算法2.4 ████████ + * + * 插入 + * + * 向顺序表第i个位置上插入e,插入成功则返回OK,否则返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // 确保顺序表结构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // i值越界 + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // 若存储空间已满,则增加新空间 + if((*L).length >= (*L).listsize) { + // 基于现有空间扩容 + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + // 新基址 + (*L).elem = newbase; + // 存的存储空间 + (*L).listsize += LISTINCREMENT; + } + + // q为插入位置 + q = &(*L).elem[i - 1]; + + // 1.右移元素,腾出位置 + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.插入e + *q = e; + + // 3.表长增1 + (*L).length++; + + return OK; +} + +/* + * ████████ 算法2.5 ████████ + * + * 删除 + * + * 删除顺序表第i个位置上的元素,并将被删除元素存储到e中。 + * 删除成功则返回OK,否则返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数 + */ +Status ListDelete(SqList* L, int i, ElemType* e) { + ElemType* p, * q; + + // 确保顺序表结构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // i值越界 + if(i < 1 || i > (*L).length) { + return ERROR; + } + + // p为被删除元素的位置 + p = &(*L).elem[i - 1]; + + // 1.获取被删除元素 + *e = *p; + + // 表尾元素位置 + q = (*L).elem + (*L).length - 1; + + // 2.左移元素,被删除元素的位置上会有新元素进来 + for(++p; p <= q; ++p) { + *(p - 1) = *p; + } + + // 3.表长减1 + (*L).length--; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问顺序表L + */ +void ListTraverse(SqList L, void(Visit)(ElemType)) { + int i; + + for(i = 0; i < L.length; i++) { + Visit(L.elem[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/08.16/SqList.h b/CLion/ExerciseBook/08.16/SqList.h new file mode 100644 index 0000000..8765117 --- /dev/null +++ b/CLion/ExerciseBook/08.16/SqList.h @@ -0,0 +1,94 @@ +/*============================= + * 线性表的顺序存储结构(顺序表) + * + * 包含算法: 2.3、2.4、2.5、2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define LIST_INIT_SIZE 100 // 顺序表存储空间的初始分配量 +#define LISTINCREMENT 10 // 顺序表存储空间的分配增量 + + +/* 顺序表元素类型定义 */ +typedef void* ElemType; + +/* + * 顺序表结构 + * + * 注:elem在使用前需要先为其分配内存,且元素从elem[0]处开始存储 + */ +typedef struct { + ElemType* elem; // 顺序表存储空间的基址(指向顺序表所占内存的起始位置) + int length; // 当前顺序表长度(包含多少元素) + int listsize; // 当前分配的存储容量(可以存储多少元素) +} SqList; + + +/* + * ████████ 算法2.3 ████████ + * + * 初始化 + * + * 初始化成功则返回OK,否则返回ERROR。 + */ +Status InitList(SqList* L); + +/* + * 计数 + * + * 返回顺序表包含的有效元素的数量。 + */ +int ListLength(SqList L); + +/* + * 取值 + * + * 获取顺序表中第i个元素,将其存储到e中。 + * 如果可以找到,返回OK,否则,返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数,但这不符合编码的通用约定。 + * 通常,i的含义应该指索引,即从0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ████████ 算法2.4 ████████ + * + * 插入 + * + * 向顺序表第i个位置上插入e,插入成功则返回OK,否则返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e); + +/* + * ████████ 算法2.5 ████████ + * + * 删除 + * + * 删除顺序表第i个位置上的元素,并将被删除元素存储到e中。 + * 删除成功则返回OK,否则返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数 + */ +Status ListDelete(SqList* L, int i, ElemType* e); + +/* + * 遍历 + * + * 用visit函数访问顺序表L + */ +void ListTraverse(SqList L, void (Visit)(ElemType)); + +#endif diff --git a/CLion/ExerciseBook/08.16/TestData_8_10.md b/CLion/ExerciseBook/08.16/TestData_8_10.md new file mode 100644 index 0000000..fcfc3c2 --- /dev/null +++ b/CLion/ExerciseBook/08.16/TestData_8_10.md @@ -0,0 +1,17 @@ +| 首地址 | 块大小 | 标志域 | 前驱指针 | 后继指针 | +| :----: | :----: | :----: | :----: | :----: | +| 0 | 5 | 1 | -1 | 10 | +| 5 | 5 | 0 | -1 | -1 | +| 10 | 5 | 1 | 15 | 40 | +| 15 | 10 | 1 | -1 | -1 | +| 25 | 5 | 0 | -1 | -1 | +| 30 | 10 | 0 | -1 | -1 | +| 40 | 5 | 1 | 45 | 65 | +| 45 | 10 | 1 | -1 | -1 | +| 55 | 5 | 0 | -1 | -1 | +| 60 | 5 | 0 | -1 | -1 | +| 65 | 5 | 1 | 85 | -1 | +| 70 | 5 | 0 | -1 | -1 | +| 75 | 10 | 0 | -1 | -1 | +| 85 | 5 | 1 | 90 | -1 | +| 90 | 10 | 1 | -1 | -1 | \ No newline at end of file diff --git a/CLion/ExerciseBook/08.16/习题8.10测试数据.png b/CLion/ExerciseBook/08.16/习题8.10测试数据.png new file mode 100644 index 0000000000000000000000000000000000000000..a40b4546dfaa0d2354def20df328c29b17c8ef7a GIT binary patch literal 56307 zcmd43XH-*N7cPpZpi~hFQUp-}h0vRHQHoL(1wwDq0|*GABhn2;KzftjOXxiUhTcJ1 zfY5ty0YZ`+-|zj-9p{X3@A-Ge$w)?aS$)s>%sJP3)((5Cu0%=3NJd0NMET~mye1LR z^#md!;)q+sge#H*w=jgiYc85fFNw+qnKub1H>~8;g=+Ca@2#o0p$9lp0x6$8`A+5k zVk6B&A~Sg2t8Nn^O#h1{K)~eNW{bI}h(kSk-YfPGTu4Z1^tD5!t0K!HstV68p_DCz zcd^Xz`0V|pX7qZxa!V@(8+>?l`TG6L{t+FkM|VPlUunI_5FsLJAcp4t-ZIfB}H zdJ{2y7Vr9;G=J+xR@*SWL6!y+(H8@Mgr*7Xhyn!EH-X&>jJpQC`2zRL>{$iKg9I4Q zQvtfs-uneX{Ls$?b`Mk{bsf+L00D_jEq<9@`z~7nA_HotUxQkZ0|EXOf+jGcZdMTR zCV+eB3!?HS0Qv&NPyr%Zp$5ilh9F4p)!62ibI#Pue;;^cP}I*YlqRnrQ)KYSR(MeG zk-^OOmU}nv+XntfB@Smg5K+I~nWb=mWMUaSof*Fu5!x@B^H@EJ*Pg+Jp%#l=D*F7p&j;8AZ}d^q(dj-4v` z8p<8yqrQO-L<{*Xv~;Qru*gCGm9vkWt&}c-O&cAuMhjrihp6qDqZOpUIMe7SH(bRT zTV;P$=ABxxzMT0AUoTUz9cuLGPRi*!<_W5%Ka`9eGm+yS27w=E(pDVEyY%V@fd39d z?x72;xg`v!{Z?RbF;Mv!nRVy$+t9|En600=II=hq78SZN&||QrWeCkR1rkb;>W4Fm zVAwVFD?@w1$MV!-ND)7JxNaO2Y681zd2(%};(q(A*+9xFlRsjHQWT&c1sV^%ER7W7 z3D8Xr3L7r%mT5|THtQbNCEw^6asVi zq*xuuuJQeKq~3cGYBm@(MgcS)Te0J7IBK(7p+EQY*_Nz;D%(j`ZC>EV^OHc+5~LYV zBn<;)#gu+*p5ETq}|9DRk-#Q(Rfg2_rzS3 zXD+Y%whL@P^#K6+Mdi@<;VrdS2YM#MP|wAd9Dkmh5ZK#0G2w64o_?iBs_B%i<%O

Wm|&x~Y+ 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 VD+@O7fy4+Rd0FL0S<=tm{C|&J3V{Fs literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/CMakeLists.txt b/CLion/ExerciseBook/CMakeLists.txt index 35d6eff..041b5f0 100644 --- a/CLion/ExerciseBook/CMakeLists.txt +++ b/CLion/ExerciseBook/CMakeLists.txt @@ -148,3 +148,9 @@ add_subdirectory(07.39) add_subdirectory(07.40) add_subdirectory(07.41) add_subdirectory(07.42) + +add_subdirectory(08.11-08.12) +add_subdirectory(08.13) +add_subdirectory(08.14) +add_subdirectory(08.15) +add_subdirectory(08.16) diff --git a/Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.cpp b/Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.cpp new file mode 100644 index 0000000..3f8bcbc --- /dev/null +++ b/Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.cpp @@ -0,0 +1,127 @@ +#include +#include "Status.h" +#include "SqStack.h" + +/* 궨 */ +#define MAXSIZE 200 // ڴܴС + + +/* пռͶ */ +typedef struct { + void* base; // ÿռڴʼַ + int size; // пռС(ֽڼ) + SqStack block; // ѾʹõڴСڴϢջ +} Space; + + +// ʼڴռ估ڴϢջ +void InitSpace(Space* space); + +// ӡڴ沼֣鿴ǰڴʹ +void PrintMemoryLayout(Space space); + +// СΪnڴ飬뵽ڴʼַ +void* Algo_8_11(Space* space, int n); + +// ڴ棬ѭ"ͷ"ԭ +Status Algo_8_12(Space* space); + + +int main(int argc, char* argv[]) { + Space space; + int s[5] = {50, 50, 150, 100, 50}; // ڴ + int i; + + // ʼڴ + InitSpace(&space); + PrintMemoryLayout(space); + printf("\n"); + + // /ͷڴ + for(i = 0; i < 5; i++) { + printf(" %d ڴ...\n", s[i]); + Algo_8_11(&space, s[i]); + PrintMemoryLayout(space); + printf("\n"); + } + + return 0; +} + + +// ʼһпռ +void InitSpace(Space* space) { + // MAXֽڵĿռ(ܳʼɹ) + space->base = malloc(MAXSIZE); + space->size = MAXSIZE; + + // ʼڴϢջ + InitStack(&(space->block)); +} + +// ӡڴ沼֣鿴ǰڴʹ +void PrintMemoryLayout(Space space) { + int i; + + for(i = 1; i <= MAXSIZE; i++) { + if(i <= space.size) { + printf(""); + } else { + printf(""); + } + + // Ԥÿ20һ + if(i % 20 == 0) { + printf("\n"); + } + } + + if(MAXSIZE % 20 != 0) { + printf("\n"); + } +} + +// СΪnڴ飬뵽ڴʼַ +void* Algo_8_11(Space* space, int n) { + + /* + * õڴڴ + * Ҫͷʹõڴڳռ䡣 + */ + while(space->size < n && Algo_8_12(space) == OK) { + // ֱڴҪ󣬻ȫռڴѾͷţŻ˳ѭ + } + + // û㹻ڴã򷵻ؿָ + if(space->size < n) { + return NULL; + } + + // ÿռС + space->size -= n; + + // ³ɹ뵽ڴ + Push(&(space->block), n); + + // 뵽ڴʼַ + return space->base + space->size; +} + +// ڴ棬ѭ"ͷ"ԭ +Status Algo_8_12(Space* space) { + int e; + + // ѾûпͷڴʱERROR + if(StackEmpty(space->block)) { + return ERROR; + } + + // ڴͷŵ + Pop(&(space->block), &e); + + // ÿռ + space->size += e; + + return OK; +} + diff --git a/Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.dev b/Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.dev new file mode 100644 index 0000000..7355f87 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.11-08.12/08.11-08.12.dev @@ -0,0 +1,82 @@ +[Project] +FileName=08.11-08.12.dev +Name=08.11-08.12 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit3] +FileName=SqStack.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=SqStack.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=08.11-08.12.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/08.11-08.12/SqStack.cpp b/Dev-C++/ExerciseBook/08.11-08.12/SqStack.cpp new file mode 100644 index 0000000..b504b72 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.11-08.12/SqStack.cpp @@ -0,0 +1,91 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#include "SqStack.h" //**03 ջͶ**// + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * п + * + * ж˳ջǷЧݡ + * + * ֵ + * TRUE : ˳ջΪ + * FALSE: ˳ջΪ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // ջʱ׷Ӵ洢ռ + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 洢ʧ + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ջȸֵջָ + *(S->top++) = e; + + return OK; +} + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ջջָȵݼٸֵ + *e = *(--(*S).top); + + return OK; +} + diff --git a/Dev-C++/ExerciseBook/08.11-08.12/SqStack.h b/Dev-C++/ExerciseBook/08.11-08.12/SqStack.h new file mode 100644 index 0000000..a1bd745 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.11-08.12/SqStack.h @@ -0,0 +1,60 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define STACK_INIT_SIZE 100 // ˳ջ洢ռijʼ +#define STACKINCREMENT 10 // ˳ջ洢ռķ + +/* ˳ջԪͶ */ +typedef int SElemType; + +// ˳ջԪؽṹ +typedef struct { + SElemType* base; // ջָ + SElemType* top; // ջָ + int stacksize; // ǰѷĴ洢ռ䣬ԪΪλ +} SqStack; + + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S); + +/* + * п + * + * ж˳ջǷЧݡ + * + * ֵ + * TRUE : ˳ջΪ + * FALSE: ˳ջΪ + */ +Status StackEmpty(SqStack S); + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e); + +#endif + diff --git a/Dev-C++/ExerciseBook/08.13/08.13.cpp b/Dev-C++/ExerciseBook/08.13/08.13.cpp new file mode 100644 index 0000000..1000509 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.13/08.13.cpp @@ -0,0 +1,66 @@ +#include +#include "BoundaryTagMethod.h" //**08 ̬洢**// + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ + */ +void Algo_8_13(Space* pav, Space p); + + +int main(int argc, char* argv[]) { + Space pav; + Space p[12]; // ¼뵽ڴָ + int s[12] = {10, 20, 30, 50, 5, 15, 10, 5, 15, 15, 2, 20}; // ĿռС + int i = 0; + + printf(" InitSpace \n"); + { + int max = 200; // ֵΪ20ıĿǴӡԶ + + printf("ʼ %d \"\"ڴ󣬵ǰڴ沼Ϊ\n", max); + pav = InitSpace(max); + PrintMemoryLayout(); + printf("\n"); + } + PressEnterToContinue(debug); + + printf(" AllocBoundTag \n"); + { + for(i = 0; i < 12; i++) { + printf(" %2d> %d \"\"ڴ󣬵ǰڴ沼Ϊ\n", i + 1, s[i]); + p[i] = AllocBoundTag(&pav, s[i]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + printf(" FreeBoundTag \n"); + { + // һָ˳ + int a[10] = {7, 3, 10, 6, 8, 5, 11, 1, 0, 4}; + + for(i = 0; i < 10; i++) { + printf(" p%d ָڴ...\n", a[i] + 1); + Algo_8_13(&pav, p[a[i]]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ + */ +void Algo_8_13(Space* pav, Space p) { + FreeBoundTag(pav, p); +} + diff --git a/Dev-C++/ExerciseBook/08.13/08.13.dev b/Dev-C++/ExerciseBook/08.13/08.13.dev new file mode 100644 index 0000000..6f72eea --- /dev/null +++ b/Dev-C++/ExerciseBook/08.13/08.13.dev @@ -0,0 +1,82 @@ +[Project] +FileName=08.13.dev +Name=08.13 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=08.13.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=BoundaryTagMethod.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=BoundaryTagMethod.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.cpp b/Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.cpp new file mode 100644 index 0000000..9e923cc --- /dev/null +++ b/Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.cpp @@ -0,0 +1,331 @@ +/*============== + * ߽ʶ + * + * 㷨: 8.1 + ===============*/ + +#include "BoundaryTagMethod.h" //**08 ̬洢**// + +/* + * ȫֱԶָʼռͷ + * ñã + * 1.׷ڴ沼֣鿴ڴʹ + * 2.ָʾڴʼͽβ + */ +static Space av; + +// ¼ռ׷ڴ沼 +static int len; + + +/* + * ʼһܴСΪnֵڴ棬ָڴָ + * עصijʼڴѾheadfoot + */ +Space InitSpace(int n) { + Space space, head, foot; + + // ʼڴ + space = (Space) malloc(n * sizeof(WORD)); + if(space == NULL) { + return NULL; + } + + // ʼͷϢ + head = space; + head->llink = space; // ǰָ + head->rlink = space; // ָ + head->size = n; // ռСѾheadfoot + head->tag = 0; // ǿռ + + // ʼײϢ + foot = FootLoc(head); // ʼײָ + foot->uplink = head; // ײӵͷ + foot->tag = 0; // ǿռ + + // ¿ռʼλú + av = space; + len = n; + + return space; +} + +/* + * 㷨8.1 + * + * ߽ʶڴ㷨 + * + * ӿռpavһСΪnĿռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * Ϊʹʣ龡ȷֲÿη֮Ҫѿռָpavǰƶμ̲ġ + * + * ע + * 1.״Ϸһڴͽз + * 2.Ϊ˱ռƬ죬һݲe庬ο̲ + * 3.nֵĿռ䣬ָѾɻĿռ䡣 + * ûҪΪ10ֵĿռ䣬ÿռְheadfootִ洢ռʹϢ + * ʵϷĿռСӦΪ12֣"12"nĺ塣 + * ̲ᵽ"headfootڷʱԲ"Ϊαдķ㡣ʵдʱռDzܺԵġ + * nΪѾռ䣬ûԭʼĿռ䣬 + * ôûкԿռ䣬Чϣ̲αͳһνȫ + */ +Space AllocBoundTag(Space* pav, int n) { + Space p, f; + + /* + * һжϣĿռС3ֱӷء + * Ϊheadfootռ2ֿռ䣬û1ֵĻռΪ3֡ + */ + if(n < 3) { + printf("־ʧܣ\"\"ӦС3\n"); + return NULL; + } + + // ҲСnĿп + for(p = *pav; p && p->size < n && p->rlink != *pav; p = p->rlink) { + } + + // ҲʵĿп飬ؿָ + if(!p || p->size < n) { + return NULL; + } + + /* ˣpָĿп */ + + // fָÿпĵײ + f = FootLoc(p); + + // pavָpĺ̽㣬ָһп + *pav = p->rlink; + + // п˶٣Ҫ䣬<=eʣ + if(p->size - n <= e) { + // Ѿpavָһп飬pavpȣ˵ʱֻһп(עп˫ѭ) + if(*pav == p) { + *pav = NULL; // ʣһпˣôռú󣬿ÿռΪձ + + // ڱɾĽ + } else { + (*pav)->llink = p->llink; // ޸pavǰ + p->llink->rlink = *pav; // ޸pavǰĺ + + /* Уpǰ̲ûиı䣬Ϊ˷㽫Ļղ */ + } + + // ռÿΪռ״̬ + p->tag = f->tag = 1; + + printf("־ɹ %d \"\"ʵʷ %d \"\"пռΪ %d ...\n", n, n + e, AvailableSpace(*pav)); + + // пܴмиռún + } else { + f->tag = 1; // ޸ķĵײ־ʾ䴦ռ״̬ + p->size -= n; // ʣС + + f = FootLoc(p); // ʣµײλ + f->tag = 0; // µײ־Ϊ + f->uplink = p; // µײȻָпͷ + + p = f + 1; // ͷλ + p->tag = 1; // ÷ͷ־Ϊռ + p->size = n; // ÷ + + // ޸ķײ(̲ȱʧ˴˲) + (FootLoc(p))->uplink = p; + + printf("־ɹ벢 %d \"\"пռΪ %d ...\n", n, AvailableSpace(*pav)); + } + + // ط׵ַ + return p; +} + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עе"ͷſ"ָpָڴ + */ +void FreeBoundTag(Space* pav, Space p) { + Space h, f, q; + int Ltag, Rtag; + + if(p == NULL) { + printf("־ʧܣڴָΪաпռΪ %d ...\n", AvailableSpace(*pav)); + return; + } + + Ltag = p == av ? 1 : (p - 1)->tag; // p־رע⣬pλڴʼΪΪռá + Rtag = (p + p->size) == (av + len) ? 1 : (p + p->size)->tag; // p־رע⣬pλڴβΪΪռá + + /* + * 1.ͷſΪռÿ + * + * ʱҪp뵽pavָ֮ǰ(Ȼ뵽֮ҲǿԵ) + */ + if(Ltag == 1 && Rtag == 1) { + printf("־\"ͷſ\"Ϊ %d Ϊռÿ...\n", p->size); + + f = FootLoc(p); + f->uplink = p; + f->tag = 0; + + p->tag = 0; + + // ΪʱֱӽpΪµĶĿп + if((*pav) == NULL) { + *pav = p->llink = p->rlink = p; + + // 򣬽p뵽pav֮ǰ + } else { + q = (*pav)->llink; + p->rlink = *pav; + p->llink = q; + q->rlink = (*pav)->llink = p; + + // ͷŵĽΪ´ηռʱȲҵĽ + *pav = p; + } + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 2.ͷſΪп飬Ϊռÿ + * + * ʱҪϲͷſ + */ + if(Ltag == 0 && Rtag == 1) { + printf("־\"ͷſ\"Ϊ %d Ϊп飬Ϊռÿ...\n", p->size); + + h = (p - 1)->uplink; // ͷ⽫Ϊϲ¿ͷ + h->size += p->size; // + + f = FootLoc(p); // ͷſĵײΪϲ¿ĵײ + f->uplink = h; + f->tag = 0; + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 3.ͷſΪռÿ飬Ϊп + * + * ʱҪϲͷſ + */ + if(Ltag == 1 && Rtag == 0) { + printf("־\"ͷſ\"Ϊ %d Ϊռÿ飬Ϊп...\n", p->size); + + h = p + p->size; // ͷ + + f = FootLoc(h); // ĵײ⽫Ϊϲ¿ĵײ + f->uplink = p; // ͷſͷΪϲ¿ͷ + + p->tag = 0; + p->size += h->size; + + // ͷſͷҪΪͷһ + p->llink = h->llink; + p->rlink = h->rlink; + h->llink->rlink = p; + h->rlink->llink = p; + + // pavָϲĽͷ + *pav = p; + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 4.ͷſΪп + * + * ʱҪϲͷſ顢 + */ + if(Ltag == 0 && Rtag == 0) { + printf("־\"ͷſ\"Ϊ %d Ϊп...\n", p->size); + + h = (p - 1)->uplink; // ͷ⽫Ϊϲ¿ͷ + q = p + p->size; // ͷ + f = FootLoc(q); // ĵײ⽫Ϊϲ¿ĵײ + + h->size += p->size + q->size; // ϲ¿С + f->uplink = h; // ¿ײϢҲҪ + + // Ƴ + q->rlink->llink = q->llink; + q->llink->rlink = q->rlink; + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } +} + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout() { + Space p; + int count; + int i; + + p = av; + count = av->size; + + for(i = 1; i <= count; i++) { + if(p->tag == 0) { + printf(""); + } else { + printf(""); + } + + if(i == count && count < len) { + p = p + p->size; + count += p->size; + printf("|"); + } else { + printf(" "); + } + + // ÿ20һ + if(i % 20 == 0) { + printf("\n"); + } + } + + if(len % 20 != 0) { + printf("\n"); + } +} + +/* + * õĿпռ + * + * עڲʹã־ӡ + */ +static int AvailableSpace(Space pav) { + Space p; + int count; + + if(pav == NULL) { + return 0; + } + + p = pav; + count = 0; + + do { + count += p->size; + p = p->rlink; + } while(p != pav); + + return count; +} + diff --git a/Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.h b/Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.h new file mode 100644 index 0000000..453e4b1 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.13/BoundaryTagMethod.h @@ -0,0 +1,97 @@ +/*============== + * ߽ʶ + * + * 㷨: 8.1 + ===============*/ + +#ifndef BOUNDARYTAGMETHOD_H +#define BOUNDARYTAGMETHOD_H + +#include +#include +#include "Status.h" //**01 **// + +/* 궨 */ +#define e 5 // ռʱõݲ +#define FootLoc(p) p+(p->size)-1 // pָ붨λpָڴĵײ + + +/* + * ڴ""Ͷ + * + * ν""ָռСλֽڡ + * һ""жȡڶ""ṹζġ + */ +typedef struct WORD { + + /* + * ע + * ̲нllinkuplinkװһУ˸оװЩߡ + * һ棬headfootĹʵֻtag壬ôӦsizerlinkҲװ + * һ棬װʡĿռޣֱӰ˴Ŀɶԡ + * ֻǽѧ룬ʵϵͳ룬Կռ俼ΣԭչʾΪҪ + * ⣬̲еαҲûп壬ֱӽвġ + * ȥ˽̲еṹ + * ۲дԲοCFree֧Ĵ롣 + */ + + int tag; // ־0У1ռãͷβ + + struct WORD* llink; // ͷָǰ + struct WORD* rlink; // ͷָ̽ + int size; // ͷ򣬿С + + struct WORD* uplink; // ײָ򱾽ͷ +} WORD; + +typedef WORD* Space; // Spaceָÿռָ + + +/* + * ʼһСΪnֵڴ棬ָڴָ + * עصijʼڴѾheadfoot + */ +Space InitSpace(int n); + +/* + * 㷨8.1 + * + * ߽ʶڴ㷨 + * + * ӿռpavһСΪnĿռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * Ϊʹʣ龡ȷֲÿη֮Ҫѿռָpavǰƶμ̲ġ + * + * ע + * 1.״Ϸһڴͽз + * 2.Ϊ˱ռƬ죬һݲe庬ο̲ + * 3.nֵĿռ䣬ָѾɻĿռ䡣 + * ûҪΪ10ֵĿռ䣬ÿռְheadfootִ洢ռʹϢ + * ʵϷĿռСӦΪ12֣"12"nĺ塣 + * ̲ᵽ"headfootڷʱԲ"Ϊαдķ㡣ʵдʱռDzܺԵġ + * nΪѾռ䣬ûԭʼĿռ䣬 + * ôûкԿռ䣬Чϣ̲αͳһνȫ + */ +Space AllocBoundTag(Space* pav, int n); + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ + */ +void FreeBoundTag(Space* pav, Space p); + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout(); + +/* + * õĿпռ + * + * עڲʹã־ӡ + */ +static int AvailableSpace(Space pav); + +#endif + diff --git a/Dev-C++/ExerciseBook/08.14/08.14.cpp b/Dev-C++/ExerciseBook/08.14/08.14.cpp new file mode 100644 index 0000000..1c340ac --- /dev/null +++ b/Dev-C++/ExerciseBook/08.14/08.14.cpp @@ -0,0 +1,67 @@ +#include +#include "BuddySystem.h" //**08 ̬洢**// + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void Algo_8_14(FreeList avail, WORD* p); + + +int main(int argc, char* argv[]) { + FreeList avail; + WORD* p[8]; // ¼뵽ڴָ + int s[8] = {4, 5, 6, 7, 1, 5, 3, 9}; // ĿռС + int i; + + printf(" InitSpace \n"); + { + printf("ʼһڴ...\n"); + InitSpace(avail); + PrintMemoryLayout(); + printf("\n"); + } + PressEnterToContinue(debug); + + printf(" AllocBuddy \n"); + { + for(i = 0; i < 8; i++) { + printf("СΪ %d ֵڴ...\n", s[i]); + p[i] = AllocBuddy(avail, s[i]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + printf(" FreeBuddy \n"); + { + // һָ˳ + int a[8] = {2, 0, 5, 7, 1, 4, 3, 6}; + + for(i = 0; i < 8; i++) { + Algo_8_14(avail, p[a[i]]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void Algo_8_14(FreeList avail, WORD* p) { + FreeBuddy(avail, p); +} + diff --git a/Dev-C++/ExerciseBook/08.14/08.14.dev b/Dev-C++/ExerciseBook/08.14/08.14.dev new file mode 100644 index 0000000..87c871f --- /dev/null +++ b/Dev-C++/ExerciseBook/08.14/08.14.dev @@ -0,0 +1,82 @@ +[Project] +FileName=08.14.dev +Name=08.14 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=08.14.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=BuddySystem.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=BuddySystem.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/08.14/BuddySystem.cpp b/Dev-C++/ExerciseBook/08.14/BuddySystem.cpp new file mode 100644 index 0000000..9b49daa --- /dev/null +++ b/Dev-C++/ExerciseBook/08.14/BuddySystem.cpp @@ -0,0 +1,284 @@ +/*============== + * ϵͳ + * + * 㷨: 8.2 + ===============*/ + +#include "BuddySystem.h" + +// ¼ڴʼַڼʱҪõ +WORD* start; + + +/* + * ʼһСΪ2^Mֵڴ棬ָڴָ + * עصijʼڴѾhead + */ +void InitSpace(FreeList avail) { + int k; + WORD* r; + + // M+1Ԫ + for(k = 0; k <= M; k++) { + avail[k].nodesize = (int) pow(2, k); + avail[k].first = NULL; + } + + r = (WORD*) malloc((int) pow(2, M) * sizeof(WORD)); + if(r == NULL) { + exit(OVERFLOW); + } + + // ͷϢ + r->llink = r->rlink = r; + r->tag = 0; + r->kval = M; + + avail[M].first = r; + + start = r; +} + +/* + * 㷨8.2 + * + * ϵͳڴ㷨 + * + * ӿռavailһСΪn(ԭʼֵ)Ŀռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * + * ע + * 1.״Ϸһڴͽз + * 2.nֵĿռ䣬ָûԭʼռ䡣 + * ʵʱҪǵÿǰ1ֵheadϢʵҪ(n+1)֡ + * n㷨8.1n෴Ҫע⡣ + */ +WORD* AllocBuddy(FreeList avail, int n) { + int k, i; + WORD* pa, * pre, * suc, * pi; + + /* + * һжϣĿռС1ֱӷء + */ + if(n < 1) { + printf("־ʧܣ\"\"ӦС1\n"); + return NULL; + } + + // ҲСnĿп + for(k = 0; k <= M && (avail[k].nodesize < n + 1 || !avail[k].first); k++) { + } + + // ҲʵĿп飬ؿָ + if(k > M) { + printf("־ʧܣû㹻Ŀп\n"); + return NULL; + } + + 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; + } + + /* + * k-1ʼFreeList飬ʣĿп顣 + * ʣĿпǶʣÿռIJ֡ + * + * õһʽ2^m-2^n = 2^n+2^(n+1)+...+2^(m-1) + * ʼΪ2^16ʱܹ1500֣ôҪһ2^11Ŀп + * ֮ʣΪ2^16-2^11 = 2^11+2^12+2^13+2^14+2^15 + * ЩʣԲΪ5п飬ֱ洢1514131211 + */ + for(i = 1; k - i >= 0 && avail[k - i].nodesize >= n + 1; i++) { + pi = pa + (int) pow(2, k - i); // ÿνpiָʣռĺһ + pi->rlink = pi->llink = pi; // ʼpiǰͺ + pi->tag = 0; // Ϊп + pi->kval = k - i; // øÿ־ʵΪ2^(k-i) + avail[k - i].first = pi; + + /* + * ע + * ֽpiֱӵavailУûпͬλô᲻бͬĿп顣 + * ﲻҪǵԭͬλôѾڱͬĿп飬 + * ôҪֽʣռ䣬仰˵ѭ + * ֻҪѭ˵ĿλôѾΪˣûҵʵĿп飬Žһα괦Ѱҿп顣 + */ + } + + // ʣµǰĿռҪĿռ(ûpaǰͺ̣ΪûҪ) + pa->tag = 1; + pa->kval = k - (--i); + + printf("־ɹû %d ֣ϵͳ %d ֣ʵʷ %d \n", n, n + 1, (int) pow(2, pa->kval)); + + return pa; +} + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void FreeBuddy(FreeList avail, WORD* p) { + int k; + WORD* r; + WORD* buddy = Buddy(p); + + if(p == NULL) { + return; + } + + /* + * ォp򵥵ز뵽availУΣ + * 1.ǿ + * 2.УǻĴСpĴСһ£˵黹ûƴϺ + * 3.pƴӳһĿп + */ + if(buddy->tag == 1 || buddy->kval != p->kval || p->kval == M) { + for(k = 0; k <= M && k < p->kval; k++) { + // pӦIJ + } + + // ҵۣͷ巨п뵽Ŀ + if(k <= M && k == p->kval) { + p->tag = 0; + + if(avail[k].first == NULL) { + p->llink = p->rlink = p; + } else { + p->llink = avail[k].first->llink; + p->rlink = avail[k].first; + p->llink->rlink = p; + p->rlink->llink = p; + } + + avail[k].first = p; + + printf("־ճɹ[%d, (2^%d)] %d Ŀп\n", (int) (p - start), k, k); + } + + // ǿеģʱӦкϲ + } else { + for(k = 0; k <= M && k < p->kval; k++) { + // һڵIJ + } + + // ҵۣӿпժ + if(k <= M && k == p->kval) { + // һλ + if(avail[k].first == buddy) { + buddy->rlink->llink = buddy->llink; + buddy->llink->rlink = buddy->rlink; + + avail[k].first = buddy->rlink; + + // мλ + } else { + for(r = avail[k].first; r->rlink != buddy; r = r->rlink) { + // һ飬rָǰ + } + + r->rlink = buddy->rlink; + buddy->rlink->llink = r; + } + + printf("־ϲɹ[%d, (2^%d)][%d, (2^%d)]ϲ", (int) (p - start), k, (int) (buddy - start), k); + + // ϲ֮ǰҪȷĸ鿿ǰ + if(p < buddy) { + p->tag = 0; + } else { + p = buddy; + } + + p->kval = k + 1; // ָһ󣬼ɺϲ + + printf("[%d, (2^%d)]\n", (int) (p - start), k + 1); + + // µĿп֮Ҫݹ飬鿴ÿпǷҲڿл + FreeBuddy(avail, p); + } + } +} + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout() { + int i, count, total; + WORD* p; + + printf("|"); + + p = start; + count = (int) pow(2, p->kval); + + for(i = 1; i <= count; i++) { + if(p->tag == 0) { + printf("_"); + } else { + printf("*"); + } + + // 뵽һ + if(i == count && count < (int) pow(2, M)) { + p = start + count; + count += (int) pow(2, p->kval); + printf("|"); + } + } + + printf("|\n"); +} + +/* + * ҿpĻ + * + * һп԰Ѻ󣬻ɵСп飬Сп黥Ϊ顣 + * + * 㷨Ϊ + * ʼַΪpСΪ2^kڴ飺 + * 1. p MOD 2^(k+1) == 0 ,pĻʼַΪp+2^k + * 2. p MOD 2^(k+1) == 2^k ,pĻʼַΪp-2^k + * + * עڲʹãڻ㷨 + */ +static WORD* Buddy(WORD* p) { + long s, m, n; + + if(p == NULL) { + return NULL; + } + + // startпľʼַspڻϵͳеľԵַ0ʼ + s = p - start; + if(s < 0) { + return NULL; + } + + m = (long) pow(2, p->kval); + n = (long) pow(2, p->kval + 1); + + if(s % n == 0) { + return p + m; + } + + if(s % n == m) { + return p - m; + } + + return NULL; +} + diff --git a/Dev-C++/ExerciseBook/08.14/BuddySystem.h b/Dev-C++/ExerciseBook/08.14/BuddySystem.h new file mode 100644 index 0000000..9bff813 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.14/BuddySystem.h @@ -0,0 +1,90 @@ +/*============== + * ϵͳ + * + * 㷨: 8.2 + ===============*/ + +#ifndef BUDDYSYSTEM_H +#define BUDDYSYSTEM_H + +#include +#include +#include +#include "Status.h" //**01 **// + +/* 궨 */ +#define M 6 // ܿռСΪ2^M֣ӱΪM+1 + + +/* + * ڴ""Ͷ + * + * ν""ָռСλֽڡ + * һ""жȡڶ""ṹζġ + */ +typedef struct WORD { + struct WORD* llink; // ͷǰָ + struct WORD* rlink; // ͷĺָ + int tag; // ͷĿ־0:У1:ռ + int kval; // ָʾĴСֵΪKʱʾÿĴСΪ2^K +} WORD; + +// ͷ +typedef struct HeadNode { + int nodesize; // ĿпĴС + WORD* first; // ıͷָ +} FreeList[M + 1]; + + +/* + * ʼһСΪ2^Mֵڴ棬ָڴָ + * עصijʼڴѾhead + */ +void InitSpace(FreeList avail); + +/* + * 㷨8.2 + * + * ϵͳڴ㷨 + * + * ӿռavailһСΪn(ԭʼֵ)Ŀռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * + * ע + * 1.״Ϸһڴͽз + * 2.nֵĿռ䣬ָûԭʼռ䡣 + * ʵʱҪǵÿǰ1ֵheadϢʵҪ(n+1)֡ + * n㷨8.1n෴Ҫע⡣ + */ +WORD* AllocBuddy(FreeList avail, int n); + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void FreeBuddy(FreeList avail, WORD* p); + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout(); + +/* + * ҿpĻ + * + * һп԰Ѻ󣬻ɵСп飬Сп黥Ϊ顣 + * + * 㷨Ϊ + * ʼַΪpСΪ2^kڴ飺 + * 1. p MOD 2^(k+1) == 0 ,pĻʼַΪp+2^k + * 2. p MOD 2^(k+1) == 2^k ,pĻʼַΪp-2^k + * + * עڲʹãڻ㷨 + */ +static WORD* Buddy(WORD* p); + +#endif + diff --git a/Dev-C++/ExerciseBook/08.15/08.15.cpp b/Dev-C++/ExerciseBook/08.15/08.15.cpp new file mode 100644 index 0000000..695403b --- /dev/null +++ b/Dev-C++/ExerciseBook/08.15/08.15.cpp @@ -0,0 +1,86 @@ +#include +#include "MemoryManager.h" + +/* + * ڴ + * + * пռӳһп + */ +void Algo_8_15(Space* space); + + +int main(int argc, char** argv) { + Space space; + int i; + int a[11] = {10, 20, 30, 15, 20, 5, -1, -3, 0, 15, 10}; + WORD* p[11]; + + InitSpace(&space); + printf("ʼڴ沼֣\n"); + PrintMemoryLayout(space); + + /* + * ע + * a[4]ʱʣ25""ǰݲ5˱λֱӷ20+5=25"" + * a[5]ʱѾûпõ֣ʧ + * a[10]ʱݲΧڣ + */ + for(i = 0; i < 11; i++) { + if(a[i] > 0) { + printf("+ %d ֵĴ洢\n", a[i]); + p[i] = AllocMemory(&space, a[i]); + } else { + printf("- ͷ %d ֵĴ洢\n", a[-a[i]]); + FreeMemory(&space, p[-a[i]]); + } + + PrintMemoryLayout(space); + + if(i == 8) { + printf("ڴ...\n"); + Algo_8_15(&space); + PrintMemoryLayout(space); + } + } +} + + +/* + * ڴ + * + * пռӳһп + */ +void Algo_8_15(Space* space) { + WORD* p, * q; + + space->avail = NULL; + + q = NULL; + + // + for(p = space->lowbound; p < space->highbound; p += p->cellsize) { + if(p->tag == 1) { + continue; + } + + // ȰѺÿ + p->next = NULL; + + // ˵һп + if(space->avail == NULL) { + space->avail = p; + q = p; + continue; + } + + // пַڣ + if(q + q->cellsize != p) { + q->next = p; + + // ڵַڵĿп飬Ҫϲ + } else { + q->cellsize += p->cellsize; + } + } +} + diff --git a/Dev-C++/ExerciseBook/08.15/08.15.dev b/Dev-C++/ExerciseBook/08.15/08.15.dev new file mode 100644 index 0000000..a152d9f --- /dev/null +++ b/Dev-C++/ExerciseBook/08.15/08.15.dev @@ -0,0 +1,82 @@ +[Project] +FileName=08.15.dev +Name=08.15 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=08.15.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MemoryManager.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MemoryManager.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/08.15/MemoryManager.cpp b/Dev-C++/ExerciseBook/08.15/MemoryManager.cpp new file mode 100644 index 0000000..4e788da --- /dev/null +++ b/Dev-C++/ExerciseBook/08.15/MemoryManager.cpp @@ -0,0 +1,132 @@ +/*======================= + * 洢ϰ8.15 + ========================*/ + +#include "MemoryManager.h" + +// ʼһƬõĴ洢 +void InitSpace(Space* space) { + space->avail = (WORD*) malloc(MAXSIZE * sizeof(WORD)); + space->avail->tag = 0; + space->avail->cellsize = MAXSIZE; + space->avail->next = NULL; + + space->lowbound = space->avail; + space->highbound = space->avail + MAXSIZE; +} + +// СΪnڴ棬ָڴַ +WORD* AllocMemory(Space* space, int n) { + WORD* p, * q; + + if(space->avail == NULL) { + return NULL; + } + + p = space->avail; + q = NULL; + + // һп鲻 + if(p->cellsize < n) { + // Ŀڴ + while(p != NULL && p->cellsize < n) { + q = p; + p = p->next; + } + } + + // ûзĿڴ + if(p == NULL) { + return NULL; + } + + // ݲΧڣ + if(p->cellsize - e <= n) { + if(q == NULL) { + space->avail = p->next; + } else { + q->next = p->next; + } + + // ָп + } else { + + if(q == NULL) { + space->avail += n; + space->avail->tag = 0; + space->avail->cellsize = p->cellsize - n; + space->avail->next = p->next; + } else { + q->next = p + n; + q->next->tag = 0; + q->next->cellsize = p->cellsize - n; + } + + p->cellsize = n; + } + + // Ϊռ + p->tag = 1; + + return p; +} + +// ͷָpڴ +void FreeMemory(Space* space, WORD* p) { + p->tag = 0; // 򵥵رΪУԴ +} + +// ӡڴ沼 +void PrintMemoryLayout(Space space) { + int i, count; + WORD* p; + + // п + for(p = space.lowbound; p < space.highbound; p += p->cellsize) { + if(p->tag == 0) { + p->flag = -1; // ʱΪ""Ŀп + } else { + p->flag = 1; // Ϊռ + } + } + + // п + for(p = space.avail; p != NULL; p = p->next) { + p->flag = 0; // Ϊ""Ŀп + } + + count = 0; + + for(p = space.lowbound; p < space.highbound; p += p->cellsize) { + for(i = 0; i < p->cellsize; i++) { + switch(p->flag) { + case -1: + printf(""); + break; + case 0: + printf(""); + break; + case 1: + printf(""); + break; + default: + printf("ıǣ\n"); + return; + } + + count++; + // ÿ20ֻһ + if(count % 20 == 0) { + printf("\n"); + } + } + + } + + if(count % 20 != 0) { + printf("\n"); + } + + printf("\n"); +} + diff --git a/Dev-C++/ExerciseBook/08.15/MemoryManager.h b/Dev-C++/ExerciseBook/08.15/MemoryManager.h new file mode 100644 index 0000000..b08294a --- /dev/null +++ b/Dev-C++/ExerciseBook/08.15/MemoryManager.h @@ -0,0 +1,58 @@ +/*======================= + * 洢ϰ8.15 + ========================*/ + +#include +#include +#include + +#ifndef MEMORYMANAGER_H +#define MEMORYMANAGER_H + + +/* 궨 */ +#define MAXSIZE 100 // ڴ +#define e 5 // ռʱõݲ + + +/* + * ڴ""Ͷ + * + * ν""ָռСλֽڡ + * һ""жȡڶ""ṹζġ + */ +typedef struct WORD { + int tag; // ־0У1ռ + int cellsize; // ǰĴС + struct WORD* next; // ָһп + + + /* + * ʹñǣ0У1ռã-1ȻУDzڿС + * ǽԴӡܣûʵԵô + */ + int flag; +} WORD; + +// ""ռ +typedef struct { + struct WORD* lowbound; // ռ½ + struct WORD* highbound; // ռϽ + struct WORD* avail; // ָÿռ +} Space; + + +// ʼһƬõĴ洢 +void InitSpace(Space* space); + +// СΪnڴ棬ָڴַ +WORD* AllocMemory(Space* space, int n); + +// ͷָpڴ +void FreeMemory(Space* space, WORD* p); + +// ӡڴ沼 +void PrintMemoryLayout(Space space); + +#endif + diff --git a/Dev-C++/ExerciseBook/08.16/08.16.cpp b/Dev-C++/ExerciseBook/08.16/08.16.cpp new file mode 100644 index 0000000..1ab3b39 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.16/08.16.cpp @@ -0,0 +1,443 @@ +#include +#include +#include +#include "MemoryManager.h" + +/* + * 洢㷨 + * + * 㷨ʵֹ洢ϢϢء + * ˴Ľ㷨ǽԼʵֵMemoryManager֮ϵġ + * бĴ洢ô㷨ҲҪ֮ı䡣 + * + * 岽μ̲ġ + */ +void Algo_8_16(Space* space); + +// ڴ¼׵ַڴ¼ʱõıȽ÷ڲʹ +static int qsortCompar(const void* r1, const void* r2); + +// һڴ¼ڴ¼ӵоɵַoldAddr÷ڲʹ +static int search(Space space, int oldAddr); + +// ϰ8.10ݽв +void Test_8_10(Space* space, char* path); + +// ʹԶIJݣﻹԲûı +void TestCustom(Space* space, int* p[]); + + +int main(int argc, char** argv) { + +// printf("=== ʹϰ8.10еIJ ===\n\n"); +// { +// Space space; +// +// // ʼһƬõĴ洢 +// InitSpace(&space); +// printf("ʼڴ沼֣\n"); +// PrintMemoryLayout(space); +// +// // ϰ8.10 +// Test_8_10(&space, "TestData_8_10.md"); +// printf("ϰ8.10еڴ沼֣\n"); +// PrintMemoryLayout(space); +// +// // 洢 +// Algo_8_16(&space); +// printf("д洢ڴ沼֣\n"); +// PrintMemoryLayout(space); +// } + + printf("=== ʹԶIJ ===\n\n"); + { + Space space; + int* p[10]; // û(ַ) + char* data = (char*)malloc(sizeof(char)); + + // ʼһƬõĴ洢 + InitSpace(&space); + printf("ʼڴ沼֣\n"); + PrintMemoryLayout(space); + + // Զ + TestCustom(&space, p); + + // 洢 + Algo_8_16(&space); + printf("д洢ڴ沼֣\n"); + PrintMemoryLayout(space); + + printf("ڴ沼֣֤ûǷѾͬ£\n"); + memmove(data, getPtr(space, p[9]), 1); + printf("p10 = %d\n", *data); + memmove(data, getPtr(space, p[6]), 1); + printf("p7 = %d\n", *data); + memmove(data, getPtr(space, p[7]), 1); + printf("p8 = %d\n", *data); + memmove(data, getPtr(space, p[5]), 1); + printf("p6 = %d\n", *data); + memmove(data, getPtr(space, p[8]), 1); + printf("p9 = %d\n", *data); + } + +} + + +/* + * 洢㷨 + * + * 㷨ʵֹ洢ϢϢء + * ˴Ľ㷨ǽԼʵֵMemoryManager֮ϵġ + * бĴ洢ô㷨ҲҪ֮ı䡣 + * + * 岽μ̲ġ + */ +void Algo_8_16(Space* space) { + Record* r; + int len; + int i, j, k, count; + int busy, free; + int* oldPtr; // ¼ɵַ + + // ǰڴʹü¼ + len = ListLength(space->recordList); + + /* 0. ڴ¼ںڴǨ */ + qsort(space->recordList.elem, len, sizeof(ElemType), qsortCompar); + +// printf("־0. ڴ¼ˣֻ˶׵ַ˳򣩣\n"); +// PrintMemoryLayout(*space); + + + /* 1. ȷ洢󣬸ڴµַ仰˵˲裬һ¾ɵַձ */ + + free = 0; // ͳƿпĴС + busy = 0; // ͳռÿĴСȷռÿµַ + count = 0; // ͳƽڴ + j = 0; + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // Կп飬ҪͳĴС + if(r->tag == 0) { + free += r->size; + continue; + } + + // ͳռÿ + count++; + + // ռռÿ飬ַϢ + r->oldAddr = r->addr; + r->addr = busy; + busy += r->size; + + // µռÿϢеǰ + space->recordList.elem[j++] = r; + } + + // ¼пϢ + if(free != 0) { + // ·ڴ + r = (Record*) malloc(sizeof(Record)); + r->addr = busy; + r->size = free; + r->tag = 0; + r->oldAddr = -1; + + space->recordList.elem[j] = r; + + count++; + + // ָµĿпļ¼ + space->cur = count; + } + + // ڴʹü¼³ + space->recordList.length = count; + +// printf("־1. ¾ɵַձˣֻ\"ռ\"ڴǰƣԼ\"\"ڴĺϲ\n"); +// PrintMemoryLayout(*space); + + + /* 2. ûַԱ֮ı */ + + // û + len = ListLength(space->ptrList); + + for(i = 0; i < len; i++) { + // עC++еǿתʽ + oldPtr = static_cast(space->ptrList.elem[i]); + + // ȡɵַڴ¼е + k = search(*space, *oldPtr); + + // Ϊµַ + *oldPtr = ((Record*) (space->recordList.elem[k]))->addr; + } + +// printf("־2. ûɣˣû(ַָ)Ѿָȷڴ棬ʾ\n"); +// PrintMemoryLayout(*space); + + + /* 3. ӣǰͺ */ + + len = ListLength(space->recordList); + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // пʱԽѭ + if(r->tag==0) { + break; + } + + if(r->pre != -1) { + k = search(*space, r->pre); + r->pre = ((Record*) (space->recordList.elem[k]))->addr; + } + + if(r->next != -1) { + k = search(*space, r->next); + r->next = ((Record*) (space->recordList.elem[k]))->addr; + } + } + +// printf("־3. ڴ¼еǰͺѾʾ\n"); +// PrintMemoryLayout(*space); + + + /* 4. Ǩû */ + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // Ŀм¼һģм¼ʱͿԽѭ + if(r->tag == 0) { + // õַӦڴ洦Ĩ(Ǹѡ) + memset(getPtr(*space, &(r->addr)), 0, r->size * BYTE); + break; + } + + // ¾ɵַһǨ + if(r->addr == r->oldAddr) { + continue; + } + + memmove(space->base + r->addr * BYTE, space->base + r->oldAddr * BYTE, r->size); + } + +// printf("־4. Ǩɣˣʾвûݣ\n"); +// PrintMemoryLayout(*space); + +} + +// ʹԶIJݣﻹԲûı +void TestCustom(Space* space, int* p[]) { + + printf("+ Ϊ p1 10ڴ棬ڴд 1 ...\n"); + p[0] = AllocMemory(space, 10); + memset(getPtr(*space, p[0]), 1, 1); + PrintMemoryLayout(*space); + + printf("+ Ϊ p2 50ڴ棬ڴд 2 ...\n"); + p[1] = AllocMemory(space, 50); + memset(getPtr(*space, p[1]), 2, 1); + PrintMemoryLayout(*space); + + printf("+ Ϊ p3 20ڴ棬ڴд 3 ...\n"); + p[2] = AllocMemory(space, 20); + memset(getPtr(*space, p[2]), 3, 1); + PrintMemoryLayout(*space); + + printf("- ͷ p2 50ڴ...\n"); + FreeMemory(space, p[1]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p4 5ڴ棬ڴд 4 ...\n"); + p[3] = AllocMemory(space, 5); + memset(getPtr(*space, p[3]), 4, 1); + PrintMemoryLayout(*space); + + printf("+ Ϊ p5 10ڴ棬ڴд 5 ...\n"); + p[4] = AllocMemory(space, 10); + memset(getPtr(*space, p[4]), 5, 1); + PrintMemoryLayout(*space); + + printf("- ͷ p4 5ڴ...\n"); + FreeMemory(space, p[3]); + PrintMemoryLayout(*space); + + printf("- ͷ p3 20ڴ...\n"); + FreeMemory(space, p[2]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p6 15ڴ棬ڴд 6 ...\n"); + p[5] = AllocMemory(space, 15); + memset(getPtr(*space, p[5]), 6, 1); + ((Record*)(space->recordList.elem[2]))->pre = 25; + ((Record*)(space->recordList.elem[2]))->next = 0; + PrintMemoryLayout(*space); + + printf("+ Ϊ p7 10ڴ棬ڴд 7 ...\n"); + p[6] = AllocMemory(space, 10); + memset(getPtr(*space, p[6]), 7, 1); + ((Record*)(space->recordList.elem[4]))->pre = 60; + ((Record*)(space->recordList.elem[4]))->next = -1; + PrintMemoryLayout(*space); + + printf("+ Ϊ p8 15ڴ棬ڴд 8 ...\n"); + p[7] = AllocMemory(space, 15); + memset(getPtr(*space, p[7]), 8, 1); + ((Record*)(space->recordList.elem[7]))->pre = -1; + ((Record*)(space->recordList.elem[7]))->next = 15; + PrintMemoryLayout(*space); + + printf("- ͷ p5 10ڴ...\n"); + FreeMemory(space, p[4]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p9 5ڴ棬ڴд 9 ...\n"); + p[8] = AllocMemory(space, 5); + memset(getPtr(*space, p[8]), 9, 1); + ((Record*)(space->recordList.elem[3]))->pre = 15; + ((Record*)(space->recordList.elem[3]))->next = 60; + PrintMemoryLayout(*space); + + printf("- ͷ p1 10ڴ...\n"); + FreeMemory(space, p[0]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p10 5ڴ棬ڴд 10 ...\n"); + p[9] = AllocMemory(space, 5); + memset(getPtr(*space, p[9]), 10, 1); + ((Record*)(space->recordList.elem[0]))->pre = -1; + ((Record*)(space->recordList.elem[0]))->next = -1; + PrintMemoryLayout(*space); + +} + +// ϰ8.10ݽв +void Test_8_10(Space* space, char* path) { + FILE* fp; + + char line[100]; // ȡ + char* p; // ָֽ + + Record* record; + + // ÿжȡ + int addr; + int size; + int tag; + int pre; + int next; + + // ¼ַ + int* free[100]; + int* ptr; + + int count; + int i; + + char data; // ֤ǨƵIJ + + fp = fopen(path, "r"); + + // ûЧݣֱӷؿյ˳ + if(fp == NULL) { + return; + } + + // ڱͷǰ + fgets(line, 100, fp); + fgets(line, 100, fp); + + count = 0; + i = 0; + data = 0; + + // ûеļβһֱȡ + while(fgets(line, 100, fp)!=NULL) { + // ׵ַ + p = strtok(line, " |\n\r"); + addr = atoi(p); + + // С + p = strtok(NULL, " |\n\r"); + size = atoi(p); + + // ־ + p = strtok(NULL, " |\n\r"); + tag = atoi(p); + + // ǰַ + p = strtok(NULL, " |\n\r"); + pre = atoi(p); + + // ̵ַ + p = strtok(NULL, " |\n\r"); + next = atoi(p); + + // sizeڴ + ptr = AllocMemory(space, size); + + // ȡոմڴ¼ָ룬ǰͺ̵ijʼ + // עC++еǿתʽ + record = static_cast(space->recordList.elem[i++]); + record->pre = pre; + record->next = next; + + /* + * Ϊոڴ渳ֵΪ˲ԺǨǷɹ + * ע︳ֵʱҪַתΪʵַ + */ + memset(getPtr(*space, ptr), ++data, 1); + + if(tag == 0) { + // õַڴҪͷ + free[count++] = ptr; + } + } + + fclose(fp); + + // ͷڴ + for(i = 0; i < count; i++) { + FreeMemory(space, free[i]); + } +} + +// ڴ¼׵ַڴ¼ʱõıȽ÷ڲʹ +static int qsortCompar(const void* r1, const void* r2) { + Record* record1 = *((Record**) r1); + Record* record2 = *((Record**) r2); + + return record1->addr - record2->addr; +} + +/* + * һڴ¼ڴ¼ӵоɵַoldAddr + * + * עʵܵЧΪ + * ȣұ˳ңЧʲߣ + * ΣһᱻظãЧʵЧ + * õ㷨ʹúѧĹϣ¾ɵַ洢ϣлἫؼӿٶȡ + * + * ÷ڲʹ + */ +static int search(Space space, int oldAddr) { + int k; + + for(k = 0; k < space.recordList.length; k++) { + // ҵƥľɵֵַ + if(oldAddr == ((Record*) (space.recordList.elem[k]))->oldAddr) { + return k; + } + } + + return -1; +} + diff --git a/Dev-C++/ExerciseBook/08.16/08.16.dev b/Dev-C++/ExerciseBook/08.16/08.16.dev new file mode 100644 index 0000000..5f1a801 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.16/08.16.dev @@ -0,0 +1,111 @@ +[Project] +FileName=08.16.dev +Name=08.16 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=6 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=08.16.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MemoryManager.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MemoryManager.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_8_10.md +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/08.16/MemoryManager.cpp b/Dev-C++/ExerciseBook/08.16/MemoryManager.cpp new file mode 100644 index 0000000..a7a0b28 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.16/MemoryManager.cpp @@ -0,0 +1,240 @@ +/*======================= + * 洢ϰ8.16 + ========================*/ + +#include "MemoryManager.h" + +// ʼһƬõĴ洢 +void InitSpace(Space* space) { + void* base; // ڴʼַ + Record* record; // һ¼ + + // ʼMAXSIZEֽڵڴ棬 + base = calloc(MAXSIZE, BYTE); + space->base = base; + + // ʼڴʹü¼ + InitList(&(space->recordList)); + + record = (Record*) malloc(sizeof(Record)); + + record->addr = 0; + record->size = MAXSIZE; + record->tag = 0; + record->pre = -1; + record->next = -1; + record->oldAddr = -1; + + // һڴʹü¼() + ListInsert(&(space->recordList), 1, record); + + // һõĿп + space->cur = 1; + + // ʼַ + InitList(&(space->ptrList)); +} + +// СΪnڴ棬ָڴַ +int* AllocMemory(Space* space, int n) { + int found; // ǷҵõĿп + int i, cur, len; + Record* record; + Record* newRecord; + int* ptr; + + // µǰĿп¼λ + i = cur = space->cur; + found = 0; + + // ȡǰڴ¼ij + len = ListLength(space->recordList); + + // ҿõĿڴ + while(1) { + // ȡǰڴʹϢ + GetElem(space->recordList, i, (ElemType*) &record); + + // ռÿ飬ѾĿп + if(record->tag == 1 || record->size < n) { + // ǰһ¼עѭ + i = (i + 1) % len == 0 ? len : (i + 1) % len; + if(i == cur) { + break; // ֻص˱㣬˵ûҵʵĿп + } + continue; + } + + // ҵʵĿп + found = 1; + break; + } + + // ûҵʵĿп + if(found == 0) { + return NULL; + } + + // ݲΧڣ + if(record->size - e <= n) { + record->tag = 1; // תΪռ״̬ + + // Ҫֿп + } else { + // ½һм¼ + newRecord = (Record*) malloc(sizeof(Record)); + newRecord->addr = record->addr + n; + newRecord->size = record->size - n; + newRecord->tag = 0; + newRecord->pre = -1; + newRecord->next = -1; + newRecord->oldAddr = -1; + + // µĿм¼ + ListInsert(&(space->recordList), len + 1, newRecord); + len += 1; // һ + + // ǰĿм¼תΪʹü¼ + record->size = n; + record->tag = 1; + } + + // һַ + ptr = (int*) malloc(sizeof(int)); + ListInsert(&(space->ptrList), ListLength(space->ptrList)+1, ptr); + *ptr = record->addr; + + // αcurָһм¼ + while(1) { + // ȡǰڴʹϢ + GetElem(space->recordList, i, (ElemType*) &record); + + // ռÿ + if(record->tag == 1) { + // ǰһ¼עѭ + i = (i + 1) % len == 0 ? len : (i + 1) % len; + if(i == cur) { + break; // ֻص˱㣬˵ûҵʵĿп + } + continue; + } + + // 洢һÿпλ(ûҵ洢) + space->cur = i; + + break; + } + + return ptr; // ؿڴַ +} + +// ͷַpڴ +void FreeMemory(Space* space, int* p) { + int i, len; + Record* record; + + // ȡǰڴ¼ij + len = ListLength(space->recordList); + + // ڴ¼Ҵͷڴڵļ¼ + for(i = 1; i <= len; i++) { + // ȡǰڴʹϢ + GetElem(space->recordList, i, (ElemType*) &record); + + // ƥļ¼ + if(*p != record->addr) { + continue; + } + + // ü¼ǿУֱӷ + if(record->tag == 0) { + return; + } + + // ʹü¼Ϊ + record->tag = 0; + + // αָոջյڴ + space->cur = i; + + // õַӦڴ洦Ĩ(Ǹѡ) + memset(getPtr(*space, p), 0, record->size*BYTE); + + // Ҹַڵַеλ + for(i = 0; i < space->ptrList.length; i++) { + if(space->ptrList.elem[i] == p) { + break; + } + } + + // ɾַݸǰݣ + memmove(&(space->ptrList.elem[i]), &(space->ptrList.elem[i + 1]), (space->ptrList.length - i - 1) * sizeof(void*)); + + space->ptrList.length -= 1; + + return; + } + +} + +// ַaddrתΪײʵַ +void* getPtr(Space space, const int* addr) { + if(addr == NULL) { + return NULL; + } else { + if(*addr < 0 || *addr > MAXSIZE) { + return NULL; + } + + return space.base + (*addr * BYTE); + } +} + +// ӡڴ沼֣ʾʽΪ׵ַ С ־ | ǰ | +void PrintMemoryLayout(Space space) { + Record* record; + int i, len; + char* data; + + len = ListLength(space.recordList); + + for(i = 0; i < len; i++) { + record = static_cast(space.recordList.elem[i]); + + printf("%2d ", record->addr); + printf("%2d ", record->size); + printf("%1d ", record->tag); + + // ǰͺϢ + printf(" | "); + + if(record->tag == 0) { + printf(" \n"); + continue; + } + + if(record->pre == -1) { + printf(" "); + } else { + printf("%2d ", record->pre); + } + + if(record->next == -1) { + printf(" "); + } else { + printf("%2d ", record->next); + } + + // ڴеݣֻһֽд洢ݣֻڲ + printf(" "); + + data = (char*)calloc(1, sizeof(char)); + memmove(data, getPtr(space, &(record->addr)), 1); + printf("%d", *data); + + printf("\n"); + } + + printf("\n"); +} + diff --git a/Dev-C++/ExerciseBook/08.16/MemoryManager.h b/Dev-C++/ExerciseBook/08.16/MemoryManager.h new file mode 100644 index 0000000..8d8a8f1 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.16/MemoryManager.h @@ -0,0 +1,64 @@ +/*======================= + * 洢ϰ8.16 + ========================*/ + +#ifndef MEMORYMANAGER_H +#define MEMORYMANAGER_H + +#include +#include +#include +#include "SqList.h" + + +#define MAXSIZE 100 // ڴ +#define e 0 // ݲ + +#define BYTE sizeof(char) // 1ֽ + + +// ڴ¼Ͷ +typedef struct { + int addr; // µַ򣬴洢ڴĵǰµַʼֵǿռ׵ַ + int size; // С + int tag; // ־ָʾڴʹ(1)ǿ״̬(0) + + /* 洢֮ӹϵûַ㿴ӹϵܲһ */ + int pre; // ǰ + int next; // + + int oldAddr; // д洢ľɵַ +} Record; + +// ÿռͶ +typedef struct { + void* base; // ڴʼַ + SqList recordList; // ڴʹü¼ + int cur; // ¼пڴ¼λãֵΪ1 + + /* + * ¼ַ + * ʵģϵͳΪ + * ûʹõĵַӲʵʵַܲһ£Ҫϵͳһַ + */ + SqList ptrList; +} Space; + + +// ʼһƬõĴ洢 +void InitSpace(Space* space); + +// СΪnڴ棬ָڴַ +int* AllocMemory(Space* space, int n); + +// ͷַpڴ +void FreeMemory(Space* space, int* p); + +// ַaddrתΪײʵַ +void* getPtr(Space space, const int* addr); + +// ӡڴ沼֣ʾʽΪ׵ַ С ־ | ǰ | +void PrintMemoryLayout(Space space); + +#endif + diff --git a/Dev-C++/ExerciseBook/08.16/SqList.cpp b/Dev-C++/ExerciseBook/08.16/SqList.cpp new file mode 100644 index 0000000..8512ea4 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.16/SqList.cpp @@ -0,0 +1,174 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.6 + =============================*/ + +#include "SqList.h" + +/* + * 㷨2.3 + * + * ʼ + * + * ʼɹ򷵻OK򷵻ERROR + */ +Status InitList(SqList* L) { + // ָڴ棬ʧܣ򷵻NULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // 洢ڴʧ + exit(OVERFLOW); + } + + (*L).length = 0; // ʼ˳Ϊ0 + (*L).listsize = LIST_INIT_SIZE; // ˳ʼڴ + + return OK; // ʼɹ +} + +/* + * + * + * ˳ЧԪص + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * ȡ˳еiԪأ洢eС + * ҵOK򣬷ERROR + * + *ע + * ̲iĺԪλã1ʼⲻϱͨԼ + * ͨiĺӦָ0ʼ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ΪiĺλãϷΧǣ[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iֵϷ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * 㷨2.4 + * + * + * + * ˳iλϲeɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iֵԽ + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // 洢ռ¿ռ + if((*L).length >= (*L).listsize) { + // пռ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // 洢ڴʧ + exit(OVERFLOW); + } + + // »ַ + (*L).elem = newbase; + // Ĵ洢ռ + (*L).listsize += LISTINCREMENT; + } + + // qΪλ + q = &(*L).elem[i - 1]; + + // 1.Ԫأڳλ + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.e + *q = e; + + // 3.1 + (*L).length++; + + return OK; +} + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e) { + ElemType* p, * q; + + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iֵԽ + if(i < 1 || i > (*L).length) { + return ERROR; + } + + // pΪɾԪصλ + p = &(*L).elem[i - 1]; + + // 1.ȡɾԪ + *e = *p; + + // βԪλ + q = (*L).elem + (*L).length - 1; + + // 2.ԪأɾԪصλϻԪؽ + for(++p; p <= q; ++p) { + *(p - 1) = *p; + } + + // 3.1 + (*L).length--; + + return OK; +} + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void(Visit)(ElemType)) { + int i; + + for(i = 0; i < L.length; i++) { + Visit(L.elem[i]); + } + + printf("\n"); +} + diff --git a/Dev-C++/ExerciseBook/08.16/SqList.h b/Dev-C++/ExerciseBook/08.16/SqList.h new file mode 100644 index 0000000..5907937 --- /dev/null +++ b/Dev-C++/ExerciseBook/08.16/SqList.h @@ -0,0 +1,95 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define LIST_INIT_SIZE 100 // ˳洢ռijʼ +#define LISTINCREMENT 10 // ˳洢ռķ + + +/* ˳ԪͶ */ +typedef void* ElemType; + +/* + * ˳ṹ + * + * עelemʹǰҪΪڴ棬Ԫشelem[0]ʼ洢 + */ +typedef struct { + ElemType* elem; // ˳洢ռĻַָ˳ռڴʼλã + int length; // ǰ˳ȣԪأ + int listsize; // ǰĴ洢Դ洢Ԫأ +} SqList; + + +/* + * 㷨2.3 + * + * ʼ + * + * ʼɹ򷵻OK򷵻ERROR + */ +Status InitList(SqList* L); + +/* + * + * + * ˳ЧԪص + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * ȡ˳еiԪأ洢eС + * ҵOK򣬷ERROR + * + *ע + * ̲iĺԪλã1ʼⲻϱͨԼ + * ͨiĺӦָ0ʼ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * 㷨2.4 + * + * + * + * ˳iλϲeɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListInsert(SqList* L, int i, ElemType e); + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e); + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void (Visit)(ElemType)); + +#endif + diff --git a/Dev-C++/ExerciseBook/08.16/TestData_8_10.md b/Dev-C++/ExerciseBook/08.16/TestData_8_10.md new file mode 100644 index 0000000..03de72f --- /dev/null +++ b/Dev-C++/ExerciseBook/08.16/TestData_8_10.md @@ -0,0 +1,17 @@ +| ׵ַ | С | ־ | ǰָ | ָ | +| :----: | :----: | :----: | :----: | :----: | +| 0 | 5 | 1 | -1 | 10 | +| 5 | 5 | 0 | -1 | -1 | +| 10 | 5 | 1 | 15 | 40 | +| 15 | 10 | 1 | -1 | -1 | +| 25 | 5 | 0 | -1 | -1 | +| 30 | 10 | 0 | -1 | -1 | +| 40 | 5 | 1 | 45 | 65 | +| 45 | 10 | 1 | -1 | -1 | +| 55 | 5 | 0 | -1 | -1 | +| 60 | 5 | 0 | -1 | -1 | +| 65 | 5 | 1 | 85 | -1 | +| 70 | 5 | 0 | -1 | -1 | +| 75 | 10 | 0 | -1 | -1 | +| 85 | 5 | 1 | 90 | -1 | +| 90 | 10 | 1 | -1 | -1 | diff --git a/Dev-C++/ExerciseBook/08.16/习题8.10测试数据.png b/Dev-C++/ExerciseBook/08.16/习题8.10测试数据.png new file mode 100644 index 0000000000000000000000000000000000000000..a40b4546dfaa0d2354def20df328c29b17c8ef7a GIT binary patch literal 56307 zcmd43XH-*N7cPpZpi~hFQUp-}h0vRHQHoL(1wwDq0|*GABhn2;KzftjOXxiUhTcJ1 zfY5ty0YZ`+-|zj-9p{X3@A-Ge$w)?aS$)s>%sJP3)((5Cu0%=3NJd0NMET~mye1LR z^#md!;)q+sge#H*w=jgiYc85fFNw+qnKub1H>~8;g=+Ca@2#o0p$9lp0x6$8`A+5k zVk6B&A~Sg2t8Nn^O#h1{K)~eNW{bI}h(kSk-YfPGTu4Z1^tD5!t0K!HstV68p_DCz zcd^Xz`0V|pX7qZxa!V@(8+>?l`TG6L{t+FkM|VPlUunI_5FsLJAcp4t-ZIfB}H zdJ{2y7Vr9;G=J+xR@*SWL6!y+(H8@Mgr*7Xhyn!EH-X&>jJpQC`2zRL>{$iKg9I4Q zQvtfs-uneX{Ls$?b`Mk{bsf+L00D_jEq<9@`z~7nA_HotUxQkZ0|EXOf+jGcZdMTR zCV+eB3!?HS0Qv&NPyr%Zp$5ilh9F4p)!62ibI#Pue;;^cP}I*YlqRnrQ)KYSR(MeG zk-^OOmU}nv+XntfB@Smg5K+I~nWb=mWMUaSof*Fu5!x@B^H@EJ*Pg+Jp%#l=D*F7p&j;8AZ}d^q(dj-4v` z8p<8yqrQO-L<{*Xv~;Qru*gCGm9vkWt&}c-O&cAuMhjrihp6qDqZOpUIMe7SH(bRT zTV;P$=ABxxzMT0AUoTUz9cuLGPRi*!<_W5%Ka`9eGm+yS27w=E(pDVEyY%V@fd39d z?x72;xg`v!{Z?RbF;Mv!nRVy$+t9|En600=II=hq78SZN&||QrWeCkR1rkb;>W4Fm zVAwVFD?@w1$MV!-ND)7JxNaO2Y681zd2(%};(q(A*+9xFlRsjHQWT&c1sV^%ER7W7 z3D8Xr3L7r%mT5|THtQbNCEw^6asVi zq*xuuuJQeKq~3cGYBm@(MgcS)Te0J7IBK(7p+EQY*_Nz;D%(j`ZC>EV^OHc+5~LYV zBn<;)#gu+*p5ETq}|9DRk-#Q(Rfg2_rzS3 zXD+Y%whL@P^#K6+Mdi@<;VrdS2YM#MP|wAd9Dkmh5ZK#0G2w64o_?iBs_B%i<%O

Wm|&x~Y+ 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 VD+@O7fy4+Rd0FL0S<=tm{C|&J3V{Fs literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.c b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.c new file mode 100644 index 0000000..74be991 --- /dev/null +++ b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.c @@ -0,0 +1,126 @@ +#include +#include "Status.h" +#include "SqStack.h" + +/* 궨 */ +#define MAXSIZE 200 // ڴܴС + + +/* пռͶ */ +typedef struct { + void* base; // ÿռڴʼַ + int size; // пռС(ֽڼ) + SqStack block; // ѾʹõڴСڴϢջ +} Space; + + +// ʼڴռ估ڴϢջ +void InitSpace(Space* space); + +// ӡڴ沼֣鿴ǰڴʹ +void PrintMemoryLayout(Space space); + +// СΪnڴ飬뵽ڴʼַ +void* Algo_8_11(Space* space, int n); + +// ڴ棬ѭ"ͷ"ԭ +Status Algo_8_12(Space* space); + + +int main(int argc, char* argv[]) { + Space space; + int s[5] = {50, 50, 150, 100, 50}; // ڴ + int i; + + // ʼڴ + InitSpace(&space); + PrintMemoryLayout(space); + printf("\n"); + + // /ͷڴ + for(i = 0; i < 5; i++) { + printf(" %d ڴ...\n", s[i]); + Algo_8_11(&space, s[i]); + PrintMemoryLayout(space); + printf("\n"); + } + + return 0; +} + + +// ʼһпռ +void InitSpace(Space* space) { + // MAXֽڵĿռ(ܳʼɹ) + space->base = malloc(MAXSIZE); + space->size = MAXSIZE; + + // ʼڴϢջ + InitStack(&(space->block)); +} + +// ӡڴ沼֣鿴ǰڴʹ +void PrintMemoryLayout(Space space) { + int i; + + for(i = 1; i <= MAXSIZE; i++) { + if(i <= space.size) { + printf(""); + } else { + printf(""); + } + + // Ԥÿ20һ + if(i % 20 == 0) { + printf("\n"); + } + } + + if(MAXSIZE % 20 != 0) { + printf("\n"); + } +} + +// СΪnڴ飬뵽ڴʼַ +void* Algo_8_11(Space* space, int n) { + + /* + * õڴڴ + * Ҫͷʹõڴڳռ䡣 + */ + while(space->size < n && Algo_8_12(space) == OK) { + // ֱڴҪ󣬻ȫռڴѾͷţŻ˳ѭ + } + + // û㹻ڴã򷵻ؿָ + if(space->size < n) { + return NULL; + } + + // ÿռС + space->size -= n; + + // ³ɹ뵽ڴ + Push(&(space->block), n); + + // 뵽ڴʼַ(VSҪָָͣ趨Ϊһֽ) + return (char*)(space->base) + space->size; +} + +// ڴ棬ѭ"ͷ"ԭ +Status Algo_8_12(Space* space) { + int e; + + // ѾûпͷڴʱERROR + if(StackEmpty(space->block)) { + return ERROR; + } + + // ڴͷŵ + Pop(&(space->block), &e); + + // ÿռ + space->size += e; + + return OK; +} diff --git a/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj new file mode 100644 index 0000000..769135a --- /dev/null +++ b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {92D19D62-5A91-436F-BCAC-672018B7B67B} + My08110812 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.filters b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.filters new file mode 100644 index 0000000..9b26938 --- /dev/null +++ b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.user b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/08.11-08.12/08.11-08.12.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.11-08.12/SqStack.c b/VisualC++/ExerciseBook/08.11-08.12/SqStack.c new file mode 100644 index 0000000..f056778 --- /dev/null +++ b/VisualC++/ExerciseBook/08.11-08.12/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#include "SqStack.h" //**03 ջͶ**// + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * п + * + * ж˳ջǷЧݡ + * + * ֵ + * TRUE : ˳ջΪ + * FALSE: ˳ջΪ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // ջʱ׷Ӵ洢ռ + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 洢ʧ + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ջȸֵջָ + *(S->top++) = e; + + return OK; +} + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ջջָȵݼٸֵ + *e = *(--(*S).top); + + return OK; +} diff --git a/VisualC++/ExerciseBook/08.11-08.12/SqStack.h b/VisualC++/ExerciseBook/08.11-08.12/SqStack.h new file mode 100644 index 0000000..a8fe835 --- /dev/null +++ b/VisualC++/ExerciseBook/08.11-08.12/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define STACK_INIT_SIZE 100 // ˳ջ洢ռijʼ +#define STACKINCREMENT 10 // ˳ջ洢ռķ + +/* ˳ջԪͶ */ +typedef int SElemType; + +// ˳ջԪؽṹ +typedef struct { + SElemType* base; // ջָ + SElemType* top; // ջָ + int stacksize; // ǰѷĴ洢ռ䣬ԪΪλ +} SqStack; + + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S); + +/* + * п + * + * ж˳ջǷЧݡ + * + * ֵ + * TRUE : ˳ջΪ + * FALSE: ˳ջΪ + */ +Status StackEmpty(SqStack S); + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/08.13/08.13.c b/VisualC++/ExerciseBook/08.13/08.13.c new file mode 100644 index 0000000..00dae24 --- /dev/null +++ b/VisualC++/ExerciseBook/08.13/08.13.c @@ -0,0 +1,65 @@ +#include +#include "BoundaryTagMethod.h" //**08 ̬洢**// + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ + */ +void Algo_8_13(Space* pav, Space p); + + +int main(int argc, char* argv[]) { + Space pav; + Space p[12]; // ¼뵽ڴָ + int s[12] = {10, 20, 30, 50, 5, 15, 10, 5, 15, 15, 2, 20}; // ĿռС + int i = 0; + + printf(" InitSpace \n"); + { + int max = 200; // ֵΪ20ıĿǴӡԶ + + printf("ʼ %d \"\"ڴ󣬵ǰڴ沼Ϊ\n", max); + pav = InitSpace(max); + PrintMemoryLayout(); + printf("\n"); + } + PressEnterToContinue(debug); + + printf(" AllocBoundTag \n"); + { + for(i = 0; i < 12; i++) { + printf(" %2d> %d \"\"ڴ󣬵ǰڴ沼Ϊ\n", i + 1, s[i]); + p[i] = AllocBoundTag(&pav, s[i]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + printf(" FreeBoundTag \n"); + { + // һָ˳ + int a[10] = {7, 3, 10, 6, 8, 5, 11, 1, 0, 4}; + + for(i = 0; i < 10; i++) { + printf(" p%d ָڴ...\n", a[i] + 1); + Algo_8_13(&pav, p[a[i]]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ + */ +void Algo_8_13(Space* pav, Space p) { + FreeBoundTag(pav, p); +} diff --git a/VisualC++/ExerciseBook/08.13/08.13.vcxproj b/VisualC++/ExerciseBook/08.13/08.13.vcxproj new file mode 100644 index 0000000..843dedc --- /dev/null +++ b/VisualC++/ExerciseBook/08.13/08.13.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {B8418DCB-E6A4-4C39-97FC-E57B694A4512} + My0813 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.13/08.13.vcxproj.filters b/VisualC++/ExerciseBook/08.13/08.13.vcxproj.filters new file mode 100644 index 0000000..5f24d9b --- /dev/null +++ b/VisualC++/ExerciseBook/08.13/08.13.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.13/08.13.vcxproj.user b/VisualC++/ExerciseBook/08.13/08.13.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/08.13/08.13.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.13/BoundaryTagMethod.c b/VisualC++/ExerciseBook/08.13/BoundaryTagMethod.c new file mode 100644 index 0000000..6d630b4 --- /dev/null +++ b/VisualC++/ExerciseBook/08.13/BoundaryTagMethod.c @@ -0,0 +1,330 @@ +/*============== + * ߽ʶ + * + * 㷨: 8.1 + ===============*/ + +#include "BoundaryTagMethod.h" //**08 ̬洢**// + +/* + * ȫֱԶָʼռͷ + * ñã + * 1.׷ڴ沼֣鿴ڴʹ + * 2.ָʾڴʼͽβ + */ +static Space av; + +// ¼ռ׷ڴ沼 +static int len; + + +/* + * ʼһܴСΪnֵڴ棬ָڴָ + * עصijʼڴѾheadfoot + */ +Space InitSpace(int n) { + Space space, head, foot; + + // ʼڴ + space = (Space) malloc(n * sizeof(WORD)); + if(space == NULL) { + return NULL; + } + + // ʼͷϢ + head = space; + head->llink = space; // ǰָ + head->rlink = space; // ָ + head->size = n; // ռСѾheadfoot + head->tag = 0; // ǿռ + + // ʼײϢ + foot = FootLoc(head); // ʼײָ + foot->uplink = head; // ײӵͷ + foot->tag = 0; // ǿռ + + // ¿ռʼλú + av = space; + len = n; + + return space; +} + +/* + * 㷨8.1 + * + * ߽ʶڴ㷨 + * + * ӿռpavһСΪnĿռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * Ϊʹʣ龡ȷֲÿη֮Ҫѿռָpavǰƶμ̲ġ + * + * ע + * 1.״Ϸһڴͽз + * 2.Ϊ˱ռƬ죬һݲe庬ο̲ + * 3.nֵĿռ䣬ָѾɻĿռ䡣 + * ûҪΪ10ֵĿռ䣬ÿռְheadfootִ洢ռʹϢ + * ʵϷĿռСӦΪ12֣"12"nĺ塣 + * ̲ᵽ"headfootڷʱԲ"Ϊαдķ㡣ʵдʱռDzܺԵġ + * nΪѾռ䣬ûԭʼĿռ䣬 + * ôûкԿռ䣬Чϣ̲αͳһνȫ + */ +Space AllocBoundTag(Space* pav, int n) { + Space p, f; + + /* + * һжϣĿռС3ֱӷء + * Ϊheadfootռ2ֿռ䣬û1ֵĻռΪ3֡ + */ + if(n < 3) { + printf("־ʧܣ\"\"ӦС3\n"); + return NULL; + } + + // ҲСnĿп + for(p = *pav; p && p->size < n && p->rlink != *pav; p = p->rlink) { + } + + // ҲʵĿп飬ؿָ + if(!p || p->size < n) { + return NULL; + } + + /* ˣpָĿп */ + + // fָÿпĵײ + f = FootLoc(p); + + // pavָpĺ̽㣬ָһп + *pav = p->rlink; + + // п˶٣Ҫ䣬<=eʣ + if(p->size - n <= e) { + // Ѿpavָһп飬pavpȣ˵ʱֻһп(עп˫ѭ) + if(*pav == p) { + *pav = NULL; // ʣһпˣôռú󣬿ÿռΪձ + + // ڱɾĽ + } else { + (*pav)->llink = p->llink; // ޸pavǰ + p->llink->rlink = *pav; // ޸pavǰĺ + + /* Уpǰ̲ûиı䣬Ϊ˷㽫Ļղ */ + } + + // ռÿΪռ״̬ + p->tag = f->tag = 1; + + printf("־ɹ %d \"\"ʵʷ %d \"\"пռΪ %d ...\n", n, n + e, AvailableSpace(*pav)); + + // пܴмиռún + } else { + f->tag = 1; // ޸ķĵײ־ʾ䴦ռ״̬ + p->size -= n; // ʣС + + f = FootLoc(p); // ʣµײλ + f->tag = 0; // µײ־Ϊ + f->uplink = p; // µײȻָпͷ + + p = f + 1; // ͷλ + p->tag = 1; // ÷ͷ־Ϊռ + p->size = n; // ÷ + + // ޸ķײ(̲ȱʧ˴˲) + (FootLoc(p))->uplink = p; + + printf("־ɹ벢 %d \"\"пռΪ %d ...\n", n, AvailableSpace(*pav)); + } + + // ط׵ַ + return p; +} + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עе"ͷſ"ָpָڴ + */ +void FreeBoundTag(Space* pav, Space p) { + Space h, f, q; + int Ltag, Rtag; + + if(p == NULL) { + printf("־ʧܣڴָΪաпռΪ %d ...\n", AvailableSpace(*pav)); + return; + } + + Ltag = p == av ? 1 : (p - 1)->tag; // p־رע⣬pλڴʼΪΪռá + Rtag = (p + p->size) == (av + len) ? 1 : (p + p->size)->tag; // p־رע⣬pλڴβΪΪռá + + /* + * 1.ͷſΪռÿ + * + * ʱҪp뵽pavָ֮ǰ(Ȼ뵽֮ҲǿԵ) + */ + if(Ltag == 1 && Rtag == 1) { + printf("־\"ͷſ\"Ϊ %d Ϊռÿ...\n", p->size); + + f = FootLoc(p); + f->uplink = p; + f->tag = 0; + + p->tag = 0; + + // ΪʱֱӽpΪµĶĿп + if((*pav) == NULL) { + *pav = p->llink = p->rlink = p; + + // 򣬽p뵽pav֮ǰ + } else { + q = (*pav)->llink; + p->rlink = *pav; + p->llink = q; + q->rlink = (*pav)->llink = p; + + // ͷŵĽΪ´ηռʱȲҵĽ + *pav = p; + } + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 2.ͷſΪп飬Ϊռÿ + * + * ʱҪϲͷſ + */ + if(Ltag == 0 && Rtag == 1) { + printf("־\"ͷſ\"Ϊ %d Ϊп飬Ϊռÿ...\n", p->size); + + h = (p - 1)->uplink; // ͷ⽫Ϊϲ¿ͷ + h->size += p->size; // + + f = FootLoc(p); // ͷſĵײΪϲ¿ĵײ + f->uplink = h; + f->tag = 0; + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 3.ͷſΪռÿ飬Ϊп + * + * ʱҪϲͷſ + */ + if(Ltag == 1 && Rtag == 0) { + printf("־\"ͷſ\"Ϊ %d Ϊռÿ飬Ϊп...\n", p->size); + + h = p + p->size; // ͷ + + f = FootLoc(h); // ĵײ⽫Ϊϲ¿ĵײ + f->uplink = p; // ͷſͷΪϲ¿ͷ + + p->tag = 0; + p->size += h->size; + + // ͷſͷҪΪͷһ + p->llink = h->llink; + p->rlink = h->rlink; + h->llink->rlink = p; + h->rlink->llink = p; + + // pavָϲĽͷ + *pav = p; + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } + + /* + * 4.ͷſΪп + * + * ʱҪϲͷſ顢 + */ + if(Ltag == 0 && Rtag == 0) { + printf("־\"ͷſ\"Ϊ %d Ϊп...\n", p->size); + + h = (p - 1)->uplink; // ͷ⽫Ϊϲ¿ͷ + q = p + p->size; // ͷ + f = FootLoc(q); // ĵײ⽫Ϊϲ¿ĵײ + + h->size += p->size + q->size; // ϲ¿С + f->uplink = h; // ¿ײϢҲҪ + + // Ƴ + q->rlink->llink = q->llink; + q->llink->rlink = q->rlink; + + printf("־ճɹпռΪ %d ...\n", AvailableSpace(*pav)); + + return; + } +} + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout() { + Space p; + int count; + int i; + + p = av; + count = av->size; + + for(i = 1; i <= count; i++) { + if(p->tag == 0) { + printf(""); + } else { + printf(""); + } + + if(i == count && count < len) { + p = p + p->size; + count += p->size; + printf("|"); + } else { + printf(" "); + } + + // ÿ20һ + if(i % 20 == 0) { + printf("\n"); + } + } + + if(len % 20 != 0) { + printf("\n"); + } +} + +/* + * õĿпռ + * + * עڲʹã־ӡ + */ +static int AvailableSpace(Space pav) { + Space p; + int count; + + if(pav == NULL) { + return 0; + } + + p = pav; + count = 0; + + do { + count += p->size; + p = p->rlink; + } while(p != pav); + + return count; +} diff --git a/VisualC++/ExerciseBook/08.13/BoundaryTagMethod.h b/VisualC++/ExerciseBook/08.13/BoundaryTagMethod.h new file mode 100644 index 0000000..1b9ab51 --- /dev/null +++ b/VisualC++/ExerciseBook/08.13/BoundaryTagMethod.h @@ -0,0 +1,96 @@ +/*============== + * ߽ʶ + * + * 㷨: 8.1 + ===============*/ + +#ifndef BOUNDARYTAGMETHOD_H +#define BOUNDARYTAGMETHOD_H + +#include +#include +#include "Status.h" //**01 **// + +/* 궨 */ +#define e 5 // ռʱõݲ +#define FootLoc(p) p+(p->size)-1 // pָ붨λpָڴĵײ + + +/* + * ڴ""Ͷ + * + * ν""ָռСλֽڡ + * һ""жȡڶ""ṹζġ + */ +typedef struct WORD { + + /* + * ע + * ̲нllinkuplinkװһУ˸оװЩߡ + * һ棬headfootĹʵֻtag壬ôӦsizerlinkҲװ + * һ棬װʡĿռޣֱӰ˴Ŀɶԡ + * ֻǽѧ룬ʵϵͳ룬Կռ俼ΣԭչʾΪҪ + * ⣬̲еαҲûп壬ֱӽвġ + * ȥ˽̲еṹ + * ۲дԲοCFree֧Ĵ롣 + */ + + int tag; // ־0У1ռãͷβ + + struct WORD* llink; // ͷָǰ + struct WORD* rlink; // ͷָ̽ + int size; // ͷ򣬿С + + struct WORD* uplink; // ײָ򱾽ͷ +} WORD; + +typedef WORD* Space; // Spaceָÿռָ + + +/* + * ʼһСΪnֵڴ棬ָڴָ + * עصijʼڴѾheadfoot + */ +Space InitSpace(int n); + +/* + * 㷨8.1 + * + * ߽ʶڴ㷨 + * + * ӿռpavһСΪnĿռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * Ϊʹʣ龡ȷֲÿη֮Ҫѿռָpavǰƶμ̲ġ + * + * ע + * 1.״Ϸһڴͽз + * 2.Ϊ˱ռƬ죬һݲe庬ο̲ + * 3.nֵĿռ䣬ָѾɻĿռ䡣 + * ûҪΪ10ֵĿռ䣬ÿռְheadfootִ洢ռʹϢ + * ʵϷĿռСӦΪ12֣"12"nĺ塣 + * ̲ᵽ"headfootڷʱԲ"Ϊαдķ㡣ʵдʱռDzܺԵġ + * nΪѾռ䣬ûԭʼĿռ䣬 + * ôûкԿռ䣬Чϣ̲αͳһνȫ + */ +Space AllocBoundTag(Space* pav, int n); + +/* + * ߽ʶڴ㷨 + * + * ָpڴͷ + */ +void FreeBoundTag(Space* pav, Space p); + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout(); + +/* + * õĿпռ + * + * עڲʹã־ӡ + */ +static int AvailableSpace(Space pav); + +#endif diff --git a/VisualC++/ExerciseBook/08.14/08.14.c b/VisualC++/ExerciseBook/08.14/08.14.c new file mode 100644 index 0000000..349c0c1 --- /dev/null +++ b/VisualC++/ExerciseBook/08.14/08.14.c @@ -0,0 +1,66 @@ +#include +#include "BuddySystem.h" //**08 ̬洢**// + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void Algo_8_14(FreeList avail, WORD* p); + + +int main(int argc, char* argv[]) { + FreeList avail; + WORD* p[8]; // ¼뵽ڴָ + int s[8] = {4, 5, 6, 7, 1, 5, 3, 9}; // ĿռС + int i; + + printf(" InitSpace \n"); + { + printf("ʼһڴ...\n"); + InitSpace(avail); + PrintMemoryLayout(); + printf("\n"); + } + PressEnterToContinue(debug); + + printf(" AllocBuddy \n"); + { + for(i = 0; i < 8; i++) { + printf("СΪ %d ֵڴ...\n", s[i]); + p[i] = AllocBuddy(avail, s[i]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + printf(" FreeBuddy \n"); + { + // һָ˳ + int a[8] = {2, 0, 5, 7, 1, 4, 3, 6}; + + for(i = 0; i < 8; i++) { + Algo_8_14(avail, p[a[i]]); + PrintMemoryLayout(); + printf("\n"); + } + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void Algo_8_14(FreeList avail, WORD* p) { + FreeBuddy(avail, p); +} diff --git a/VisualC++/ExerciseBook/08.14/08.14.vcxproj b/VisualC++/ExerciseBook/08.14/08.14.vcxproj new file mode 100644 index 0000000..e567f8a --- /dev/null +++ b/VisualC++/ExerciseBook/08.14/08.14.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {5CA72478-69D3-4ECB-A4FC-C4F3B9B9E370} + My0814 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.14/08.14.vcxproj.filters b/VisualC++/ExerciseBook/08.14/08.14.vcxproj.filters new file mode 100644 index 0000000..7dcdbf6 --- /dev/null +++ b/VisualC++/ExerciseBook/08.14/08.14.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.14/08.14.vcxproj.user b/VisualC++/ExerciseBook/08.14/08.14.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/08.14/08.14.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.14/BuddySystem.c b/VisualC++/ExerciseBook/08.14/BuddySystem.c new file mode 100644 index 0000000..0c96d16 --- /dev/null +++ b/VisualC++/ExerciseBook/08.14/BuddySystem.c @@ -0,0 +1,283 @@ +/*============== + * ϵͳ + * + * 㷨: 8.2 + ===============*/ + +#include "BuddySystem.h" + +// ¼ڴʼַڼʱҪõ +WORD* start; + + +/* + * ʼһСΪ2^Mֵڴ棬ָڴָ + * עصijʼڴѾhead + */ +void InitSpace(FreeList avail) { + int k; + WORD* r; + + // M+1Ԫ + for(k = 0; k <= M; k++) { + avail[k].nodesize = (int) pow(2, k); + avail[k].first = NULL; + } + + r = (WORD*) malloc((int) pow(2, M) * sizeof(WORD)); + if(r == NULL) { + exit(OVERFLOW); + } + + // ͷϢ + r->llink = r->rlink = r; + r->tag = 0; + r->kval = M; + + avail[M].first = r; + + start = r; +} + +/* + * 㷨8.2 + * + * ϵͳڴ㷨 + * + * ӿռavailһСΪn(ԭʼֵ)Ŀռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * + * ע + * 1.״Ϸһڴͽз + * 2.nֵĿռ䣬ָûԭʼռ䡣 + * ʵʱҪǵÿǰ1ֵheadϢʵҪ(n+1)֡ + * n㷨8.1n෴Ҫע⡣ + */ +WORD* AllocBuddy(FreeList avail, int n) { + int k, i; + WORD* pa, * pre, * suc, * pi; + + /* + * һжϣĿռС1ֱӷء + */ + if(n < 1) { + printf("־ʧܣ\"\"ӦС1\n"); + return NULL; + } + + // ҲСnĿп + for(k = 0; k <= M && (avail[k].nodesize < n + 1 || !avail[k].first); k++) { + } + + // ҲʵĿп飬ؿָ + if(k > M) { + printf("־ʧܣû㹻Ŀп\n"); + return NULL; + } + + 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; + } + + /* + * k-1ʼFreeList飬ʣĿп顣 + * ʣĿпǶʣÿռIJ֡ + * + * õһʽ2^m-2^n = 2^n+2^(n+1)+...+2^(m-1) + * ʼΪ2^16ʱܹ1500֣ôҪһ2^11Ŀп + * ֮ʣΪ2^16-2^11 = 2^11+2^12+2^13+2^14+2^15 + * ЩʣԲΪ5п飬ֱ洢1514131211 + */ + for(i = 1; k - i >= 0 && avail[k - i].nodesize >= n + 1; i++) { + pi = pa + (int) pow(2, k - i); // ÿνpiָʣռĺһ + pi->rlink = pi->llink = pi; // ʼpiǰͺ + pi->tag = 0; // Ϊп + pi->kval = k - i; // øÿ־ʵΪ2^(k-i) + avail[k - i].first = pi; + + /* + * ע + * ֽpiֱӵavailУûпͬλô᲻бͬĿп顣 + * ﲻҪǵԭͬλôѾڱͬĿп飬 + * ôҪֽʣռ䣬仰˵ѭ + * ֻҪѭ˵ĿλôѾΪˣûҵʵĿп飬Žһα괦Ѱҿп顣 + */ + } + + // ʣµǰĿռҪĿռ(ûpaǰͺ̣ΪûҪ) + pa->tag = 1; + pa->kval = k - (--i); + + printf("־ɹû %d ֣ϵͳ %d ֣ʵʷ %d \n", n, n + 1, (int) pow(2, pa->kval)); + + return pa; +} + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void FreeBuddy(FreeList avail, WORD* p) { + int k; + WORD* r; + WORD* buddy = Buddy(p); + + if(p == NULL) { + return; + } + + /* + * ォp򵥵ز뵽availУΣ + * 1.ǿ + * 2.УǻĴСpĴСһ£˵黹ûƴϺ + * 3.pƴӳһĿп + */ + if(buddy->tag == 1 || buddy->kval != p->kval || p->kval == M) { + for(k = 0; k <= M && k < p->kval; k++) { + // pӦIJ + } + + // ҵۣͷ巨п뵽Ŀ + if(k <= M && k == p->kval) { + p->tag = 0; + + if(avail[k].first == NULL) { + p->llink = p->rlink = p; + } else { + p->llink = avail[k].first->llink; + p->rlink = avail[k].first; + p->llink->rlink = p; + p->rlink->llink = p; + } + + avail[k].first = p; + + printf("־ճɹ[%d, (2^%d)] %d Ŀп\n", (int) (p - start), k, k); + } + + // ǿеģʱӦкϲ + } else { + for(k = 0; k <= M && k < p->kval; k++) { + // һڵIJ + } + + // ҵۣӿпժ + if(k <= M && k == p->kval) { + // һλ + if(avail[k].first == buddy) { + buddy->rlink->llink = buddy->llink; + buddy->llink->rlink = buddy->rlink; + + avail[k].first = buddy->rlink; + + // мλ + } else { + for(r = avail[k].first; r->rlink != buddy; r = r->rlink) { + // һ飬rָǰ + } + + r->rlink = buddy->rlink; + buddy->rlink->llink = r; + } + + printf("־ϲɹ[%d, (2^%d)][%d, (2^%d)]ϲ", (int) (p - start), k, (int) (buddy - start), k); + + // ϲ֮ǰҪȷĸ鿿ǰ + if(p < buddy) { + p->tag = 0; + } else { + p = buddy; + } + + p->kval = k + 1; // ָһ󣬼ɺϲ + + printf("[%d, (2^%d)]\n", (int) (p - start), k + 1); + + // µĿп֮Ҫݹ飬鿴ÿпǷҲڿл + FreeBuddy(avail, p); + } + } +} + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout() { + int i, count, total; + WORD* p; + + printf("|"); + + p = start; + count = (int) pow(2, p->kval); + + for(i = 1; i <= count; i++) { + if(p->tag == 0) { + printf("_"); + } else { + printf("*"); + } + + // 뵽һ + if(i == count && count < (int) pow(2, M)) { + p = start + count; + count += (int) pow(2, p->kval); + printf("|"); + } + } + + printf("|\n"); +} + +/* + * ҿpĻ + * + * һп԰Ѻ󣬻ɵСп飬Сп黥Ϊ顣 + * + * 㷨Ϊ + * ʼַΪpСΪ2^kڴ飺 + * 1. p MOD 2^(k+1) == 0 ,pĻʼַΪp+2^k + * 2. p MOD 2^(k+1) == 2^k ,pĻʼַΪp-2^k + * + * עڲʹãڻ㷨 + */ +static WORD* Buddy(WORD* p) { + long s, m, n; + + if(p == NULL) { + return NULL; + } + + // startпľʼַspڻϵͳеľԵַ0ʼ + s = p - start; + if(s < 0) { + return NULL; + } + + m = (long) pow(2, p->kval); + n = (long) pow(2, p->kval + 1); + + if(s % n == 0) { + return p + m; + } + + if(s % n == m) { + return p - m; + } + + return NULL; +} diff --git a/VisualC++/ExerciseBook/08.14/BuddySystem.h b/VisualC++/ExerciseBook/08.14/BuddySystem.h new file mode 100644 index 0000000..77daabe --- /dev/null +++ b/VisualC++/ExerciseBook/08.14/BuddySystem.h @@ -0,0 +1,89 @@ +/*============== + * ϵͳ + * + * 㷨: 8.2 + ===============*/ + +#ifndef BUDDYSYSTEM_H +#define BUDDYSYSTEM_H + +#include +#include +#include +#include "Status.h" //**01 **// + +/* 궨 */ +#define M 6 // ܿռСΪ2^M֣ӱΪM+1 + + +/* + * ڴ""Ͷ + * + * ν""ָռСλֽڡ + * һ""жȡڶ""ṹζġ + */ +typedef struct WORD { + struct WORD* llink; // ͷǰָ + struct WORD* rlink; // ͷĺָ + int tag; // ͷĿ־0:У1:ռ + int kval; // ָʾĴСֵΪKʱʾÿĴСΪ2^K +} WORD; + +// ͷ +typedef struct HeadNode { + int nodesize; // ĿпĴС + WORD* first; // ıͷָ +} FreeList[M + 1]; + + +/* + * ʼһСΪ2^Mֵڴ棬ָڴָ + * עصijʼڴѾhead + */ +void InitSpace(FreeList avail); + +/* + * 㷨8.2 + * + * ϵͳڴ㷨 + * + * ӿռavailһСΪn(ԭʼֵ)Ŀռ䣬ָ뵽Ŀռָ롣ʧܣ򷵻NULL + * + * ע + * 1.״Ϸһڴͽз + * 2.nֵĿռ䣬ָûԭʼռ䡣 + * ʵʱҪǵÿǰ1ֵheadϢʵҪ(n+1)֡ + * n㷨8.1n෴Ҫע⡣ + */ +WORD* AllocBuddy(FreeList avail, int n); + +/* + * ϵͳڴ㷨 + * + * ָpڴͷ(free()ֻǶڴͷŲÿָpIJӦ÷) + * + * עû֤pȡֵ÷ӦȷpںϹķΧ + */ +void FreeBuddy(FreeList avail, WORD* p); + +/* + * ӡڴ沼֣鿴ǰڴʹ + * עڲʹ + */ +void PrintMemoryLayout(); + +/* + * ҿpĻ + * + * һп԰Ѻ󣬻ɵСп飬Сп黥Ϊ顣 + * + * 㷨Ϊ + * ʼַΪpСΪ2^kڴ飺 + * 1. p MOD 2^(k+1) == 0 ,pĻʼַΪp+2^k + * 2. p MOD 2^(k+1) == 2^k ,pĻʼַΪp-2^k + * + * עڲʹãڻ㷨 + */ +static WORD* Buddy(WORD* p); + +#endif diff --git a/VisualC++/ExerciseBook/08.15/08.15.c b/VisualC++/ExerciseBook/08.15/08.15.c new file mode 100644 index 0000000..eea8fff --- /dev/null +++ b/VisualC++/ExerciseBook/08.15/08.15.c @@ -0,0 +1,85 @@ +#include +#include "MemoryManager.h" + +/* + * ڴ + * + * пռӳһп + */ +void Algo_8_15(Space* space); + + +int main(int argc, char** argv) { + Space space; + int i; + int a[11] = {10, 20, 30, 15, 20, 5, -1, -3, 0, 15, 10}; + WORD* p[11]; + + InitSpace(&space); + printf("ʼڴ沼֣\n"); + PrintMemoryLayout(space); + + /* + * ע + * a[4]ʱʣ25""ǰݲ5˱λֱӷ20+5=25"" + * a[5]ʱѾûпõ֣ʧ + * a[10]ʱݲΧڣ + */ + for(i = 0; i < 11; i++) { + if(a[i] > 0) { + printf("+ %d ֵĴ洢\n", a[i]); + p[i] = AllocMemory(&space, a[i]); + } else { + printf("- ͷ %d ֵĴ洢\n", a[-a[i]]); + FreeMemory(&space, p[-a[i]]); + } + + PrintMemoryLayout(space); + + if(i == 8) { + printf("ڴ...\n"); + Algo_8_15(&space); + PrintMemoryLayout(space); + } + } +} + + +/* + * ڴ + * + * пռӳһп + */ +void Algo_8_15(Space* space) { + WORD* p, * q; + + space->avail = NULL; + + q = NULL; + + // + for(p = space->lowbound; p < space->highbound; p += p->cellsize) { + if(p->tag == 1) { + continue; + } + + // ȰѺÿ + p->next = NULL; + + // ˵һп + if(space->avail == NULL) { + space->avail = p; + q = p; + continue; + } + + // пַڣ + if(q + q->cellsize != p) { + q->next = p; + + // ڵַڵĿп飬Ҫϲ + } else { + q->cellsize += p->cellsize; + } + } +} diff --git a/VisualC++/ExerciseBook/08.15/08.15.vcxproj b/VisualC++/ExerciseBook/08.15/08.15.vcxproj new file mode 100644 index 0000000..c1f7d9b --- /dev/null +++ b/VisualC++/ExerciseBook/08.15/08.15.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {597EDEF1-E7A2-4CCB-A036-13D81A98F053} + My0815 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.15/08.15.vcxproj.filters b/VisualC++/ExerciseBook/08.15/08.15.vcxproj.filters new file mode 100644 index 0000000..86709c6 --- /dev/null +++ b/VisualC++/ExerciseBook/08.15/08.15.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.15/08.15.vcxproj.user b/VisualC++/ExerciseBook/08.15/08.15.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/08.15/08.15.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.15/MemoryManager.c b/VisualC++/ExerciseBook/08.15/MemoryManager.c new file mode 100644 index 0000000..55b01d3 --- /dev/null +++ b/VisualC++/ExerciseBook/08.15/MemoryManager.c @@ -0,0 +1,131 @@ +/*======================= + * 洢ϰ8.15 + ========================*/ + +#include "MemoryManager.h" + +// ʼһƬõĴ洢 +void InitSpace(Space* space) { + space->avail = (WORD*) malloc(MAXSIZE * sizeof(WORD)); + space->avail->tag = 0; + space->avail->cellsize = MAXSIZE; + space->avail->next = NULL; + + space->lowbound = space->avail; + space->highbound = space->avail + MAXSIZE; +} + +// СΪnڴ棬ָڴַ +WORD* AllocMemory(Space* space, int n) { + WORD* p, * q; + + if(space->avail == NULL) { + return NULL; + } + + p = space->avail; + q = NULL; + + // һп鲻 + if(p->cellsize < n) { + // Ŀڴ + while(p != NULL && p->cellsize < n) { + q = p; + p = p->next; + } + } + + // ûзĿڴ + if(p == NULL) { + return NULL; + } + + // ݲΧڣ + if(p->cellsize - e <= n) { + if(q == NULL) { + space->avail = p->next; + } else { + q->next = p->next; + } + + // ָп + } else { + + if(q == NULL) { + space->avail += n; + space->avail->tag = 0; + space->avail->cellsize = p->cellsize - n; + space->avail->next = p->next; + } else { + q->next = p + n; + q->next->tag = 0; + q->next->cellsize = p->cellsize - n; + } + + p->cellsize = n; + } + + // Ϊռ + p->tag = 1; + + return p; +} + +// ͷָpڴ +void FreeMemory(Space* space, WORD* p) { + p->tag = 0; // 򵥵رΪУԴ +} + +// ӡڴ沼 +void PrintMemoryLayout(Space space) { + int i, count; + WORD* p; + + // п + for(p = space.lowbound; p < space.highbound; p += p->cellsize) { + if(p->tag == 0) { + p->flag = -1; // ʱΪ""Ŀп + } else { + p->flag = 1; // Ϊռ + } + } + + // п + for(p = space.avail; p != NULL; p = p->next) { + p->flag = 0; // Ϊ""Ŀп + } + + count = 0; + + for(p = space.lowbound; p < space.highbound; p += p->cellsize) { + for(i = 0; i < p->cellsize; i++) { + switch(p->flag) { + case -1: + printf(""); + break; + case 0: + printf(""); + break; + case 1: + printf(""); + break; + default: + printf("ıǣ\n"); + return; + } + + count++; + // ÿ20ֻһ + if(count % 20 == 0) { + printf("\n"); + } + } + + } + + if(count % 20 != 0) { + printf("\n"); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/08.15/MemoryManager.h b/VisualC++/ExerciseBook/08.15/MemoryManager.h new file mode 100644 index 0000000..777fd2d --- /dev/null +++ b/VisualC++/ExerciseBook/08.15/MemoryManager.h @@ -0,0 +1,57 @@ +/*======================= + * 洢ϰ8.15 + ========================*/ + +#include +#include +#include + +#ifndef MEMORYMANAGER_H +#define MEMORYMANAGER_H + + +/* 궨 */ +#define MAXSIZE 100 // ڴ +#define e 5 // ռʱõݲ + + +/* + * ڴ""Ͷ + * + * ν""ָռСλֽڡ + * һ""жȡڶ""ṹζġ + */ +typedef struct WORD { + int tag; // ־0У1ռ + int cellsize; // ǰĴС + struct WORD* next; // ָһп + + + /* + * ʹñǣ0У1ռã-1ȻУDzڿС + * ǽԴӡܣûʵԵô + */ + int flag; +} WORD; + +// ""ռ +typedef struct { + struct WORD* lowbound; // ռ½ + struct WORD* highbound; // ռϽ + struct WORD* avail; // ָÿռ +} Space; + + +// ʼһƬõĴ洢 +void InitSpace(Space* space); + +// СΪnڴ棬ָڴַ +WORD* AllocMemory(Space* space, int n); + +// ͷָpڴ +void FreeMemory(Space* space, WORD* p); + +// ӡڴ沼 +void PrintMemoryLayout(Space space); + +#endif diff --git a/VisualC++/ExerciseBook/08.16/08.16.c b/VisualC++/ExerciseBook/08.16/08.16.c new file mode 100644 index 0000000..47c5662 --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/08.16.c @@ -0,0 +1,442 @@ +#include +#include +#include +#include "MemoryManager.h" + +/* + * 洢㷨 + * + * 㷨ʵֹ洢ϢϢء + * ˴Ľ㷨ǽԼʵֵMemoryManager֮ϵġ + * бĴ洢ô㷨ҲҪ֮ı䡣 + * + * 岽μ̲ġ + */ +void Algo_8_16(Space* space); + +// ڴ¼׵ַڴ¼ʱõıȽ÷ڲʹ +static int qsortCompar(const void* r1, const void* r2); + +// һڴ¼ڴ¼ӵоɵַoldAddr÷ڲʹ +static int search(Space space, int oldAddr); + +// ϰ8.10ݽв +void Test_8_10(Space* space, char* path); + +// ʹԶIJݣﻹԲûı +void TestCustom(Space* space, int* p[]); + + +int main(int argc, char** argv) { + +// printf("=== ʹϰ8.10еIJ ===\n\n"); +// { +// Space space; +// +// // ʼһƬõĴ洢 +// InitSpace(&space); +// printf("ʼڴ沼֣\n"); +// PrintMemoryLayout(space); +// +// // ϰ8.10 +// Test_8_10(&space, "TestData_8_10.md"); +// printf("ϰ8.10еڴ沼֣\n"); +// PrintMemoryLayout(space); +// +// // 洢 +// Algo_8_16(&space); +// printf("д洢ڴ沼֣\n"); +// PrintMemoryLayout(space); +// } + + printf("=== ʹԶIJ ===\n\n"); + { + Space space; + int* p[10]; // û(ַ) + char* data = (char*)malloc(sizeof(char)); + + // ʼһƬõĴ洢 + InitSpace(&space); + printf("ʼڴ沼֣\n"); + PrintMemoryLayout(space); + + // Զ + TestCustom(&space, p); + + // 洢 + Algo_8_16(&space); + printf("д洢ڴ沼֣\n"); + PrintMemoryLayout(space); + + printf("ڴ沼֣֤ûǷѾͬ£\n"); + memmove(data, getPtr(space, p[9]), 1); + printf("p10 = %d\n", *data); + memmove(data, getPtr(space, p[6]), 1); + printf("p7 = %d\n", *data); + memmove(data, getPtr(space, p[7]), 1); + printf("p8 = %d\n", *data); + memmove(data, getPtr(space, p[5]), 1); + printf("p6 = %d\n", *data); + memmove(data, getPtr(space, p[8]), 1); + printf("p9 = %d\n", *data); + } + +} + + +/* + * 洢㷨 + * + * 㷨ʵֹ洢ϢϢء + * ˴Ľ㷨ǽԼʵֵMemoryManager֮ϵġ + * бĴ洢ô㷨ҲҪ֮ı䡣 + * + * 岽μ̲ġ + */ +void Algo_8_16(Space* space) { + Record* r; + int len; + int i, j, k, count; + int busy, free; + int* oldPtr; // ¼ɵַ + + // ǰڴʹü¼ + len = ListLength(space->recordList); + + /* 0. ڴ¼ںڴǨ */ + qsort(space->recordList.elem, len, sizeof(ElemType), qsortCompar); + +// printf("־0. ڴ¼ˣֻ˶׵ַ˳򣩣\n"); +// PrintMemoryLayout(*space); + + + /* 1. ȷ洢󣬸ڴµַ仰˵˲裬һ¾ɵַձ */ + + free = 0; // ͳƿпĴС + busy = 0; // ͳռÿĴСȷռÿµַ + count = 0; // ͳƽڴ + j = 0; + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // Կп飬ҪͳĴС + if(r->tag == 0) { + free += r->size; + continue; + } + + // ͳռÿ + count++; + + // ռռÿ飬ַϢ + r->oldAddr = r->addr; + r->addr = busy; + busy += r->size; + + // µռÿϢеǰ + space->recordList.elem[j++] = r; + } + + // ¼пϢ + if(free != 0) { + // ·ڴ + r = (Record*) malloc(sizeof(Record)); + r->addr = busy; + r->size = free; + r->tag = 0; + r->oldAddr = -1; + + space->recordList.elem[j] = r; + + count++; + + // ָµĿпļ¼ + space->cur = count; + } + + // ڴʹü¼³ + space->recordList.length = count; + +// printf("־1. ¾ɵַձˣֻ\"ռ\"ڴǰƣԼ\"\"ڴĺϲ\n"); +// PrintMemoryLayout(*space); + + + /* 2. ûַԱ֮ı */ + + // û + len = ListLength(space->ptrList); + + for(i = 0; i < len; i++) { + oldPtr = space->ptrList.elem[i]; + + // ȡɵַڴ¼е + k = search(*space, *oldPtr); + + // Ϊµַ + *oldPtr = ((Record*) (space->recordList.elem[k]))->addr; + } + +// printf("־2. ûɣˣû(ַָ)Ѿָȷڴ棬ʾ\n"); +// PrintMemoryLayout(*space); + + + /* 3. ӣǰͺ */ + + len = ListLength(space->recordList); + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // пʱԽѭ + if(r->tag==0) { + break; + } + + if(r->pre != -1) { + k = search(*space, r->pre); + r->pre = ((Record*) (space->recordList.elem[k]))->addr; + } + + if(r->next != -1) { + k = search(*space, r->next); + r->next = ((Record*) (space->recordList.elem[k]))->addr; + } + } + +// printf("־3. ڴ¼еǰͺѾʾ\n"); +// PrintMemoryLayout(*space); + + + /* 4. Ǩû */ + + for(i = 1; i <= len; i++) { + GetElem(space->recordList, i, (ElemType*) &r); + + // Ŀм¼һģм¼ʱͿԽѭ + if(r->tag == 0) { + // õַӦڴ洦Ĩ(Ǹѡ) + memset(getPtr(*space, &(r->addr)), 0, r->size * BYTE); + break; + } + + // ¾ɵַһǨ + if(r->addr == r->oldAddr) { + continue; + } + + // VSҪָָͣ趨Ϊһֽ + memmove((char*)(space->base) + r->addr * BYTE, (char*)(space->base) + r->oldAddr * BYTE, r->size); + } + +// printf("־4. Ǩɣˣʾвûݣ\n"); +// PrintMemoryLayout(*space); + +} + +// ʹԶIJݣﻹԲûı +void TestCustom(Space* space, int* p[]) { + + printf("+ Ϊ p1 10ڴ棬ڴд 1 ...\n"); + p[0] = AllocMemory(space, 10); + memset(getPtr(*space, p[0]), 1, 1); + PrintMemoryLayout(*space); + + printf("+ Ϊ p2 50ڴ棬ڴд 2 ...\n"); + p[1] = AllocMemory(space, 50); + memset(getPtr(*space, p[1]), 2, 1); + PrintMemoryLayout(*space); + + printf("+ Ϊ p3 20ڴ棬ڴд 3 ...\n"); + p[2] = AllocMemory(space, 20); + memset(getPtr(*space, p[2]), 3, 1); + PrintMemoryLayout(*space); + + printf("- ͷ p2 50ڴ...\n"); + FreeMemory(space, p[1]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p4 5ڴ棬ڴд 4 ...\n"); + p[3] = AllocMemory(space, 5); + memset(getPtr(*space, p[3]), 4, 1); + PrintMemoryLayout(*space); + + printf("+ Ϊ p5 10ڴ棬ڴд 5 ...\n"); + p[4] = AllocMemory(space, 10); + memset(getPtr(*space, p[4]), 5, 1); + PrintMemoryLayout(*space); + + printf("- ͷ p4 5ڴ...\n"); + FreeMemory(space, p[3]); + PrintMemoryLayout(*space); + + printf("- ͷ p3 20ڴ...\n"); + FreeMemory(space, p[2]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p6 15ڴ棬ڴд 6 ...\n"); + p[5] = AllocMemory(space, 15); + memset(getPtr(*space, p[5]), 6, 1); + ((Record*)(space->recordList.elem[2]))->pre = 25; + ((Record*)(space->recordList.elem[2]))->next = 0; + PrintMemoryLayout(*space); + + printf("+ Ϊ p7 10ڴ棬ڴд 7 ...\n"); + p[6] = AllocMemory(space, 10); + memset(getPtr(*space, p[6]), 7, 1); + ((Record*)(space->recordList.elem[4]))->pre = 60; + ((Record*)(space->recordList.elem[4]))->next = -1; + PrintMemoryLayout(*space); + + printf("+ Ϊ p8 15ڴ棬ڴд 8 ...\n"); + p[7] = AllocMemory(space, 15); + memset(getPtr(*space, p[7]), 8, 1); + ((Record*)(space->recordList.elem[7]))->pre = -1; + ((Record*)(space->recordList.elem[7]))->next = 15; + PrintMemoryLayout(*space); + + printf("- ͷ p5 10ڴ...\n"); + FreeMemory(space, p[4]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p9 5ڴ棬ڴд 9 ...\n"); + p[8] = AllocMemory(space, 5); + memset(getPtr(*space, p[8]), 9, 1); + ((Record*)(space->recordList.elem[3]))->pre = 15; + ((Record*)(space->recordList.elem[3]))->next = 60; + PrintMemoryLayout(*space); + + printf("- ͷ p1 10ڴ...\n"); + FreeMemory(space, p[0]); + PrintMemoryLayout(*space); + + printf("+ Ϊ p10 5ڴ棬ڴд 10 ...\n"); + p[9] = AllocMemory(space, 5); + memset(getPtr(*space, p[9]), 10, 1); + ((Record*)(space->recordList.elem[0]))->pre = -1; + ((Record*)(space->recordList.elem[0]))->next = -1; + PrintMemoryLayout(*space); + +} + +// ϰ8.10ݽв +void Test_8_10(Space* space, char* path) { + FILE* fp; + + char line[100]; // ȡ + char* p; // ָֽ + + Record* record; + + // ÿжȡ + int addr; + int size; + int tag; + int pre; + int next; + + // ¼ַ + int* free[100]; + int* ptr; + + int count; + int i; + + char data; // ֤ǨƵIJ + + fp = fopen(path, "r"); + + // ûЧݣֱӷؿյ˳ + if(fp == NULL) { + return; + } + + // ڱͷǰ + fgets(line, 100, fp); + fgets(line, 100, fp); + + count = 0; + i = 0; + data = 0; + + // ûеļβһֱȡ + while(fgets(line, 100, fp)!=NULL) { + + // ׵ַ + p = strtok(line, " |\n\r"); + addr = atoi(p); + + // С + p = strtok(NULL, " |\n\r"); + size = atoi(p); + + // ־ + p = strtok(NULL, " |\n\r"); + tag = atoi(p); + + // ǰַ + p = strtok(NULL, " |\n\r"); + pre = atoi(p); + + // ̵ַ + p = strtok(NULL, " |\n\r"); + next = atoi(p); + + // sizeڴ + ptr = AllocMemory(space, size); + + // ȡոմڴ¼ָ룬ǰͺ̵ijʼ + record = space->recordList.elem[i++]; + record->pre = pre; + record->next = next; + + /* + * Ϊոڴ渳ֵΪ˲ԺǨǷɹ + * ע︳ֵʱҪַתΪʵַ + */ + memset(getPtr(*space, ptr), ++data, 1); + + if(tag == 0) { + // õַڴҪͷ + free[count++] = ptr; + } + } + + fclose(fp); + + // ͷڴ + for(i = 0; i < count; i++) { + FreeMemory(space, free[i]); + } +} + +// ڴ¼׵ַڴ¼ʱõıȽ÷ڲʹ +static int qsortCompar(const void* r1, const void* r2) { + Record* record1 = *((Record**) r1); + Record* record2 = *((Record**) r2); + + return record1->addr - record2->addr; +} + +/* + * һڴ¼ڴ¼ӵоɵַoldAddr + * + * עʵܵЧΪ + * ȣұ˳ңЧʲߣ + * ΣһᱻظãЧʵЧ + * õ㷨ʹúѧĹϣ¾ɵַ洢ϣлἫؼӿٶȡ + * + * ÷ڲʹ + */ +static int search(Space space, int oldAddr) { + int k; + + for(k = 0; k < space.recordList.length; k++) { + // ҵƥľɵֵַ + if(oldAddr == ((Record*) (space.recordList.elem[k]))->oldAddr) { + return k; + } + } + + return -1; +} diff --git a/VisualC++/ExerciseBook/08.16/08.16.vcxproj b/VisualC++/ExerciseBook/08.16/08.16.vcxproj new file mode 100644 index 0000000..c89f24d --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/08.16.vcxproj @@ -0,0 +1,81 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {BFA3C1E2-BC09-4DF8-AB69-680C5EE9A7B1} + My0816 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.16/08.16.vcxproj.filters b/VisualC++/ExerciseBook/08.16/08.16.vcxproj.filters new file mode 100644 index 0000000..8ed4525 --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/08.16.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + 源文件 + + + + + 头文件 + + + 头文件 + + + + + 资源文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.16/08.16.vcxproj.user b/VisualC++/ExerciseBook/08.16/08.16.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/08.16.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.16/MemoryManager.c b/VisualC++/ExerciseBook/08.16/MemoryManager.c new file mode 100644 index 0000000..9a378bb --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/MemoryManager.c @@ -0,0 +1,240 @@ +/*======================= + * 洢ϰ8.16 + ========================*/ + +#include "MemoryManager.h" + +// ʼһƬõĴ洢 +void InitSpace(Space* space) { + void* base; // ڴʼַ + Record* record; // һ¼ + + // ʼMAXSIZEֽڵڴ棬 + base = calloc(MAXSIZE, BYTE); + space->base = base; + + // ʼڴʹü¼ + InitList(&(space->recordList)); + + record = (Record*) malloc(sizeof(Record)); + + record->addr = 0; + record->size = MAXSIZE; + record->tag = 0; + record->pre = -1; + record->next = -1; + record->oldAddr = -1; + + // һڴʹü¼() + ListInsert(&(space->recordList), 1, record); + + // һõĿп + space->cur = 1; + + // ʼַ + InitList(&(space->ptrList)); +} + +// СΪnڴ棬ָڴַ +int* AllocMemory(Space* space, int n) { + int found; // ǷҵõĿп + int i, cur, len; + Record* record; + Record* newRecord; + int* ptr; + + // µǰĿп¼λ + i = cur = space->cur; + found = 0; + + // ȡǰڴ¼ij + len = ListLength(space->recordList); + + // ҿõĿڴ + while(1) { + // ȡǰڴʹϢ + GetElem(space->recordList, i, (ElemType*) &record); + + // ռÿ飬ѾĿп + if(record->tag == 1 || record->size < n) { + // ǰһ¼עѭ + i = (i + 1) % len == 0 ? len : (i + 1) % len; + if(i == cur) { + break; // ֻص˱㣬˵ûҵʵĿп + } + continue; + } + + // ҵʵĿп + found = 1; + break; + } + + // ûҵʵĿп + if(found == 0) { + return NULL; + } + + // ݲΧڣ + if(record->size - e <= n) { + record->tag = 1; // תΪռ״̬ + + // Ҫֿп + } else { + // ½һм¼ + newRecord = (Record*) malloc(sizeof(Record)); + newRecord->addr = record->addr + n; + newRecord->size = record->size - n; + newRecord->tag = 0; + newRecord->pre = -1; + newRecord->next = -1; + newRecord->oldAddr = -1; + + // µĿм¼ + ListInsert(&(space->recordList), len + 1, newRecord); + len += 1; // һ + + // ǰĿм¼תΪʹü¼ + record->size = n; + record->tag = 1; + } + + // һַ + ptr = (int*) malloc(sizeof(int)); + ListInsert(&(space->ptrList), ListLength(space->ptrList)+1, ptr); + *ptr = record->addr; + + // αcurָһм¼ + while(1) { + // ȡǰڴʹϢ + GetElem(space->recordList, i, (ElemType*) &record); + + // ռÿ + if(record->tag == 1) { + // ǰһ¼עѭ + i = (i + 1) % len == 0 ? len : (i + 1) % len; + if(i == cur) { + break; // ֻص˱㣬˵ûҵʵĿп + } + continue; + } + + // 洢һÿпλ(ûҵ洢) + space->cur = i; + + break; + } + + return ptr; // ؿڴַ +} + +// ͷַpڴ +void FreeMemory(Space* space, int* p) { + int i, len; + Record* record; + + // ȡǰڴ¼ij + len = ListLength(space->recordList); + + // ڴ¼Ҵͷڴڵļ¼ + for(i = 1; i <= len; i++) { + // ȡǰڴʹϢ + GetElem(space->recordList, i, (ElemType*) &record); + + // ƥļ¼ + if(*p != record->addr) { + continue; + } + + // ü¼ǿУֱӷ + if(record->tag == 0) { + return; + } + + // ʹü¼Ϊ + record->tag = 0; + + // αָոջյڴ + space->cur = i; + + // õַӦڴ洦Ĩ(Ǹѡ) + memset(getPtr(*space, p), 0, record->size*BYTE); + + // Ҹַڵַеλ + for(i = 0; i < space->ptrList.length; i++) { + if(space->ptrList.elem[i] == p) { + break; + } + } + + // ɾַݸǰݣ + memmove(&(space->ptrList.elem[i]), &(space->ptrList.elem[i + 1]), (space->ptrList.length - i - 1) * sizeof(void*)); + + space->ptrList.length -= 1; + + return; + } + +} + +// ַaddrתΪײʵַ +void* getPtr(Space space, const int* addr) { + if(addr == NULL) { + return NULL; + } else { + if(*addr < 0 || *addr > MAXSIZE) { + return NULL; + } + + // VSҪָָͣ趨Ϊһֽ + return (char*)(space.base) + (*addr * BYTE); + } +} + +// ӡڴ沼֣ʾʽΪ׵ַ С ־ | ǰ | +void PrintMemoryLayout(Space space) { + Record* record; + int i, len; + char* data; + + len = ListLength(space.recordList); + + for(i = 0; i < len; i++) { + record = space.recordList.elem[i]; + + printf("%2d ", record->addr); + printf("%2d ", record->size); + printf("%1d ", record->tag); + + // ǰͺϢ + printf(" | "); + + if(record->tag == 0) { + printf(" \n"); + continue; + } + + if(record->pre == -1) { + printf(" "); + } else { + printf("%2d ", record->pre); + } + + if(record->next == -1) { + printf(" "); + } else { + printf("%2d ", record->next); + } + + // ڴеݣֻһֽд洢ݣֻڲ + printf(" "); + + data = (char*)calloc(1, sizeof(char)); + memmove(data, getPtr(space, &(record->addr)), 1); + printf("%d", *data); + + printf("\n"); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/08.16/MemoryManager.h b/VisualC++/ExerciseBook/08.16/MemoryManager.h new file mode 100644 index 0000000..8b90c68 --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/MemoryManager.h @@ -0,0 +1,63 @@ +/*======================= + * 洢ϰ8.16 + ========================*/ + +#ifndef MEMORYMANAGER_H +#define MEMORYMANAGER_H + +#include +#include +#include +#include "SqList.h" + + +#define MAXSIZE 100 // ڴ +#define e 0 // ݲ + +#define BYTE sizeof(char) // 1ֽ + + +// ڴ¼Ͷ +typedef struct { + int addr; // µַ򣬴洢ڴĵǰµַʼֵǿռ׵ַ + int size; // С + int tag; // ־ָʾڴʹ(1)ǿ״̬(0) + + /* 洢֮ӹϵûַ㿴ӹϵܲһ */ + int pre; // ǰ + int next; // + + int oldAddr; // д洢ľɵַ +} Record; + +// ÿռͶ +typedef struct { + void* base; // ڴʼַ + SqList recordList; // ڴʹü¼ + int cur; // ¼пڴ¼λãֵΪ1 + + /* + * ¼ַ + * ʵģϵͳΪ + * ûʹõĵַӲʵʵַܲһ£Ҫϵͳһַ + */ + SqList ptrList; +} Space; + + +// ʼһƬõĴ洢 +void InitSpace(Space* space); + +// СΪnڴ棬ָڴַ +int* AllocMemory(Space* space, int n); + +// ͷַpڴ +void FreeMemory(Space* space, int* p); + +// ַaddrתΪײʵַ +void* getPtr(Space space, const int* addr); + +// ӡڴ沼֣ʾʽΪ׵ַ С ־ | ǰ | +void PrintMemoryLayout(Space space); + +#endif diff --git a/VisualC++/ExerciseBook/08.16/SqList.c b/VisualC++/ExerciseBook/08.16/SqList.c new file mode 100644 index 0000000..3d174af --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/SqList.c @@ -0,0 +1,173 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.6 + =============================*/ + +#include "SqList.h" + +/* + * 㷨2.3 + * + * ʼ + * + * ʼɹ򷵻OK򷵻ERROR + */ +Status InitList(SqList* L) { + // ָڴ棬ʧܣ򷵻NULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // 洢ڴʧ + exit(OVERFLOW); + } + + (*L).length = 0; // ʼ˳Ϊ0 + (*L).listsize = LIST_INIT_SIZE; // ˳ʼڴ + + return OK; // ʼɹ +} + +/* + * + * + * ˳ЧԪص + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * ȡ˳еiԪأ洢eС + * ҵOK򣬷ERROR + * + *ע + * ̲iĺԪλã1ʼⲻϱͨԼ + * ͨiĺӦָ0ʼ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ΪiĺλãϷΧǣ[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iֵϷ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * 㷨2.4 + * + * + * + * ˳iλϲeɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iֵԽ + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // 洢ռ¿ռ + if((*L).length >= (*L).listsize) { + // пռ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // 洢ڴʧ + exit(OVERFLOW); + } + + // »ַ + (*L).elem = newbase; + // Ĵ洢ռ + (*L).listsize += LISTINCREMENT; + } + + // qΪλ + q = &(*L).elem[i - 1]; + + // 1.Ԫأڳλ + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.e + *q = e; + + // 3.1 + (*L).length++; + + return OK; +} + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e) { + ElemType* p, * q; + + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iֵԽ + if(i < 1 || i > (*L).length) { + return ERROR; + } + + // pΪɾԪصλ + p = &(*L).elem[i - 1]; + + // 1.ȡɾԪ + *e = *p; + + // βԪλ + q = (*L).elem + (*L).length - 1; + + // 2.ԪأɾԪصλϻԪؽ + for(++p; p <= q; ++p) { + *(p - 1) = *p; + } + + // 3.1 + (*L).length--; + + return OK; +} + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void(Visit)(ElemType)) { + int i; + + for(i = 0; i < L.length; i++) { + Visit(L.elem[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/08.16/SqList.h b/VisualC++/ExerciseBook/08.16/SqList.h new file mode 100644 index 0000000..2bac885 --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/SqList.h @@ -0,0 +1,94 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define LIST_INIT_SIZE 100 // ˳洢ռijʼ +#define LISTINCREMENT 10 // ˳洢ռķ + + +/* ˳ԪͶ */ +typedef void* ElemType; + +/* + * ˳ṹ + * + * עelemʹǰҪΪڴ棬Ԫشelem[0]ʼ洢 + */ +typedef struct { + ElemType* elem; // ˳洢ռĻַָ˳ռڴʼλã + int length; // ǰ˳ȣԪأ + int listsize; // ǰĴ洢Դ洢Ԫأ +} SqList; + + +/* + * 㷨2.3 + * + * ʼ + * + * ʼɹ򷵻OK򷵻ERROR + */ +Status InitList(SqList* L); + +/* + * + * + * ˳ЧԪص + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * ȡ˳еiԪأ洢eС + * ҵOK򣬷ERROR + * + *ע + * ̲iĺԪλã1ʼⲻϱͨԼ + * ͨiĺӦָ0ʼ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * 㷨2.4 + * + * + * + * ˳iλϲeɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListInsert(SqList* L, int i, ElemType e); + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e); + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void (Visit)(ElemType)); + +#endif diff --git a/VisualC++/ExerciseBook/08.16/TestData_8_10.md b/VisualC++/ExerciseBook/08.16/TestData_8_10.md new file mode 100644 index 0000000..4420b74 --- /dev/null +++ b/VisualC++/ExerciseBook/08.16/TestData_8_10.md @@ -0,0 +1,17 @@ +| ׵ַ | С | ־ | ǰָ | ָ | +| :----: | :----: | :----: | :----: | :----: | +| 0 | 5 | 1 | -1 | 10 | +| 5 | 5 | 0 | -1 | -1 | +| 10 | 5 | 1 | 15 | 40 | +| 15 | 10 | 1 | -1 | -1 | +| 25 | 5 | 0 | -1 | -1 | +| 30 | 10 | 0 | -1 | -1 | +| 40 | 5 | 1 | 45 | 65 | +| 45 | 10 | 1 | -1 | -1 | +| 55 | 5 | 0 | -1 | -1 | +| 60 | 5 | 0 | -1 | -1 | +| 65 | 5 | 1 | 85 | -1 | +| 70 | 5 | 0 | -1 | -1 | +| 75 | 10 | 0 | -1 | -1 | +| 85 | 5 | 1 | 90 | -1 | +| 90 | 10 | 1 | -1 | -1 | \ No newline at end of file diff --git a/VisualC++/ExerciseBook/08.16/习题8.10测试数据.png b/VisualC++/ExerciseBook/08.16/习题8.10测试数据.png new file mode 100644 index 0000000000000000000000000000000000000000..a40b4546dfaa0d2354def20df328c29b17c8ef7a GIT binary patch literal 56307 zcmd43XH-*N7cPpZpi~hFQUp-}h0vRHQHoL(1wwDq0|*GABhn2;KzftjOXxiUhTcJ1 zfY5ty0YZ`+-|zj-9p{X3@A-Ge$w)?aS$)s>%sJP3)((5Cu0%=3NJd0NMET~mye1LR z^#md!;)q+sge#H*w=jgiYc85fFNw+qnKub1H>~8;g=+Ca@2#o0p$9lp0x6$8`A+5k zVk6B&A~Sg2t8Nn^O#h1{K)~eNW{bI}h(kSk-YfPGTu4Z1^tD5!t0K!HstV68p_DCz zcd^Xz`0V|pX7qZxa!V@(8+>?l`TG6L{t+FkM|VPlUunI_5FsLJAcp4t-ZIfB}H zdJ{2y7Vr9;G=J+xR@*SWL6!y+(H8@Mgr*7Xhyn!EH-X&>jJpQC`2zRL>{$iKg9I4Q zQvtfs-uneX{Ls$?b`Mk{bsf+L00D_jEq<9@`z~7nA_HotUxQkZ0|EXOf+jGcZdMTR zCV+eB3!?HS0Qv&NPyr%Zp$5ilh9F4p)!62ibI#Pue;;^cP}I*YlqRnrQ)KYSR(MeG zk-^OOmU}nv+XntfB@Smg5K+I~nWb=mWMUaSof*Fu5!x@B^H@EJ*Pg+Jp%#l=D*F7p&j;8AZ}d^q(dj-4v` z8p<8yqrQO-L<{*Xv~;Qru*gCGm9vkWt&}c-O&cAuMhjrihp6qDqZOpUIMe7SH(bRT zTV;P$=ABxxzMT0AUoTUz9cuLGPRi*!<_W5%Ka`9eGm+yS27w=E(pDVEyY%V@fd39d z?x72;xg`v!{Z?RbF;Mv!nRVy$+t9|En600=II=hq78SZN&||QrWeCkR1rkb;>W4Fm zVAwVFD?@w1$MV!-ND)7JxNaO2Y681zd2(%};(q(A*+9xFlRsjHQWT&c1sV^%ER7W7 z3D8Xr3L7r%mT5|THtQbNCEw^6asVi zq*xuuuJQeKq~3cGYBm@(MgcS)Te0J7IBK(7p+EQY*_Nz;D%(j`ZC>EV^OHc+5~LYV zBn<;)#gu+*p5ETq}|9DRk-#Q(Rfg2_rzS3 zXD+Y%whL@P^#K6+Mdi@<;VrdS2YM#MP|wAd9Dkmh5ZK#0G2w64o_?iBs_B%i<%O

Wm|&x~Y+ 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 VD+@O7fy4+Rd0FL0S<=tm{C|&J3V{Fs literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/ExerciseBook.sdf b/VisualC++/ExerciseBook/ExerciseBook.sdf index 9c4add63ae6cdc7a98616b77151ba98860b6a5d5..2a2eeb129fdf1d3550efcb0b9142837e014caa38 100644 GIT binary patch delta 175742 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 delta 84744 zcmb@vcYG7a)<3+XX3Is=;)Zb3Vw>WIL@~wKNT!2}gl$YSktirb7Z{-h80AGVQYp6F!Nvx zOGoU!3mp6h`52ay=HRm_u)pKRV^}!i^+$jCC>-8PDx*Z!xkJI_ml^Owg9b28S11{Q zmsQO^881*`H>24{F-!*W&JYzm{y9H}*2`&UD0l>|pYvlOif)BUcSvDO1Ih`BLMRIC zbqoa_L%Tyh<41<{q_HnLFFLMJ62CsE6-A(T?RxS}g23Y#Hd$a?jHQHPIgGnpCIx$y zy28+dhzHr=6|IY5lX#C0Gq($Ru|GG29oNeu`c7*3cceg%iBM`#ym?oUflw1mB4b9{&fC7BkA?F9#xK7qK-DRp+x*a?mz#LfZ_$YDM)h4z<549^kWk+P3=zhSS!_j`xR-@uQNDmP%`s}IIL+OqM*HMe@aI_eUSc040_;b&j*ZP zm;lDE0Jr%-zX3j83;GH48?aQUnGRC;d_*c)$0Z4c-Q3it@tEINfTN*s=`;`q?2x=I z%>`cOt0q9G!baze{8ub0yvM?hFj)hDorTqcun-<M*e<>Dw7`DAQSc#h!Q&*OBJ=Oe%h4xwxn|B2H$+cJLZMBo8GrB)qFl*e}+I z8SQ0Y54U-MI?QSzk0{ZrKN`Y>DKi>C%wyC|9-$Bw(N*x3Le%~t{l>T`_KmOdBYXWN zV|kcO$&=yPBgkKpQF2kXuBR76+$^pJB5n_(#f8KlpxaL9OUWGu7#W7-~Hbe}*g!oA9I^M|`X4gpV zLq7P5)+NCo^R)@g)jaJKUfPdiH{`2OIaT!T$_3`D3j9Ftz+Oe6R9%gkVVVN(2M)kO z_Rl@IjQw*Q9%lczp{tAcE&JyXloIGq1I%Inl)*{@Uk=`c?-F=lCcZB|AAmWqIR#JY z$G#(UxNjkbM~*kK0KsuAlmuafZyaMy!3Ra~TygN-L3no9hOwuw5-6{qR9p$mu=05~ zG3Ek4qcp>O_VFOQ_g}G31liTvvpoyuWRP9TWe3aug&<$U<#$tU-9Lnb z{)&An$WHt#_URxSdxqUr{%3;xA;wcZ^L{qS4*e_kxgfj3e4^*m=Y#C@o^15~3qgKF zPd=J&f^5TIwa4}#d+cAa?Ll_&UnTCy5Awy&luV#uUJA13{Z)JHV5Ur&agYbUYaBMI zS??jgqQ0cRuzv3N%=M}J6Yt0VkHAOxhr|b}_cib7-Zi+%PU;={ZR=Z(H(hV2Ue~;) zd)4p?dEfi8|1P*ox+o`o$9mgw%XQOz!~3HDI=D_UrYq(Si^JaTywG{hbH;ZHv&l{> zjw>zdR_#&!VdFv50rNh~9=qAOt21neXS;7JwnesC!Tj7bObl##zDzz{``RTV>i%!< z;&gx65$pgX@66GKG2eVYg9qTolXb@#$%7d;c@ftAj(x7Z?mf=S?hfd=Sl1i=xNC7S z9Q{?!%Qh2VEyupNUAP)0c%-Z4bd4vzX6zm#myLKw%q-|L^By0LO`Q2kbLYq2kNh8k z5AhF(_f_v{-qpDco#Z>z+w@!3Hyv-dUU$FdebxU8cm=;t+*7@*xvP80;3A#W9s0KQ zmgA=DhWkbDb^kSR4QGg}swr7(&26QUj!HN3&eT)to00jnzGR^SWh}mxQ@H6 zUW>mCwBfDPQS)I7^FK)=B7vS)^y(Ym3bdH$m#(}%_;49WIEP`23!a8^NQmtY-f9%oC_KHaVz}#WW)ggGH*@=lzkXXxcz5)_ zPGVemR}wp3&U_t}!;>;lcR$4b{TfLFU6%!w!&Nx@UgqpHwn+YiitEqiuuaw-HM(F= z>KSk93f>)+&DbySw|kj4(ypPOBh=4U#8^~^UDu3)R|{g{jr%Co z=z^(J!`Y}PJiXowM*UXvj}gW2v-_E|Cm7j+L(%>m^)xGA1g=jDeD%@lXZhpfp0Kfq zf?a?AWelA2O6K9T)dg#&nAv86;y=Cm_38e7S~Fxw2mI}o%p++73jXS~XX3k~ev7hI z1CP9lKBlmMSsbr^HU~)w-BH<=qGoQqnwbmWgt(ko>2gIkYjr{LdLR7lHI&LPn%dg$ zP~QIBjFm)p)b%JsG8q4QX6}g91z)@us_x2PHyguF_U-;%F!oaiuLnOa6@D3$GeG!K zLEFE@aB6H$uJC3-)7?+u8?ia@LMLkaZ^GYR&s^8+EZBPgzdfq_(SYvc1qDNfyw@YA zQwDbPUoBWb1S*#;>EQKqkiVm#ygWwz?3XS{e-ah$eE#7CewCKR4tFK2fD?u{y- zxBA&^i?h1|*E1jMgM0yczQ;Jl$1Y{TB$Sas-vlFuqKItu{<$TjWOu*l7tOeF z0{Gb*nYm;C`rF;Xs3Qut{HqU2%A&UQdmdkl=8w%AyOTkG^%NG)$d$9|_{_B-v&Qln zhi$~0JowwlSxFl~M^(WY%R9kU?%PPBjM2LOt8$3rKm=b^Uea`-1#mG~17{jl+V% z(<^((liw4t0R>~%M5-~&gTm8meRl+G4ytqo;{CbOKMwMJnp{T|yn#NucUi&J57`nj zq3BPq6+_{VZ)PU(97AF8+w8RRX6B;awu0X}KkgBAUk+@I&PkHS4DWtCwBX;P-(l9h zm3ag(6QXlo47WK23b}je{^S8@Ni@7$2VO)XB8^Vp)-Ms&R^Ql5wJQymFkgKnB~}q&k~Vpq8KRc>lOGM323;p*!#B zueuSt$;h?28a{KRH1{|kF6ggkm;nRys7Y%=`DOt0FgG(b3--%Oh=wl}7LMjS_UraO ze$YSOwNtm#zk}YP+Tnhld>((^v0b;_zm49e+UAC1iV72(H5+Y$lprO=J_^{OOFN?2-;VwpyF+*1Sp_Cdqx^m&y}qNR_3?4xk6x53zg!6CE>CO zXs}tqh_$@IfIm2A1mkdpmPjB{2UJId_yI3LE97BLz_Xcz3h}T>zo}%XRP~J5!~a<- zPmmP;h$B2?6Q`7&tymta`Ml@(%*R9Y_xVi0%S(O&%*>Jc6alp4%?d?XBX*X>L1p6b z4bbu^^jn~TA#HiT+MGhA{MF81o2yZhjg)|s=4Gsbk(Z@{)tn*mJTJ;r-dB$IC~{888!HOT|riD(N0sbyc0m)_(DR_XCbXc}({ zPkrt58;6`?Nb1Hufs)%`0+LHu#f=)54zo zz?gm^)zzR^4|)gF8d`l-2qbWQHlErHUc+A{UQyk5yzIK`e#z_7ISqHn+te-kCVqpy zj$fm$f-6)9xJ21OJ9Pn^r_O>i)G1)2PJ$DZ6rvQbUh-Oujrct-vu#Q|yt)Y9ZwytulbgghN_b&4{fCib7 zfbr7muWd?^J}lNE`jm$$u!wvZ=4qNB0GJ1ZWuB%~xY`*hlk~-$JPgemN=(Mb2EzlM zrcC&fGjcT??j zR>Q|KuyzcaDS)s4v#GStB&2P@6f?1D7`9Jn;bHrQSSe-^VzV(gytnA@Jf9FIeAhIP zHxGjo<)U1;;k%|AiH9&Oo2Sji;sscxz>|q339!3-bs9zpFe?UUeczPCJAuKq-#6v( zPGa!V_f6T-7cguBc7u=26WAwUmoWI#_bAa-7}Mv6rd+`L8wM*LH0cBdJf#$#f6#O^ zZU#>=4I3c99t+F`SiKMv3DskPVf{N7*e*c7GgN| zHy(DE=gGq;KKv?CG!TaV*wh*JD<&($b_*~*fPee3so$U)fiDkRA;5m*`|`1sB5anx zD8uH7uz&N>*!dkFTf;X`$FcyHEl^L!h5$JHoygn}Wij@ck4=JWl0~V!nL^n1PNXUu z=XIuHRsps`q_4nU7hvfEZ4q`ufPErR6k@LkupJ_EA+}J6{ftI$3}YU(iFmT;F`u3+ z1DGth$xw?aO1nl4R*ASDAU(g$Dbn}(#5#9;xk!)YPvWspcU`8F*dIFB$DVPLaVuxu z34>X=GpE2;a%bj>NJ-}v>IyV|DH$5#K1ZEXo%2F>-sn2M^Pm}04>I=lcQ;ebbd#pZ z-)L?0ueYvuucJ_#R#wv{dgsv4 zTZGHuyT?H9RH{@}>YWCr>2yHn&>FNci0J@w_r}oK*l-U}Q8~ zmTC#DPqP_A^!U3GeM&|lWp8v?*RxY0uHaSkMh70h3YDl)1ytFhP*m1D9@H*b9m`nU zAxMqw`D3{da4Brcc9G2!ViDim8dZ~vhRF?3tmef7HCkh)y$kvN~iD=6J*;lao{FXp24J~ zq)E~yIV3qAnBSSOPfJ$-q2fa4c@w1GQa3_-eRgabKza?sJ{;*b$i1#T!Wf82m9WG?mG}9rhA9DOSo4FhbK5)JWeO!fB+=)7W67e@&mn zV-7c@e=Q7)!6-}`xG~2sEe{9G>^12l1tE?qY@>aH9=Z~S``L*s2axb?Q~D60d8mGf z61pyi#K}N*XC|JBW%veq2G9dE1EBIwMl`_T@aFW_Y-+JqzJJQ%8}Fl8CL<{%Sk74I z^VoPs?u%S6Vs8E?@&Yde6N}YbF)_1asB}4xx%FG51B8&Mu{%~OpsF%Ao^bCVci=l5 z&+DG|Z>P7bw!62H+wg6Ut-7uLE%X-E7B`eWT9X1Zvr^L)_-fZGauu=4^+e_{tiV^e zmXpf~By|{;fo1S))_NuM6ctKf{+Fvv%;%3HQ-RGQR>tOkdGhCF0uz=zp)0RpymCQK zpb_qaXVtl%^7sKOe74yZ+!Plxj1dMD` zy%R8twlA&$u+Q67H#J_fe>d2T?^0Y)o!6Yxoi&^xPgAF8oAm|9N#ca+xW=lp7~0&& zyhn9MT!-8Tz0iLE9KiPz`&4^1dvvr5#+4L*XH$g9y^d z-7#>?dQ^ARf5du3bHsm`KCC(HJwzW;9r7Ne4yq2iAq5HOK0qEI4!HJ{`|uw$TSjR5iF4Io?4i9u!jv)XA2hOd_gYznD6QJeT zvS_GiU3d^G9*s>0e&)>E(<*@cgR=SC9-}YY)i^*m2Z+ro9r%%o$l7E?^QO z>(E4ylwZBC8MhJ^Rhy>Oj0U6LBu`MsX{*&jw5eJ($8<*xN4$sp z2TADP5BB5x2+3a69u2KC8+MbssGR_gc|6T!(}pSKs!yl2)}fxL+sf&Q$|fuqRngD^ zd}i(4p(jJaKrggL2;7)euMS-0O=t#~@4V%__B?&geHK5fJ42r)PZ6gKHr%Fq z!Fv)Q^`rl|^|;llv(grgMbqYQRkeCiyP=P|k5ETkhsnc^Lxw}vgF2K?0vZnB2XrX6 zntgtxX{FFuMA8nk!A$K|p-dCI3_J0ix*cGL26Z*ncJDT#d7FEydkeM2)j}fK%dpwH zNwhU_)B5y5S>#m_{T-9VXS*2YtP&rSg z_f?wa$Yxt+DrY#SYs)>Q#%Y+&T%stp7pkXrPS#KIO)!m@LEUXh6k4fMP4c)jGFLsy zJAxje8Q~vp9j+U0&C%t69LF%jFnpM6C^?iE>K=kKzrH;*1lY`BX88|W_N|N!)nhq+ zPE%8#M0=ldQ`sXPGqtq(Gd?q`qIv>=vgj2#(o(wx6W6de3DWM1ndetDyvt)sW>-h@ z;M+wbWM~?7KNvp-UVONy01)t}%Ib^|^=#uT%S@z8*j4rrcK%q}2aTx%cb9$Cq6}|Q zM%a{*MtN-Yp_?~RKHjlLaYoE@7=A@w^Rf_<{b#IVG6&3fiN`p@YR2)H#}!M<0US1S zX>yM5RqLxd)ZiVj7+%3&aos2H6ZhTssC%k=-k0f@y?5!mU3zZZ<#LjDh&yg1m#c0; zL1fKK@MdC6*hp%nYNdAty+X6XzueNH>i`{u!`ZICh+VLpQ=j#mHl0$~oG0}su;Uhs zy3KRUbX0M~eV96|fQC1V5}_$u8l7lGjUU_Y*yd<4w9p$h8~v1(@;Cb$ed~N{d=NyA zN{Q5vilx|M&mw1yrOE`YU(_T*r6jZ$nxPp<&17J+N6Pxl5k|+oh-PTt9_|d?j3v%v z`skC^@ZrJvNnc9?i*7<r7rNvP9+EdQ178v2>p|ixlvE27N{0@=h5?A28Z7IoMA3LS62xtHB9pD z3NJV*QOJM(=Jv8e~P|JsK&B z(vyI+8Z}05K)2vpVpsy;!#rsU{3dICI+WZ_%#^DtywmCFs_EWxx?EH4Eu+gcW&TpS zR0Va}>!aYVd}%1NJUevaIcAE_cA;7u4mq_Z+k-8?BF~>7WQ@Z61`!+`PkaW? zN95N?+kotb>qYWK;ziwc(=|J+{8F;GjIg=U*i9cdSlt%NLbqw!s8;te>X<4pZfgP) zFWa+JfoWHR<`~UEKco(*4tV#|`>B1Zee@nT?KRV8jhWc(-bL;tcEVi=k(to=)-pMC z6h#g}Vwn3vSQOMpmPAASg%OfevQ|^$uW~IU7ZMBc`L227JYt^PKpBX+?nA>BtAKou(sDOF%p^22e&;?EmULfEAqO}g$yaG>l8Bj zh`OHuB=f3IH>*FW?4d%BkmcgdG17wxp( zaol#@a^Ljc(7mX?Ml#e@`ik|kqr-K{?eGLQ-Bjl^X#O*x`H!-hPg;)KEzZ`?qaLJ( z1&8p11XLZ+?APrx>?QZ0r4)^%4#zInPWKKkn##a-d>gS-|V$g|8*ns8(yxTxD26E~l2!4OY@&bRlh&cd@@7pt*@yq(UXAt2R`T3#kS4 zeCs@i!KHUU=S3}5KbxFI&7@~oD;(2Z#OIl~MS)^w9yGHyg8Wo&r7N^-NFJnVc zCm+5+$b2rWZ3WEKOKX1QG5ud0Udt~ctB61?nF4w-I?#6MrK+XgCDant68B;X^%{3Q zSx?lv>c~2F&NM8-7ddJTwV>8fqpJZm)@offsJ2$=s{HWO7wZP4xhly@ywWv?oI}iU z%_e6Pv)!}ES;Q>YOmZeZ(>22|1E1kwRJVt}gLG#yk39bySK>#gjrV_r)5cAQu}owL zlKMH!cBj4o?N`H6m>=IqIv?ixhpC4Fv*Y7bC1Bq9B=s_n**kQ^VE~mQNAwdWV&kz8 zC}qNWGs&YyBm(C0k+PcrDt1a^fdOgE`SC){BD&TB$%jUyH%n5#tRkv(3&BEs0Wsfa zaO%y^>E|jdu{oV+?ljI&SIDM&%Iu}4XnnB^nG5w$`Z%;iWyr_#U3p|4k>?&w zjaH5J=K4oDN18|Ihbwcu!{}j}Vg8}kp}L`9sAGs>2tC*ZpZh9R4*UMJJR54i;)Uh9 z<&>Q6ZH@ECT4Qywh8R4?6-`DH(e5ZJiteT9<;ShK4hOhHW{{CmN}`Pfk&XyM1Rmjm zcch`37A4-I>?Qwv`)_FuROMTVn5QF^aV2($kz4Avh#AS}IiWnbdRlD2a4d$8hDqwt zG=OlJ3YCsFU;w>v4zGWpTH8Tm48RCy!8v=|ccUw%7eni#p1tj+V*O z>U!75A<2@@<4Bg~GnfJ`Khi!Iz|iq&(QwfCv_|I6__R(QGiq|09x!+Qz9gK-xPF-a z9e}2!%;;qOAsP)aItU<+BzpHgVjsDe*vrcCIPKYOhpx|42bNm5=(d0@?97h0xHjXc zBjKA28}WcB=%Pr9GO0}7X1ZC^><@^8AfOVa)|uB@*4S4&S9PxRtne+zmdlnY8kD5k zs9maun#AEGyS$VUj+ur)Tl800D|8ix={V|0WI2I46IG@v^OpLdKQA;&NEd60bug+V z?V(K{ZSV8Ox{iOJL@iZ7aa$^l{e<*avX~!{?mIfB89-3czYxxl$LxTQz$@YH=%Pi{85qJ7xp2tjK?;FyArHFb_u)nX=kjMOSI6{0prM*#_;OubpSt z%bs)1CFgPnUDa&wEZt0UIy?LL%LtuYOKDYFZwXzZDZz_fMTSDW&^48uO3J4YQyi0A z6D;F&P?u)QX&3Rc#p&4nM< zrhNqeSd=yd&Z|lLL!me?ENrgk&)m6>mnj z2-y-WsuTKu;1kfaI4uln&xiF6*B$g9@FRT*vDXa^3DP3IZj%K%{s@hUBb$`#z3b?8 znsxrQ*0s8|V69^fzPb}?E`*JN+AoN{d~%@{5|YrEQ0pAs9QQ107F0H6_eQ$|XgjEL z*Rp<4eKDjTG%m?3gwETN0RnG2oem#m^OaCJCRCBA>Er56_9l9}~uSRk$9qDaG&;~Va0pWe*&Dqj}ulES}N*V4adl%e&&x|^?cBxAX*fCZHg45`0wK` z-@wFb>{~|MS@utfxac1x^!t$?qGe3UD>VdEyrUZqldaRkVV+nN0c*Z0J7}|{nB=@_ zIGSC%bUw3o>GkKe%N!vrpRx4u|D8q4u&0X_?7HKc0qrm-t~fjNmoSH=U47AW-gHiJ z)_Gcw%$F=D)h9ewlSO6mLi(-xDCoNxp-2V?T>JF@r%M)Pszt8M)DjO+-DHpD)QzPH zbD>ecejuMYd!jy_&xD?;m+;_%*Oq(-U9T*8n^B#uSMlJ$*O&AGNU647ID`jwKu=ak zKcRJV=Ozrg9*mDdJ9kuL!-Y6vp=*I}zGA+69yL!j&ugF!8iQZ2KwV>O3H02K2!paE z32y>|`RrnS8nAg%_42-BwjB5zX;6x|+9~Z}>*HG5d9_bPqWdxgHDL55oX4gzU$ zh)aIE#;$7z?ck#0g6lka9-4m-9o-v8vnkc4Lh~uzN*~i4^B=VybsRAqfySfdvGB#r zTA6^}L(s7Jp>aU8ZY$WTYVii9Ikb>P5~GHKp3&(^P;ntFUjUH$0_wkrNs#GklnZ6- z!sR(rrFJ%$&D7)<9|SgSnoKVL^mF-qG%N_~IKx8cMQjiw*Jro$nJFhLUKharXDXzO zX78$@fcfA|#T7oGGqS0>k-*1_dyashN7Tu-5?g$motw-X_3*~xmC3O0qtL5~tg>H) z^dX%kmSSU(x==RNGub}LG*LT2G2RDtNs%eIBhQeB=eb6cqlwY(Tq>7h+)J_t0ho2I&HZVbRB4lJ^LmCaax@rg?J~y_ikokFR)!%v0^dKaa$(&Rb1HuwIH)GPk z4YmzlI1J9-xS|r?8M5#m^lw^G$QTaQ)Cr*aae9K#v&Ote4Z%Zxe25C|$`Q-lko=+| zPOMvET5PZP)XAWxDLol(*x3*bO-4C>lkGig^waex<^nWsNvci#W3Fx=U}r+4=a-OI5d7WEdr`b zs+=}+nm+CKiIsmJ9;U|3kGjMSTwp1RQ+onp9;-O=u|6J9@h^T1Jn%X{5fV=RLZPn} z5f5w=JfUqtG@h>w67y1ecg1>$D14sGlEK86 z`3rmbPNQhtYa874IzJ6=L`Dt{ zc7cfZ<$MvZ00rAT5ibmdB?b}iUA>5xgTkhMoBD4Wuxa4Qbff&E!M_PVK;3@eO-{Er zZpY?Bxp`!#3=Nbzq*Sp1(5n|Kh%(=sM;7qHyU8KrB=Gc}k^Q7XML+=)h#Mq=P6s<2 z|CuN?1@u{eCgP^R!2Ks8)a)I}Fo~(NUjs~2zuApKSaNjaV)$jo?8LyY$Z**<%+jq# zgzck?33xC|Is-T$9UmFfj3doBd4WLMaq7G(pdmLPt+eY5d4@RSK24o=pQ28wPI=Kj zh7Reb4ab4iVKG>6w3mS+y}bX)n5#QV2R0S}(oIunL&1N*dVpPU7)(5l^vY)xS6!$rNPbtx^a%XQ1aaz}%q zfgs%hixSqFgw-zl>#g%X8C8j zXAl+c>Ckg4GhIa%5k>Aos!&zvm_kq1O!iN*PSQ=XPS8!D$6EtZxMM6B3kvM{`drxv z=TIXAk2BI(fifXXmE!HIQh1XMiLkg0^ob;5R8ihubT6-zj?}_iZ6n9pOz8^ws~+{? zzoE7=QSZb?BE43~1`%_yUkINcg^80DJ25fA-Y_M)@s*5YV8|zYKE2cfT|Y`j zLSs=Tge4C%48XzM$qvyVO=`MU4we@F>l>8(sxUt498WHb6&b9`eWNZi|MZPY41pd0 z9hJ)D{W2;R^ab65yco$)14v0qKrZMb5hE+6H1>B0qyBZ&>w*}=7JQ3+mthx$XgQuT z1~?f!tD!%DUnc2ip;bIDHPnz}9_AeC8v^$|4z0JTGmP@bGk^aNAIX1b)^XmX-GyC2 z@?UP7fbk8@od=jDIk`ym_;h&ghkPbwRIU*K1tfnDMdD3j_5f(A9J4&qy4k(SwNbV~ zZ?ZRG(7m&|Ka@S>hx3+up*Jr#Mr?V`Q%P59Dorr?wsZ`TLI0!BF-%i_?gr4}%#cs3 zxX=~>JivvYS0AXQRp-^$b;}0{M6Kt$$=qM!-ODg zg~e3E@c8be+6JPH3h@F@d$%DJ)&|Yo_!jsP)u1K1<69@7_@T!qvQJGyw{H4zIATMC zI{233aLtB>;X!x;IyN*64#Jc09~&C_b6~_qP7Ysyr5hVY$9AV|tK?+P2KR5|eEBK( z5f`3@@=Xl`g6W=t1)DgpIRh7MYN*ZVPWNnq>?{^~ZY;Ws$FaBZ>}>+Nb;mddf85ki z7EJCO9J{$e8!Wl=)olC!LgT*(EixL`FGtl@&ST(FJ{)^kB4 z7c@0<(Vu{c%b~ac<9x+Mzy&-m;B!Ga7YLq$W~^QK6k+WmE(qa*P%aR2K^PZ=b3p_b zL~?=T320{fNV}BFl5qjf1--bSj0>VTz#h#7FaK0q;Ww%F6hq%1Gr!y2Q)jF!v#7nDBysOv0N~Y3&wlen}g$5#{@2GA{R{Jg2`Mkg$t%~K_M3u zaX~Q`G?#FZmJ4dR06SNNh9L2i-g2&(3re^^%LO_vn8pRAPe7pj&y{gmFZ!-4u4}KE z82eQy`(v#WZfJ~*4e>6JEpW~EK{}G3$XCtPLsfAk5pJ%~1VlZ}bhMZL<NgbOMXo}!kSNqn1ydbU3{&tauF2$Ne6kw)cSXnX$#FBqLV%8k|P+5`8^hZ(Zc7g{E6G zN0;K2rdhrUeK}t4DkIB?fEtHYR?%8*v8=FjvU#FrB0XL+-aoEuB?ZR%)Smp#(WX(# z5uRb@A!?OxkR@B21+wr=kl{!N1MLvs-8c}c2c^aWJJdbq4UBTcpl!NnSCp=oL59m* zQc~)IHwH}~-(t*eF%D`mDqD=I7USR+;}Dy1s8((z=bwp0N?L{qI>#aR#`#z;q@-O` zEM``pS)>=x`Y2=>M@Li*1SBK8xac=v>l|u{zgM||K=!Iw9Wo*gUNQcUFBZ zwV8&Q#n;AUzL<-ut{9n}=Di9#2c(E1SE1;k$Zngp6rT<41M?@rOii95ily`m(1UmA zzCErl^i9e~Dhy2?F_4X-4n$D~?n49jl~^sd3n2k+1o-M-CqFPGVUW+Y(n#DOW(D$uC1ka4k8y&@x`v#c7JEX>m5~1;nSY+i|m>0uj zkIQ>E+@{E}%QN$L+S1Vqp);D(yk#V|7d7vO{>(rAw?fBj=K5I+CnMvlZi!Yng$oL~ zpoj~&e%!)pE{8Sc3Z}M*3!b`$qY+rxi{r~JjN*bAF5vo`3zb}siVKEt!6+`s<$}B} zFclRj$^zG&T*&o%7gll~n#%=xE?`~hAst>9Ey9FS_P2V=nCL9@ZRmHf47l$2!jW9g zDE1KoJp%tpERSr)gbTRbg6Gwgd*+J^@uQp3%K6!LMfNSJzzkX@`MwZ7KN$Y zc-(Uegu}R;94_FVb|9R{2)KaH1>Cb8 zgh^Zu_fQC72A7km9{BV$3Sl;v_4K3()MmyZ4m5w96Rp666S=Xt$5jX`*;pisg(_9g zjm16lLMY&zM<5h(0r%t#VJw#u#|3gOcyby?SJTdT!bu4<^h|ENY%X9=_<;Jby67lO zsNpi$lR=;cF(zQbGA?5}7jREh5Y})xwOmkVyv+D7FFU~tE`3GwI3t57lGCX~8C+1p z1v9un%;^!LpG1xb8_plM=pG_09ejC!1?jLWX!0y(GJME$s63>VDcf_g5% zIVB+K#|61hKnz&wk$&Qjkr1+wiiY3(JRVp*}e$XIBZ z+BpTAqC|$i=7~;tD_@#L$cCzi7zbNaok~op9Hh@SXE`%{8Hx;Tx@n+&fTzCo!kLr@Zvmu9gaM2(HfsV1B@J?kga&i5&O101%33*=BG%Z=YVL8e#+^?1w!-T zr<_nO5ZbvME=ckmefmsa4uB)pE{lMl^r?u+LWLmnoxp^Xklwf3a+WO_i3u4bqmn@` zuTL3J5MPnO)Fo690H&;4mK3GFU_5U*r#ojo>pi1F?hTexozRe%)nBf%(5;$Q9kOV0 zAPaidds+u|`%U}o=y<2p{s654J|9Y@X;wRs%P6Ze_LEjpw-hY(*3Mrytk?2(g#g^#=-hcFgqpa0JA5_g^6hfdTe5sZ-T!?`d z%k(5XMX~Mx8zBNQ!`VoI2n>qgmDm&`WO9q+g%gXB#20^pBk^_4z^0%^Qx$^TK5=z; z1g#$f%nW&S06ig#=qdoR4m6-mO;&ZSD#J=U zbr!9$M2&oXU4?EqGr4MFnv5_g=wwZ@KgpV;O9DxbL~lZ8yc4Z4EWOQfnt*AVAKpu@ z%C)IS=;hMdwJ!}s@@(HUIr@Mnm-;Z)7i}J7xcLm8nh`C4o_-nqnX~~Jv{2})R#a<| z`GYhKzE~+ufbTX&qGMJXWwEeV{wyU93YAm!Q_R7g4iltXhmPT4d9brMGKqOTJ0l0k ze;xS(e+eoU(K$}B*w14sM(!E+0iTKf$2cPo!f(cHhJ*e&?jS7ucHF<1_4`&LBZvdD z7ybv?1?I1oAwzxd`LLOM!%7GI_2Ia&d~J~;=*ioMX}TS@0oa@)6!P{vhssIxw%s>5 zZ*v~N8j-Ws_!|NybpOIV0_NM9A(_EnT$sU zkszh&E@0fLRV9EKZd!84g2b$4a9EY6!H>bF_Mn$sn<#tiPP~-f{0IkhLGR&%M{X$47-an-x)s5+Xt(zI+UIGL-E3w+ybJ5VM_5LeT!0Mfw7O%??o=akPje~D& z?s{bim)1p+_9XGU?B%(MiF%Skdy-^5NkV~YSZEiGOA32Rf`7lU{1w=IW4Qtu z1Q`+}@foU#Mtx4;0nq%)cNU)1|`7cin*@gPcwF!TokIRvF{p1l6 z2-bmA*m!iZ655VVR>4m8_Fr^EcCI`~Y^#yOvbM?R zqXTZ9tn!3J?lAN&%`V+euoIdej9<&}Do)^nP3-m}zMB4BiYpK+ZwoCc?@ zr!>gufVOFD-WTW>RLHr4I!T;#oiHG4N2}tv?l?e})CMbS|3xBe1Xml0>=9hZ-4Snf z9W%h9w^m$d3U@VLM$Qg-dhy6{tNy_X5(@%?L}c{DhnrbBffXV|koZKKc;M9Zk#MJF zy6XR1hLGi3C<5wZ$(Bvr-meRU>g z-G#=@JexCLCKnwWG&DLwW zYgR_bSg-1?f~$@z{>#?Oy35uM$0frh{F2K791gny8HbwBo6neS<`ZU%`Iz;Hz0-Mc|seEY-Li`2RA8O;Q@2X=pbxk-ZQ7n4-4WB_~3BL@VF-}uOr-a852ja zw@8!kk^)w~rB=a9UrGkUf}>?QaPaTae7NU9`e69C2O0VBZ*K|)zyXU3W1;eK`T+P+ zl6nSoUR*g1ihe}SGm4Us1h}DidOui@#7ltsY~0VZ)ycyZuy|005}Hdg(YYXZ#Od(tm^hhSAC8B+!pJZp%q^zGDzP_|4%LKu zLuAm~z9^2hCYJD#CYbqS%ouduT}H#n2WOFR7uym2q(h-US_`%jsl;mEX8x_H6^6ly zE3+oRjTyCjq2?x;k~kZaDzN#O6#YYgOgB|%RHJWbZm3?=T=zra?{z;6qLD`o{=8

+Wp@<4c}TPAJO;9X8WI=l&p=C4 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

_1M9 zW6M!&`KFsKy=?jREVis;%ik|y%NyA8U4c#qFlDk40q^ItWiea!4q?lo?52eAhr`%% zEL(oeW?z_Qv72#>Kbc%jb+b*=*?-JrH{;p={&@jgPGif@XS1a;`r-^5QD9=jD@@AB zi#|3h!K4hiNUYD1*g4hDzg4F!j{F?cxc`+pvi_P^Z zk^;UfQ*)wod~u4=wi#o zT@wNmEXwp!VSIdC%{XBklVeSdiH)fllk&toVV@`Ej?&1j_oC=Uo{M@%M@D-_Cr3p_ zxke?cB2})cVHup3z#4@C7aA2@yaJ({5X{n4? z1S*7zczK{)D37~pT!Jg+tZ@p?cv(%EP!=m?q6o2)nvzs;tk_qa3J+qjUdj=5_#7#F z)b6wQ+M+g}qK@FP_9_uyZ(*d+Q`lP&Dex2|Y0T%zPv%APTzN@L#Nx6f%^|bPoXid7 zx^la6LQ4D>%C=;8WreaVSzVcdOiN~0Mj*qY$R$`zabv)kl44SgloDg2;FC{XR9Rtq zvgVc#bl`;LvZ=eJ@_IUEd!>jp)7~(^5dte9O6Py;%*$Z22=|NTNpMsL>%`y+_((^` zZg(t$pNf#uC04+G5q67xE1*w=--^za@R$gD#d9aO|6Y!Ew-kgw7vXuaeHpwU!WSYP zyqyr?tk|{&UJ~JDvHB)>MdY*E=|JwM#EzSQ&fh*j$G$^Sq;t64tKcmW-WK_+_Nfxr zSi3?>tb$V_2vYSr=nv9ynaaHlh+SRbn?2l8J>~gSt-~IM-bg4dR>#RTubO+3KLZe4u_+3L>9OWU<0Uv4g*{Z zuoTQ9jHY61Kuz7kUuete$tjJPws7bpUM{w$`hyO=maPNnn}M-fDD)=ul}&5m;}w8 z_vVSy1YxY4%omd-ZC3affN!Cr0wxnUA@o#$g@BisD`6gyUn~$kLXDg%5Ld{HK5Fp^ zBjtw+#Thm#3^z{)(@CNV7VBUxaZZH!1l}a_*B`YE8=M#iR6#CAoFgD9z+O^40`?II z35oGgMW{XkIH(AMJoDq0(#v=1pn$*}xQxIU(lHchCL~InlVFREzAOm?9MZvI-FJxB zQGJAqNcW}k-XbwY-qOkPCoL}PA9T(txKRg(fC^r}t%t4P&4j<}Jr%0- zRI$Na4Ox1auX9cXj~>S8%@>1{sVm4$4zZ#@XMmY{^9-1+hdKI&=`d9f2088!EA1XC znV<_!hb#2(Lj%&(TO*%#h(irjQDMJMb_^0v3%ALpVzE-VR~}s~4lSk<4Y>w)F7)c* zuX^Wv_=;ws4D>yDp8=wBs93!Cl5K{*g-~Xo@5;XU@Qxl18`^51PX{v%iOb;M^)TE( zg%>{2!7xLj28I}5w4uEYzR^Ri+*>S;%l3;|`-a0dJ^Ywd-vA2?@ECE9gt!h?%E>QU?1qLLsCtL%Mf^u&uy(m?^ocvEPwdj4=M+Cq$Rlxi z`;v{{%Ewl%9V4H();x*%!r@~tT~aH*%(;O3qOa$|?5iH2TU`9}D z!H|!jz5qjEcmM8gSI^ARKpFce}a!r(ygYKaD6sQYE9 zMik00I5AWp=&r<|YwLgFZ|N}@Fo+m3I4G}w-Mg8{^lmnS_j3{SSP*=ekKj**2tF>t zU_hDk8=f%kMIqER4JA*pR>&~DK^SU#rsl4t>)Kp&gC2A_K`w}&k*L|sL z@4r}QCDa{U_czpRT=xxXHm>^yH5=D`gPM)&zRBr7UA+#q7uV}hdvU!EwHMdxP)BjN z-iTU?>y4$6ewdi@}^U!A@F^(Clb zy}krBtk;*IhV}Xq)T3Tsj(XJV%heurb~fCiUSE#7((8w!uJrn$N>}<-{P(ARC~8Zu zABsBB>#I;FdVQ7BiJm^D3N@nFSD{Aq`YIN-)f$NR{>~lqh2?b6$*u0p1rs(a%It8C uGJEbz;^2Q}>c_e^#Q{SbIO0buCo$P$kz3TXYGqJOtKQjq>%P{O?*9M-&Vq6P diff --git a/VisualC++/ExerciseBook/ExerciseBook.sln b/VisualC++/ExerciseBook/ExerciseBook.sln index 42272f7..51ba5db 100644 --- a/VisualC++/ExerciseBook/ExerciseBook.sln +++ b/VisualC++/ExerciseBook/ExerciseBook.sln @@ -289,6 +289,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.41", "07.41\07.41.vcxpro EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.42", "07.42\07.42.vcxproj", "{80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.11-08.12", "08.11-08.12\08.11-08.12.vcxproj", "{92D19D62-5A91-436F-BCAC-672018B7B67B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.13", "08.13\08.13.vcxproj", "{B8418DCB-E6A4-4C39-97FC-E57B694A4512}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.14", "08.14\08.14.vcxproj", "{5CA72478-69D3-4ECB-A4FC-C4F3B9B9E370}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.15", "08.15\08.15.vcxproj", "{597EDEF1-E7A2-4CCB-A036-13D81A98F053}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.16", "08.16\08.16.vcxproj", "{BFA3C1E2-BC09-4DF8-AB69-680C5EE9A7B1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -871,6 +881,26 @@ Global {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}.Debug|Win32.Build.0 = Debug|Win32 {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}.Release|Win32.ActiveCfg = Release|Win32 {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}.Release|Win32.Build.0 = Release|Win32 + {92D19D62-5A91-436F-BCAC-672018B7B67B}.Debug|Win32.ActiveCfg = Debug|Win32 + {92D19D62-5A91-436F-BCAC-672018B7B67B}.Debug|Win32.Build.0 = Debug|Win32 + {92D19D62-5A91-436F-BCAC-672018B7B67B}.Release|Win32.ActiveCfg = Release|Win32 + {92D19D62-5A91-436F-BCAC-672018B7B67B}.Release|Win32.Build.0 = Release|Win32 + {B8418DCB-E6A4-4C39-97FC-E57B694A4512}.Debug|Win32.ActiveCfg = Debug|Win32 + {B8418DCB-E6A4-4C39-97FC-E57B694A4512}.Debug|Win32.Build.0 = Debug|Win32 + {B8418DCB-E6A4-4C39-97FC-E57B694A4512}.Release|Win32.ActiveCfg = Release|Win32 + {B8418DCB-E6A4-4C39-97FC-E57B694A4512}.Release|Win32.Build.0 = Release|Win32 + {5CA72478-69D3-4ECB-A4FC-C4F3B9B9E370}.Debug|Win32.ActiveCfg = Debug|Win32 + {5CA72478-69D3-4ECB-A4FC-C4F3B9B9E370}.Debug|Win32.Build.0 = Debug|Win32 + {5CA72478-69D3-4ECB-A4FC-C4F3B9B9E370}.Release|Win32.ActiveCfg = Release|Win32 + {5CA72478-69D3-4ECB-A4FC-C4F3B9B9E370}.Release|Win32.Build.0 = Release|Win32 + {597EDEF1-E7A2-4CCB-A036-13D81A98F053}.Debug|Win32.ActiveCfg = Debug|Win32 + {597EDEF1-E7A2-4CCB-A036-13D81A98F053}.Debug|Win32.Build.0 = Debug|Win32 + {597EDEF1-E7A2-4CCB-A036-13D81A98F053}.Release|Win32.ActiveCfg = Release|Win32 + {597EDEF1-E7A2-4CCB-A036-13D81A98F053}.Release|Win32.Build.0 = Release|Win32 + {BFA3C1E2-BC09-4DF8-AB69-680C5EE9A7B1}.Debug|Win32.ActiveCfg = Debug|Win32 + {BFA3C1E2-BC09-4DF8-AB69-680C5EE9A7B1}.Debug|Win32.Build.0 = Debug|Win32 + {BFA3C1E2-BC09-4DF8-AB69-680C5EE9A7B1}.Release|Win32.ActiveCfg = Release|Win32 + {BFA3C1E2-BC09-4DF8-AB69-680C5EE9A7B1}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/VisualC++/ExerciseBook/ExerciseBook.suo b/VisualC++/ExerciseBook/ExerciseBook.suo index fc24f521d2ff27fe5068b7c74e6e720ff6692516..a309c84243f0622ba8aadc9c09db2e0d9d193ab5 100644 GIT binary patch delta 12803 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 delta 7985 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 oqGM*>{FfP%!Q0(p^WFgWx==CDL=*{HIjt