#include <iostream>
#include <map>
using namespace std;
struct data
{
int key;
struct data *pNext;
struct data *pPrev;
};
#define SIZE sizeof(struct data)
#define MAX 2
map<int, struct data *> g_map;
map<int, struct data *>::iterator g_iter;
struct data *gListHead = NULL;
struct data *gListTail = NULL;
void list_init()
{
gListHead = (struct data *)malloc(SIZE);
if (gListHead == NULL)
{
exit(0);
}
gListTail = (struct data *)malloc(SIZE);
if (gListTail == NULL)
{
free(gListHead);
exit(0);
}
gListHead->pNext = gListTail;
gListTail->pPrev = gListHead;
gListHead->pPrev = NULL;
gListTail->pNext = NULL;
}
int get(int key)
{
g_iter = g_map.find(key);
if (g_iter != g_map.end())
{
//将链表节点放到链表头
struct data *pTmp = g_iter->second;
struct data *pTmpNext = pTmp->pNext;
struct data *pTmpPrev = pTmp->pPrev;
pTmpNext->pPrev = pTmpPrev;
pTmpPrev->pNext = pTmpNext;
pTmp->pNext = gListHead->pNext;
gListHead->pNext->pPrev = pTmp;
gListHead->pNext = pTmp;
pTmp->pPrev = gListHead;
return key;
}
else
{
return -1;
}
}
int put(int key)
{
g_iter = g_map.find(key);
if (g_iter != g_map.end())
{
//将链表节点放到链表头
struct data *pTmp = g_iter->second;
struct data *pTmpNext = pTmp->pNext;
struct data *pTmpPrev = pTmp->pPrev;
pTmpNext->pPrev = pTmpPrev;
pTmpPrev->pNext = pTmpNext;
pTmp->pNext = gListHead->pNext;
gListHead->pNext->pPrev = pTmp;
gListHead->pNext = pTmp;
pTmp->pPrev = gListHead;
return 1;
}
else
{
if (g_map.size() < MAX)
{
//链表头增加key
struct data *pTmp = (struct data *)malloc(SIZE);
if (pTmp == NULL)
{
return -1;
}
pTmp->key = key;
pTmp->pNext = gListHead->pNext;
gListHead->pNext->pPrev = pTmp;
gListHead->pNext = pTmp;
pTmp->pPrev = gListHead;
g_map[key] = pTmp;
}
else
{
//直接删除链表尾key
struct data *pTmp = gListTail->pPrev;
if (pTmp == NULL)
{
return -1;
}
struct data *pTmpNext = pTmp->pNext;
struct data *pTmpPrev = pTmp->pPrev;
pTmpPrev->pNext = pTmpNext;
pTmpNext->pPrev = pTmpPrev;
g_map.erase(g_map.find(pTmp->key));
free(pTmp);
//链表头增加key
pTmp = (struct data *)malloc(SIZE);
if (pTmp == NULL)
{
return -1;
}
pTmp->key = key;
pTmp->pNext = gListHead->pNext;
gListHead->pNext->pPrev = pTmp;
gListHead->pNext = pTmp;
pTmp->pPrev = gListHead;
g_map[key] = pTmp;
}
return 1;
}
}
void list_print()
{
cout << "HEAD:";
struct data *ptmp = gListHead->pNext;
while (ptmp != gListTail)
{
cout << ptmp->key << " ";
ptmp = ptmp->pNext;
}
cout << endl;
cout << "TAIL:";
ptmp = gListTail->pPrev;
while (ptmp != gListHead)
{
cout << ptmp->key << " ";
ptmp = ptmp->pPrev;
}
cout << endl;
}
int main(int argc, char *argv[])
{
list_init();
g_map.clear();
cout << "----------------------" << endl;
put(1);
put(2);
cout << get(1) << endl;
put(3);
cout << get(2) << endl;
put(4);
cout << get(1) << endl;
cout << get(3) << endl;
cout << get(4) << endl;
put(5);
cout << get(3) << endl;
cout << "Hello World!" << endl;
return 0;
}
c++ map加双向链表实现lru算法,时间复杂度O(1)
最新推荐文章于 2022-05-12 19:51:06 发布