C语言实现动态分区分配
2020-02-03 04:14
831 查看
C语言实现动态分区分配
代码重复度还是很高的,存在简化的空间。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<conio.h> #include<string.h> #include<stdlib.h> #define LEN sizeof(Qu) int m = 0; typedef struct fenqu { int num; //分区序号 long begin; //起始地址 long size; //分区大小 int status; //分区状态 struct fenqu* next; }Qu; Qu* tin = NULL;//悬停指针 Qu* creat()//初始化 { Qu* p1; Qu* h = NULL; h = (Qu*)malloc(LEN); if (h) { p1 = (Qu*)malloc(LEN); if (p1) { printf("用户空闲分区:"); scanf_s("%d", &p1->size); p1->num = m++; p1->status = 0; p1->begin = 30; h->next = p1; p1->next = NULL; return h; } } } Qu* cr() {//分配内存 Qu* h, * n, * u; h = n = u = NULL; n = h = (Qu*)malloc(LEN); if (h) { printf("分配大小:"); scanf_s("%d", &h->size); h->num = m++; h->status = 1; h->begin = 0; h->next = NULL; return h; } } void xs(Qu* h) {//显示 Qu* tou = h->next; printf("区号\t起始地址 大小\t状态(0为空闲)\n"); while (tou) { printf("%d\t%d\t %d\t%d\n", tou->num, tou->begin, tou->size, tou->status); tou = tou->next; } } void Sort1(Qu* l) { //采用头插法 Qu* p = l->next, * pre; Qu* r = p->next; p->next = NULL; p = r; while (p != NULL) { r = p->next; pre = l; while (pre->next != NULL && pre->next->size < p->size) { pre = pre->next; } p->next = pre->next; pre->next = p; p = r; } } void Sort2(Qu* l) { //采用头插法 Qu* p = l->next, * pre; Qu* r = p->next; p->next = NULL; p = r; while (p != NULL) { r = p->next; pre = l; while (pre->next != NULL && pre->next->size > p->size) { pre = pre->next; } p->next = pre->next; pre->next = p; p = r; } } Qu* shouci(Qu* h, Qu* x) {//首次算法 Qu* p, * n; //* u; n = h; p = h->next; int kk = 0; while (p) { if (p->size > x->size && p->status == 0) { x->begin = p->begin; p->begin = x->begin + x->size; p->size = p->size - x->size; n->next = x; x->next = p; kk = 1; return p; break; } if (p->size = x->size && p->status == 0) {//刚好相等不用划分 p->status = 1; free(x); kk = 1; return p; break; } n = p; p = p->next; } if (kk == 0)printf("没有足够空间!\n"); } Qu* xhshouc(Qu* tou, Qu* h, Qu* x) {//循环首次 Qu* p, * n, * u; int ll = 0; u = tou; n = tou->next; while (n) { if (n == h) { break; } u = n; n = n->next; } p = h; int kk = 0; while (p) { if (p->size > x->size&& p->status == 0) { x->begin = p->begin; p->begin = x->begin + x->size; p->size = p->size - x->size; u->next = x; x->next = p; kk = 1; return p; break; } if (p->size = x->size && p->status == 0) { p->status = 1; free(x); kk = 1; return p; break; } p = p->next; ll++; if (p == NULL)p = tou; if (ll > m)break; } if (kk == 0)printf("没有足够空间!\n"); } Qu* zuijia(Qu* h, Qu* x) {//最佳 Sort1(h); Qu* p, * n; p = h->next; n = h; int kk = 0; while (p) { if (p->size > x->size&& p->status == 0) { x->begin = p->begin; p->begin = x->begin + x->size; p->size = p->size - x->size; n->next = x; x->next = p; kk = 1; return p; break; } if (p->size = x->size&& p->status == 0) { p->status = 1; free(x); kk = 1; return p; break; } n = p; p = p->next; } if (kk == 0)printf("没有足够空间!\n"); } Qu* zuicha(Qu* h, Qu* x) {//最差 Sort2(h); Qu* p, * n; p = h->next; n = h; int kk = 0; while (p) { if (p->size > x->size&& p->status == 0) { x->begin = p->begin; p->begin = x->begin + x->size; p->size = p->size - x->size; n->next = x; x->next = p; kk = 1; return p; break; } if (p->size = x->size && p->status == 0) { p->status = 1; free(x); kk = 1; return p; break; } n = p; p = p->next; } if (kk == 0)printf("没有足够空间!\n"); } void huishou(Qu *h) {//回收1 Qu* p = h->next; Qu* n, * u; n = h; int a; int kk = 0; printf("要回收的区号:"); scanf_s("%d",&a); while (p) { if (p->num == a) { //n->next = p->next; //free(p); //m--; p->status = 0; kk = 1; break; } n = p; p = p->next; } if (kk == 0)printf("找不到该分区!\n"); } void hs(Qu* h) {//回收2 Qu* p = h->next; Qu* n, * u; n = h; while (p) { if (p->next) { if (p->status == 0 && p->next->status == 0) { p->next->begin = p->begin; p->next->size = p->next->size + p->size; p->next->num = p->num; n->next = p->next; free(p); p = n; } } n = p; p = p->next; } } void ff(Qu* h, Qu* x) {//方法 Qu* head = h; int xuanze; int kk = 1; while (1) { printf("1.首\t2.循环首 3.最佳\t4.最差\n"); scanf_s("%d", &xuanze); switch (xuanze) { case 1: tin = shouci(head, x); break; case 2: if (tin) { xhshouc(head, tin, x); } else { tin = shouci(head, x); } break; case 3: tin=zuijia(head, x); break; case 4: tin = zuicha(head, x); break; default: printf("重新选择!\n"); kk = 0; break; } if (kk == 1)break; } } void main() { Qu* n, * u, * x; Qu* head = NULL; int xuanze = 0; n = u = x = NULL; head = creat(); while (1) { printf("1.分配内存\t2.回收内存\t0.退出\n"); scanf_s("%d", &xuanze); if (xuanze == 0)break; switch (xuanze) { case 1: x = cr(); ff(head, x); break; case 2: huishou(head); hs(head); break; case 3: xs(head); break; default: printf("重新选择!\n"); xs(head); break; } xs(head); } }```
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- C语言数据结构之动态分配实现串
- 动态分配的顺序线性表的十五种操作—C语言实现
- C语言实现用程序数据段空间模拟内存的动态分配
- 模拟实现c语言中的动态内存分配malloc函数
- 【算法】C语言实现数组的动态分配
- 纯c语言实现动态分配多维数组的方法
- C语言中实现动态分配二维数组
- 【算法】C语言实现数组的动态分配
- 动态分配的顺序线性表的十五种操作—C语言实现
- 学习笔记——线性表的动态分配顺序存储结构基本操作(C语言实现)
- 动态分配的顺序线性表的十五种操作—C语言实现
- 链表的C语言实现之动态内存分配(转载)
- 在C语言中实现动态分配二维数组
- 用C语言分配动态二维数组(结构体实现)
- 在C语言中实现动态分配二维数组【转自iTango】
- 链表的C语言实现(含动态内存分配)
- 在C语言中实现动态分配二维数组
- C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存
- 链表的C语言实现(含动态内存分配)
- 链表的C语言实现(含动态内存分配)