亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? memory.c

?? 用鏈表實現的內存管理
?? C
字號:
/*================================================================================
 * 內存管理實驗程序之雙向鏈表實現完成版V3.0
 * VitulMemoryManagement.c
 * 原理:
 *		把一個數組模擬為內存,然后針對該塊內存實現內存的分配和回收算法
 * 作者:Sunner Sun&&Mark
 * 最后修改時間:2005-4-3 20:00
 * 本程序已在GNU gdb 5.1.1 (mingw experimental)環境下測試通過
 ===============================================================================*/
#include <stdio.h>

#define MEM_SIZE 80
#define ALLOCATED 1
#define FREE 0

char memory[MEM_SIZE];//內存
typedef struct NODE
{
 int status;
 int size;
 int startid;
 struct NODE * next;
 struct NODE * prev;
};
/*雙向鏈表,記錄各塊的信息,依次分別對應:
1:狀態(空閑?占用);2:大小;3:開始標記(數組的下標);
4:指向后繼的指針;5: 指向前驅的指針                    */

struct NODE * Header;

struct NODE *   AllocateNode (    void        );
void*           GetBlock    (unsigned int size);
int             FreeBlock   (  void*	pBlock);
int             IsFree      (   int		  unit);
void            Initlizer   (void			  );
void			PrintBlockLinks();

/**************************************************************************
 *Function name:Initlizer               							      *
 *Return Type:  void                									  *
 *Definations:															  *
 * initializtion the link table ,it includes only one block-the total     *
 *************************************************************************/
void Initlizer()
{
    Header=(struct NODE *)malloc(sizeof(Header));
    if(Header)
    {
        Header->status=FREE;
        Header->size=MEM_SIZE;
        Header->startid=0;
        Header->next=NULL;
        Header->prev=NULL;
    }
    else 
    {
        printf("A fatal error occur at Initlizer ,Code:%d Can't Create Node",Header);
        exit(0);
    }
}
/**************************************************************************
 *Function name:AllcateNode             								*
 *Return Type:  Pionter                 								*
 *Definations:   Allcate a new Node               						*
 **************************************************************************/
struct NODE * AllocateNode(void)
{
    struct NODE * lp;
    lp =(struct NODE *)malloc(sizeof(lp));
    if(lp)
    {
        lp->status=FREE;
        lp->size=0;
        lp->next=NULL;
        lp->prev=NULL;
        lp->startid=0;
        lp->next=NULL;
        lp->prev=NULL;

        return lp;
    }
    else 
        return NULL;
}
/**************************************************************************
 *Function name:PrintBlockLinks            								*
 *Return Type:  void				           							*
 *Definations:  print block list while debug							*
**************************************************************************/
void PrintBlockLinks()
{
	struct NODE * p;
	int count=-1;
	p=Header;
	printf("In Link table\n");
	while(1)
	{
		if(p==NULL)
			break;
		if(count!=-1)
		printf("%d:%dAdrress:%ld\n",count,p->size,&memory[p->startid]);
		count++;
		if(p->next==NULL)
			break;
		p=p->next;
	}
}
/**************************************************************************
 *Function name:GetBlock                								*
 *Return Type:  Adrress Pionter             							*
 *Definations:                  										*
 *  在數組memory的分配size大小的內存塊,把首地址返回。      			*
 *  如果分配失敗,返回NULL              								*
**************************************************************************/

void* GetBlock(unsigned int size)
{
   struct NODE * slp,* lp,* newlink;
   int count=0;
   slp=Header;
   while(1)
   {
	count++;
    if(slp==Header)
    {
        if(slp->next!=NULL)
    	{
            slp=slp->next;
		            continue;
        }/*如果節點為頭節點且有后繼,則轉到第一個節點,繼續查詢*/
        else
    	{
            lp=AllocateNode();
            lp->status=ALLOCATED;
            lp->startid=0;
            lp->prev=slp;
            slp->next=lp;
            lp->size=size;

            newlink=AllocateNode();
			lp->next=newlink;
            newlink->status=FREE;
            newlink->prev=lp;
            newlink->next=NULL;
			newlink->startid=(lp->size);
            newlink->size=(slp->size)-(lp->size);
            return &memory[lp->startid];


        }/*列表為空,申請新建節點,鏈接*/
    }
    /* 若該塊已被申請*/
    if(slp->status==ALLOCATED)
    {
        if(slp->next==NULL)
		{
			 /*若已到列表結尾,無法申請則返回0*/
			return 0;
		}
       
        slp=slp->next;
		printf("continue 131");
        continue;
    }
    else
	if(slp->status==FREE)
    {
        if(size==slp->size)
		{
			slp->status=ALLOCATED;
            return &memory[slp->startid];
		}
		if(size>(slp->size))
    	{
            if((slp->next)==NULL)
			{ /*若已到列表結尾,無法申請則返回0*/
				return 0;
			}
				slp=slp->next;
            continue;
    		
    	}
        if(size<(slp->size))
    	{
            newlink=AllocateNode();
            slp->status=ALLOCATED;			
            newlink->size    =( slp->size)	- size;
            newlink->startid =(slp->startid)+ size;
            newlink->prev    = slp;
            newlink->next    = slp->next;
            slp->next        = newlink;
			slp->size		 =size;
            
			return &memory[slp->startid];
    		
    	}
    }

   }
   printf("Fatal Error");
    return 0;
}
/**************************************************************************
 *Function name:FreeBlock               								 *
 *Return Type:  int                 									 *
 *Definations:                  										 *
 * 釋放首地址為pBlock的內存塊。             							 *
   成功返回非0值,失敗返回0                 							 *
**************************************************************************/
int FreeBlock(void* pBlock)
{  
    struct NODE * lp,* lpprev,* lpnext;
    lp=Header->next;
    if(lp==NULL)
        return 0;
    /* 列表還未曾創建,無法釋放*/
    while(1)
    {
		if((&memory[lp->startid])==pBlock)
			break;
        if(lp->next==NULL)
            return 0;
        lp=lp->next;
    }
    if(lp->status==FREE)
        return 0;
	/*找到首地址對應的塊*/
	
    else
    {
        /*標記為空閑*/
		lp->status=FREE;
        lpprev=lp->prev;
        lpnext=lp->next;
        if(lpprev->status==FREE)
    	{
            if(lpprev->prev!=NULL)/*前驅不是頭節點*/
    		{
                lp->startid=lpprev->startid;
				lp->size=lpprev->size+lp->size;
                if(lpprev->prev!=NULL)
				{
					lp->prev=lpprev->prev;
                    lpprev->prev->next=lp;

				}
				free(*lpprev);			
    		}
                /* 合并,釋放*/

    	}
		else 
			if((lpnext!=NULL)&&(lpnext->status==FREE))
			{
                	lp->size=lp->size+lpnext->size;	
					lp->next=lpnext->next;
					if(lpnext->next!=NULL)
						lpnext->next->prev=lp;
					free(*lpnext);    		
				/* 合并,釋放*/	
    		}
        return !0;
    }
	printf("Unkown Error!\n");
    return 0;
}
/***************************************************************************
*Function name: IsFree                      					          *
*Return Type:   int                 									  *
*Definations:                   										  *
* 判斷數組memory中下標為unit的單元是否被占用。          				  *
*  空閑返回非0,否則返回0               								  *
***************************************************************************/

int IsFree(int unit)
{
    struct NODE * lp;
    lp=Header;
    if(lp->next==NULL)
        return !0;
    lp=lp->next;
    while(1)
    {
        if((lp->startid)<=unit)
        {   if(((lp->startid+lp->size)-1)>=unit)
    		{
                if(lp->status==ALLOCATED)
                	return 0;
                return !0;
    		}
        	else
    		{
				if(lp->next==NULL)
                return 0;
                lp=lp->next;
            	continue;
    		}
    	}
        else
    	{
            if(lp->next==NULL)
                return 0;
    	}
    }
   
}


/************************************************
 * 下面為測試代碼,不需要修改,也不許使用其定義 *
 * 的各種變量、宏、結構等                       *
 ************************************************/

#define MAX_BLOCK_SIZE  16
#define BLOCK_COUNT     80
struct BLOCK
{
    void* p;
    int size;
};

void PrintMemoryUsage(void);
int New(struct BLOCK *pBlocks);
int Delete(struct BLOCK *pBlocks);
void ShowBlock(struct BLOCK *pBlocks);

int main(void)
{
    struct BLOCK blocks[BLOCK_COUNT] = {0,0};
    int ch = 0;
    int rtn = 1;
    int i;
    Initlizer();
    do
    {
        switch (ch)
        {
        case 'n':
            rtn = New(blocks);
            break;
        case 'd':
            rtn = Delete(blocks);
            break;
		
        case '\n':
            continue;

            break;
        }
        if (!rtn)
            printf("\nError!!!!\n");
        PrintMemoryUsage();
		//ShowBlock(blocks);
		//PrintBlockLinks();
        printf("Input \'n\' to new, \'d\' to delete and \'q\' to quit:");

    } while ((ch=getchar()) != 'q');

    /* 刪除所有已申請的block */
    for (i=0; i<BLOCK_COUNT; i++)
    {
        if (blocks[i].p != NULL)
        {
            FreeBlock(blocks[i].p);
        }
    }
    
    return 0;
}
/***************************************************************************
*Function name: ShowBlock                    					          *
*Return Type:   int                 									  *
*Definations:    打印當前的分塊情況               										  *
***************************************************************************/
void ShowBlock(struct BLOCK *pBlocks)
{
	int i;
	for (i=0; i<BLOCK_COUNT; i++)
	{
		if (pBlocks[i].p != NULL)
		{
			printf("%d: %d :Adrress:%ld\n", i, pBlocks[i].size,pBlocks[i].p);
		}
	}
}
/***************************************************************************
*Function name: PrintMemoryUsag                    					      *
*Return Type:   int                 									  *
*Definations:打印memory分配情況    										  *
***************************************************************************/
void PrintMemoryUsage(void)
{
    int i;

    putchar('\n');
    
    for (i=0; i<MEM_SIZE; i++)
    {
        if (i%10 == 0)
            putchar('|');
        else
            putchar(' ');
    }
    
    putchar('\n');

    for (i=0; i<MEM_SIZE; i++)
    {
        if (IsFree(i))
            putchar('-');
        else
            putchar('*');
    }
    putchar('\n');
                    
}

/***************************************************************************
*Function name: New                             					      *
*Return Type:   int                 									  *
*Definations: 新申請block  												  *
***************************************************************************/

int New(struct BLOCK *pBlocks)
{
    int size = 0;

    while (size < 1 || size > MAX_BLOCK_SIZE)
    {
        printf("Size?[1-%d]", MAX_BLOCK_SIZE);
        scanf("%d", &size);
    }

    while (pBlocks->p != NULL)
        pBlocks++;

    pBlocks->p = GetBlock(size);
    pBlocks->size = size;

    return (pBlocks->p != NULL);
}
/***************************************************************************
*Function name: Delete                            					      *
*Return Type:   int                 									  *
*Definations: 刪除已經申請的block 										  *
***************************************************************************/
int Delete(struct BLOCK *pBlocks)
{
    int i;

    for (i=0; i<BLOCK_COUNT; i++)
    {
        if (pBlocks[i].p != NULL)
        {
            printf("%d:%d\t", i, pBlocks[i].size);
        }
    }
    printf("\nWhich to delete:");
    scanf("%d", &i);
    if (FreeBlock(pBlocks[i].p))
    {
        pBlocks[i].p = NULL;
        return !0;
    }
    else
        return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人你懂的| 精品乱人伦一区二区三区| 亚洲欧洲av另类| 成人动漫av在线| 国产精品午夜久久| 色综合一区二区三区| 伊人色综合久久天天| 欧美日韩一区在线| 韩国精品主播一区二区在线观看 | 午夜精品久久久久久| 在线成人av影院| 激情图片小说一区| 国产欧美一区二区精品性| 91偷拍与自偷拍精品| 天堂蜜桃一区二区三区 | 久久婷婷综合激情| 波多野结衣中文字幕一区二区三区| 亚洲欧美日韩一区二区三区在线观看| 91福利国产成人精品照片| 人人狠狠综合久久亚洲| 国产欧美精品国产国产专区| 在线精品国精品国产尤物884a| 日日噜噜夜夜狠狠视频欧美人| 26uuu国产日韩综合| 91热门视频在线观看| 青青草精品视频| 国产精品久久久久久久蜜臀| 欧美日韩三级在线| 成人一区二区在线观看| 亚洲动漫第一页| 国产偷国产偷精品高清尤物 | 爽好多水快深点欧美视频| 久久综合狠狠综合久久综合88| 91在线porny国产在线看| 麻豆免费精品视频| 亚洲欧美日韩电影| 精品国产1区二区| 欧美日韩中文另类| 成人黄色综合网站| 强制捆绑调教一区二区| 亚洲精品乱码久久久久久黑人 | 欧美日韩亚洲不卡| 国产999精品久久久久久| 日韩高清中文字幕一区| 综合在线观看色| 久久久久久免费网| 777奇米成人网| 色婷婷久久99综合精品jk白丝| 韩国一区二区在线观看| 午夜精品一区二区三区三上悠亚| 欧美国产成人精品| 欧美变态tickling挠脚心| 日本道精品一区二区三区| 成人性生交大合| 精品一二三四在线| 男女激情视频一区| 亚洲一级在线观看| 亚洲美女少妇撒尿| 国产精品福利电影一区二区三区四区| 亚洲精品一线二线三线| 欧美精品三级日韩久久| 欧美唯美清纯偷拍| 在线观看一区二区视频| 91网页版在线| 色综合久久88色综合天天免费| 国产精品资源在线观看| 国产一区美女在线| 国精产品一区一区三区mba桃花 | 樱桃视频在线观看一区| 国产精品久99| 国产精品美女久久久久久久久久久| 2021国产精品久久精品| 欧美xingq一区二区| 欧美va亚洲va香蕉在线| 久久综合国产精品| 久久久亚洲高清| 久久精品亚洲精品国产欧美kt∨| 欧美草草影院在线视频| 精品国产凹凸成av人网站| 精品国产乱码久久久久久1区2区| 日韩欧美一级片| 精品福利视频一区二区三区| 久久这里只有精品6| 久久精品一区八戒影视| 国产精品三级视频| 亚洲免费伊人电影| 一区二区三区高清不卡| 午夜精品久久久久久| 日韩av一二三| 久久精品国产网站| 国产精品一二三在| 97久久精品人人做人人爽50路| 91网址在线看| 欧美精品乱码久久久久久按摩| 91精品国产麻豆| 久久精品一区二区| 亚洲三级理论片| 日韩精品91亚洲二区在线观看| 久久精工是国产品牌吗| 国产成人精品免费一区二区| 99久久久国产精品免费蜜臀| 91官网在线观看| 日韩精品一区二区三区视频| 日本一区免费视频| 亚洲综合一区在线| 免费观看在线综合| 白白色 亚洲乱淫| 欧美色图片你懂的| 亚洲精品在线观看视频| 亚洲人成网站在线| 久88久久88久久久| 91丨九色丨黑人外教| 777午夜精品免费视频| 国产亚洲午夜高清国产拍精品 | 欧美日韩国产三级| 久久久国产午夜精品| 亚洲另类一区二区| 久草中文综合在线| 在线视频国内一区二区| 精品国产露脸精彩对白| 尤物在线观看一区| 国产伦精品一区二区三区视频青涩 | www.欧美.com| 制服.丝袜.亚洲.中文.综合| 欧美经典三级视频一区二区三区| 亚洲综合成人在线| 国产老肥熟一区二区三区| 在线亚洲免费视频| 国产调教视频一区| 天天色综合天天| 成人午夜在线免费| 日韩女优av电影在线观看| 亚洲猫色日本管| 国产精品一区二区在线看| 91精品婷婷国产综合久久竹菊| 国产精品国产精品国产专区不蜜 | 极品销魂美女一区二区三区| 99精品视频免费在线观看| 精品免费一区二区三区| 亚洲国产欧美一区二区三区丁香婷| 国产成人av福利| 欧美一区二区三区免费视频| 一区二区三区**美女毛片| 国产精品夜夜爽| 精品欧美久久久| 日韩av中文字幕一区二区| 欧美色电影在线| 亚洲三级在线播放| av一区二区三区在线| 久久久99久久精品欧美| 久久99深爱久久99精品| 欧美日韩dvd在线观看| 夜夜嗨av一区二区三区| www.av亚洲| 国产精品视频九色porn| 国产99久久久精品| 国产喂奶挤奶一区二区三区| 国产在线精品免费| 精品成人在线观看| 老司机免费视频一区二区| 欧美高清视频www夜色资源网| 亚洲自拍与偷拍| 日本大香伊一区二区三区| 一级特黄大欧美久久久| 色婷婷久久99综合精品jk白丝| 亚洲欧美福利一区二区| 91蝌蚪porny九色| 日韩理论在线观看| 91蜜桃免费观看视频| 亚洲欧美日韩中文播放| 色综合久久88色综合天天免费| 亚洲欧洲另类国产综合| 91蜜桃传媒精品久久久一区二区| 国产精品丝袜一区| 99久久99久久精品国产片果冻| 国产精品动漫网站| 色成年激情久久综合| 亚洲夂夂婷婷色拍ww47| 欧美群妇大交群的观看方式| 奇米色一区二区三区四区| 亚洲精品在线观| 成人免费观看av| 一区二区在线观看视频| 欧美日韩高清一区二区三区| 日韩精品电影一区亚洲| 久久久久免费观看| 92国产精品观看| 丝袜亚洲另类欧美综合| 亚洲精品一区二区三区福利 | 美国毛片一区二区| 久久久不卡网国产精品一区| 成人性色生活片| 亚洲电影欧美电影有声小说| 日韩欧美高清dvd碟片| 国产精品亚洲午夜一区二区三区| 中文字幕一区二区三区精华液 | 日韩一区二区三| 国产成人aaa| 亚洲成av人影院在线观看网| 精品黑人一区二区三区久久|