1.基于LRU算法的带有头尾指针的双向链表的数据结构
typedef struct LRUEle //LRU链表结点 { LRUEle(); int fid; //帧号 double b2dtime; //最后两次使用的时间间隔 struct LRUEle * next; //后指针 struct LRUEle * prior; //前指针 }Link; struct LRULinkList //LRU链表 { Link *head; //头指针 Link *tail; //尾指针 };
2.建立一个带有头结点的空双向链表
LRULinkList *lruList;
//初始化一个带有头结点的空LRU双向链表 Link * head=new LRUEle(); head->next = head; head->prior = head; Link * tail = head; lruList=(LRULinkList *)malloc(sizeof(LRULinkList)); lruList->head=head; lruList->tail=tail;
3.错误的实现方法
// Link * head=new LRUEle(); // Link * tail=new LRUEle(); 初始化时头尾指针已同一个结点,不应分配两个不同的内存空间 // head->next=tail; 这样的实现,相当于建立了两个空的头结点;对于插入、删除没有一点好处,而且浪费内存空间 // tail->next=head; // head->prior=tail; // tail->prior=head;
4.带有头尾指针的单链表的数据结构
typedef struct LNode {//结点类型 ElemType data; struct LNode * next; } Link, * Position; typedef struct {//链表类型 Link * head; Link * tail; } LinkList;
5.带有头尾指针的单链表的初始化
LinkList * l = (LinkList *)malloc(sizeof(LinkList)); l->head = (Link *)malloc(sizeof(Link)); l->tail = (Link *)malloc(sizeof(Link)); if(!l->head || !l->tail) exit(OVERFLOW); l->head = l->tail; l->tail->next = NULL; return OK;
6.带有头尾指针的单链表与双向链表初始化的不同:见红色部分!!
一定要注意对只含头尾指针的结构体分配内存空间(红色部分)。