内存管理(链表,指针操作,繁琐)
来源:互联网 发布:淘宝网分析 编辑:程序博客网 时间:2024/05/22 11:45
这题本来以为不容易,觉得很容易会TLE,可后来发觉其实复杂度也不高,因为表项不超过100,所以可以放心地疯狂地遍历。。。
debug了很久,一堆小错误。。。
AC CODE(编得不好)
//Memory: 240 KBTime: 0 MS//Language: GNU C++Result: Accepted#include <iostream>#include <cstdio>#include <memory.h>using namespace std;struct Node{ int size; //记录这块内存空间的大小 bool used; //标记这块内存是否被占用 int idx; //这块内存的编号 int id; //占用这块内存区域的是编号为idx的进程 Node *next; Node *pre;}dum, m[300];char str[7];int i, s, T, k;int p[1001]; //两个功能:1.储存进程所在表项编号,2.q[i]为-1时表明进程不存在void Init(){ dum.pre = NULL; dum.size = 0; for(int j = 0; j < 300; j++) { m[j].pre = m[j].next = NULL; m[j].used = false; m[j].size = 0; m[j].idx = j; } m[0].size = 100; dum.next = &m[0]; m[0].pre = &dum; memset(p, -1, sizeof(p)); k = 1;}int main(){ Init(); scanf("%d",&T); while(1) { scanf("%s", str); //CREAT if(str[0] == 'C') { scanf("%d%d", &i, &s); int minsize = 101; //用大小为minsize的内存区域储存新进程 int minidx; //内存的编号 for(struct Node *h = dum.next; h != NULL; h = h ->next) { if(!h ->used && h ->size >= s && h ->size < minsize) { minsize = h ->size; minidx = h ->idx; } } if(minsize == 101) { puts("No enough memory!"); continue; } printf("Create process %d of size %d successfully!\n", i, s); m[minidx].used = true; m[minidx].id = i; if(minsize != s) //有多余空间时才创建空表项 { m[k].size = minsize - s; m[k].pre = &m[minidx]; m[k].next = m[minidx].next; m[minidx].next = &m[k]; k++; } m[minidx].size = s; p[i] = minidx; //记录编号为i的进程储存在哪一个内存区域 } //DELETE else if(str[0] == 'D') { scanf("%d", &i); if(p[i] < 0) { puts("No such process!"); continue; } int t = p[i]; //获取要删除的进程所在的内存编号 printf("Delete process %d of size %d successfully!\n", i, m[t].size); p[i] = -1; //重设为-1,表明这个进程已经被删除 m[t].used = false; //重新标记为未使用 if(!(m[t].pre ->used) && m[t].pre != &dum) //上一表项空闲,则合并 { m[t].size += m[t].pre ->size; m[t].pre ->size = 0; m[t].pre ->pre ->next = &m[t]; m[t].pre = m[t].pre ->pre; } if(m[t].next != NULL && !(m[t].next ->used)) //下一表项空闲,则合并 { m[t].size += m[t].next ->size; m[t].next ->size = 0; if(m[t].next ->next != NULL) m[t].next ->next ->pre = &m[t]; m[t].next = m[t].next ->next; } } else if(str[0] == 'P') { for(struct Node *h = dum.next; h != NULL; h = h ->next) { if(h ->used) printf("P %d %d\n", h ->id, h ->size); else printf("H %d\n", h ->size); } } else { T--; if(!T) break; Init(); } } return 0;}
- 内存管理(链表,指针操作,繁琐)
- 单个对象内存管理(野指针)
- 内存管理与指针
- 内存管理详解 指针
- 指针与内存管理
- 内存管理-智能指针
- 指针和内存管理
- 指针、引用、值。内存操作。(图)
- 内存操作 / 野指针
- 数据指针(内存操作)
- 指针操作动态内存
- 内存管理与指针学习
- c#内存管理和指针
- 内存管理与智能指针
- (十四)内存管理和指针
- C# 内存管理和指针
- Boost 内存管理----智能指针
- 内存管理 - 指针数组字符串
- mtk经验总结
- linux/win重置mysql的root密码
- 归并排序 白话经典(转载)
- tr
- Socket编程 一个小的聊天程序
- 内存管理(链表,指针操作,繁琐)
- shell正则表达式
- HDU 1003 Max Sum
- 从经理的角度看技术债务
- hibernate官方文档
- javascript正则表达式
- POJ 2400 KM算法 最小权匹配 回溯输出所有最优匹配方案
- jaxb学习和注解的详解
- sql中如何计算百分比