CLRS 10.3指针和对象的实现
2015-12-01 09:43
190 查看
10.3-1
大致如下图:
10.3-2
10.3-3
因为我们用不到它,有 freefree 链表就够了。
10.3-4
从数组开始位置开始存放,并记录当前已经分配的元素个数 nn。
删除一个元素时,假设待删除的元素的位置是 ii,先修改元素 prev[i]prev[i] 的 nextnext 指针和元素 next[i]next[i] 的 prevprev 指针,删除这个元素。这里数组中间就留下一个空位,我们用最后一个元素补入空缺,同时需要修改 prevprev 和 nextnext,具体方法是修改元素 prev[n]prev
的 nextnext 指针和元素 next[n]next
和 prevprev 指针。
10.3-5
1) 首先扫描一遍 FF 表,将 FF 表中的 prevprev 指针标记一个特殊值(prevprev 指针在 FF 中并没有使用到,所以可以添加特殊值);
2) 设置两个指针,分配从头和尾开始相向而行,左边的指针依次递增扫描到空(即没有分配的数组)停止,右边的指针依次递减扫描到非空,然后将右指针的数据复制到左指针区域,并在右指针 nextnext 区域设置左指针地址,然后继续扫描,直至两个指针相遇时停止;
3) 更新 LL 表 和 FF 表。
大致如下图:
10.3-2
ALLOCATE-OBJECT() if free == NIL error "out of range" else x = free free =A[x+1] return x FREE-OBJECT() A[x+1] = free free = x
10.3-3
因为我们用不到它,有 freefree 链表就够了。
10.3-4
从数组开始位置开始存放,并记录当前已经分配的元素个数 nn。
删除一个元素时,假设待删除的元素的位置是 ii,先修改元素 prev[i]prev[i] 的 nextnext 指针和元素 next[i]next[i] 的 prevprev 指针,删除这个元素。这里数组中间就留下一个空位,我们用最后一个元素补入空缺,同时需要修改 prevprev 和 nextnext,具体方法是修改元素 prev[n]prev
的 nextnext 指针和元素 next[n]next
和 prevprev 指针。
10.3-5
1) 首先扫描一遍 FF 表,将 FF 表中的 prevprev 指针标记一个特殊值(prevprev 指针在 FF 中并没有使用到,所以可以添加特殊值);
2) 设置两个指针,分配从头和尾开始相向而行,左边的指针依次递增扫描到空(即没有分配的数组)停止,右边的指针依次递减扫描到非空,然后将右指针的数据复制到左指针区域,并在右指针 nextnext 区域设置左指针地址,然后继续扫描,直至两个指针相遇时停止;
3) 更新 LL 表 和 FF 表。
#include <iostream> using std::cout; using std::endl; const int MAX_SIZE = 50; int next[MAX_SIZE]; int prev[MAX_SIZE]; int data[MAX_SIZE]; int F, L; //自由表和链表 bool empty; //表是否为空 int count; //记录表中元素个数 void init() { for(int i = 0; i < MAX_SIZE - 1; ++i) next[i] = i + 1; next[MAX_SIZE - 1] = -1; F = 0; L = -1; empty = true; count = 0; } int ALLOCATE_OBJECT() //只是分配空间,并不移动以及赋值 { if(F == -1) { cout << "out of space" << endl; return -1; } int new_index = F; F = next[F]; return new_index; } void FREE_OBJECT(int index) { next[index] = F; F = index; } void INSERT(int key) { int new_index = ALLOCATE_OBJECT(); if(new_index != -1) { data[new_index] = key; prev[new_index] = -1; //没有前一个元素 next[new_index] = L; //后一个元素是L所指位置 if(empty) //第一次插入 empty = false; else prev[L] = new_index; L = new_index; if(++count == MAX_SIZE) //表满则不能继续插入 F = -1; } } void DELETE(int index) { if(next[index] != -1) //修改下一个元素的前一个地址 prev[next[index]] = prev[index]; if(prev[index] != -1) //修改前一个元素的下一个地址 next[prev[index]] = next[index]; else L = next[index]; //删除第一个元素时需要修改L表 if(next[index] == -1 && prev[index] == -1) //最后一个元素被删除 empty = true; --count; FREE_OBJECT(index); } int SEARCH(int key) { int next_index = L; while(next_index != -1 && data[next_index] != key) next_index = next[next_index]; return next_index; } void PRINT() { int next_index = L; while(next_index != -1) { cout << data[next_index] << ' '; next_index = next[next_index]; } } void COMPACTIFY_LIST() { if(F == -1) //表满则无法移动,返回 return; int i = F; while(i != -1) //标记F中的prev指针 { prev[i] = -2; //特殊值 i = next[i]; } int left = 0, right = MAX_SIZE - 1; while(true) { while(prev[left] != -2) //寻找空区域 ++left; while(prev[right] == -2) --right; if(left >= right) break; prev[left] = prev[right]; data[left] = data[right]; next[left] = next[right]; next[right] = left; //标记移动到的地方 ++left; --right; } ++right; for(int j = 0; j < right; ++j) //更新L表 { if(prev[j] >= right) prev[j] = next[prev[j]]; if(next[j] >= right) next[j] = next[next[j]]; } if(L >= right) L = next[L]; //更新L for(int j = right; j < MAX_SIZE - 1; ++j) //更新F表 next[j] = j + 1; next[MAX_SIZE - 1] = -1; F = right; } int main() { init(); INSERT(5); PRINT(); cout << endl; int index = SEARCH(5); if(index != -1) DELETE(index); PRINT(); cout << endl; for(int i = 1; i < 10; ++i) INSERT(i); PRINT(); cout << endl; index = SEARCH(7); if(index != -1) DELETE(index); index = SEARCH(2); if(index != -1) DELETE(index); COMPACTIFY_LIST(); PRINT(); return 0; }
相关文章推荐
- Java学习日记-2.4 浮点数
- WEB端IIS服务器开发常识之HTTP状态码
- Xcode插件之Alcatraz的安装和遇到的问题
- html、css
- Oriented Object Proposals
- h.264转flv converter
- android 程序退出的对话框
- iOS 解决xib加载UITableViewCell的宽度不适应问题
- java中成员变量与局部变量区别分析
- 使用dwz-ria Jquery ui框架出现“HierarchyRequestError: Node cannot be inserted at the specified point in th
- Sencha Extjs4.2 皮肤制作
- LeetCode -- Subsets
- 线程与进程的概念、使用
- 详解JavaScript函数
- 华为oj之兄弟单词
- Codeigniter Helper辅助函数
- SearchFilterDialog 满屏设置记录
- Eclipse快捷键 10个最有用的快捷键
- 网页页面实现自动刷新的3种代码
- LeetCode -- String to Integer (atoi)