|
#include <stdio.h>
#define OK 1
#define ERROR 0
#define NULL 0
#define FootLoc(p) p+p->size-1
typedef struct word
{
union
{
word *llink;
word *uplink;
};
int tag;
int size;
word *rlink;
}word,head,foot,*space;
space allocboundtag(word *L,space *pav,int n,int e)
{//
word *p;
word *f;
char c[10];
for(p=*pav;p&&p->size<n&&p->rlink!=*pav;p=p->rlink)//查找不小于n的空闲块
if(!p||p->size<n) return NULL;//找不到,返回空指针
else
{//P指向找到的空闲块
f=FootLoc(p);//指向底部
*pav=p->rlink;//pav指向*p结点的后继结点
if(p->size-n<=e)
{//整块分配,不保留<=e的量
if(*pav==p) pav=NULL;//可利用空间为空表
else
{//在表中删除分配的结点
pav->llink=p->llink;
p->llink->rlink=*pav;
}
p->tag=f->tag=1;//修改分配结点的头部和底部标志
}
else
{//分配该块的后n个字
f->tag=1;//修改分配块的底部标志
p->size-=n;//置块大小
f=FootLoc(p);//指向块底部
f->tag=0; f->uplink=p;//设置块底部
p=f+1;//指向分配块头部
p->tag=1; p->size=n;//设置分配块头部
}
return p;//返回分配块首地址
}
}
void free(word *L,space *pav,int n)
{
word *p;
word *q;
word *f;
p->tag=0;
f->uplink=p;
f->tag=0;
if(!pav) *pav=p->llink=p->rlink=p;
else
{
q=pav->llink;
p->rlink=*pav;
p->llink=q;
q->rlink=pav->llink=p;
*pav=p;
}
}
这个程序有什么问题呢? |
|