基于数据存储管理的带有头尾指针的双向链表创建实例

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.带有头尾指针的单链表与双向链表初始化的不同:见红色部分!!

一定要注意对只含头尾指针的结构体分配内存空间(红色部分)。

 

posted on 2013-11-03 17:13  fuleying  阅读(668)  评论(0编辑  收藏  举报