用雜湊表加鍊錶實現動態malloc

2021-05-01 15:24:15 字數 3352 閱讀 4913

/

//標頭檔案

#include

#include

#define step 0    //可動態增加記憶體次數

#define maxmem 10000   //每次從系統獲取記憶體位元組數

#define hashsize 100   //雜湊表陣列大小

#define nodesize sizeof(node)  //鍊錶節點位元組數

typedef struct node node;

extern node *usedhashtable[hashsize]; //used雜湊表

extern node *freehashtable[hashsize]; //free雜湊表

void *mini_malloc(size_t size);  //申請記憶體

void mini_free(void *addr);  //釋放記憶體 /

//記憶體分配與釋放呼叫mini_malloc與mini_free

#include "mini_malloc.h"

int initflag = 0; //標識位,判斷是否初始化分配記憶體

int step = 0;  //當前動態申請增加記憶體次數

node *usedhashtable[hashsize] = ; //占用空間雜湊表

node *freehashtable[hashsize] = ; //空閒空間雜湊表

void insertmain(node **head, node **pnode, size_t fsize); //將新建記憶體塊插入到主煉表中

void insertfree(node **pnode); //將空閒空間以空間從小到大排序方式插入到free雜湊表相應項中

void pushused(node **pnode); //將占用空間插入到used雜湊表相應項最前面

void delfree(node **pnode); //將指定空間從free雜湊表中刪除

void delused(node **pnode); //將指定空間從used雜湊表中刪除

void delmain(node **pnode); //將指定空間從主煉表中刪除

int init_malloc();  //初始化分配記憶體,返回該記憶體對應free雜湊表的key

void *find_malloc(node *head, size_t size); //在指定的free雜湊表項中查詢滿足size大小的記憶體並返回相應的位址

int freehash(size_t size); //生成並返回free雜湊表key

int usedhash(void *addr); //生成並返回used雜湊表key

int freehash(size_t size)

int usedhash(void *addr)   

///初始化分配記憶體,返回該記憶體對應free雜湊表的key

int init_malloc()

///在指定的free雜湊表項中查詢滿足size大小的記憶體並返回相應的位址

void *find_malloc(node *head, size_t size)

return (void *)((char *)head + nodesize); //返回記憶體實際可用位址

}head = head->_free;

}return null;}

///申請記憶體

void *mini_malloc(size_t size)

if (initflag == 0)

void *t;

int key = freehash(size);  //獲取使用者需求記憶體所在free雜湊表中的key

while (1)

++key;  //當在相應free雜湊表項中未找到滿足需求的記憶體,則查詢下一項

}//當在free雜湊表中沒有找到滿足需求的記憶體,並且當前動態申請增加記憶體次數小於設定次數,則新開闢一塊記憶體

if (step < step)

else

}return null;}

///釋放記憶體

void mini_free(void *addr)

//如果當前記憶體上一記憶體也為空閒,則合併它

if (head->_prev != null && head->_prev->_state == '/0')

insertfree(&pnode);

return;

}head = head->_used;}}

///將新建記憶體塊插入到主煉表中

void insertmain(node **head, node **pnode, size_t fsize)

(*pnode)->_state = '/0';

(*pnode)->_size = fsize;

(*pnode)->_prev = *head;

(*pnode)->_next = null;

(*pnode)->_free = null;

(*pnode)->_used = null;

if ((*head)->_next != null)

(*head)->_next = *pnode;}

///將空閒空間以空間從小到大排序方式插入到free雜湊表相應項中

void insertfree(node **pnode)

node *prev = null;

while (head)

else

return;

}prev = head;

head = head->_free;

}prev->_free = *pnode;

(*pnode)->_free = null;}

///將占用空間插入到used雜湊表相應項最前面

void pushused(node **pnode)

else }

///將指定空間從free雜湊表中刪除

void delfree(node **pnode)

else

}else

else

}return;

}prev = head;

head = head->_free;}}

///將指定空間從used雜湊表中刪除

void delused(node **pnode)

else

}else

else

}return;

}prev = head;

head = head->_used;}}

///將指定空間從主煉表中刪除

void delmain(node **pnode)

else

}else }

動態雜湊表

動態雜湊表的基本操作 函式實現部分 void inithashbucket ht ht,intcapacity 初始化雜湊表 獲取容量 capacity getprime capacity ht table pnode malloc sizeof node capacity 雜湊表的初始化 for ...

鍊錶實現的雜湊表(Java版)

public class separatechaininghashtable suppresswarnings unchecked public separatechaininghashtable int size make the hash table logically empty public...

c 鍊錶(用類加模板)

話不多說,貼 才是王道 為了方便指標倒置加了一下小插曲 include include template 這是模板型別定義t class links p為已存在的節點p中的 forward是前乙個節點,也是方便倒置而設計的,建構函式初始化 void insert t p h next p p nex...