双向链表习题(牛客网习题)

【说明】设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向先驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0.每当在链表上进行一次L.Locate(x)操纵时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
【函数】

void Locate(int &x)
{
    *p=first->next;
    while(p!=first && 【p->data!=x】)
        p=p->next;

    if(p!=first)
    {
        【p->freq++】;
        *current=p;
        current->prior->next=current->next;
        current->next->prior=current->prior;
        p=current->prior;
        while(p!=first && 【current->freq>p->freq】)
            p=p->prior;

        current->next=【p->next】;
        current->prior=p;
        p->next->prior=current;
        p->next=【current】;
    }
    else
    {
        printf("Sorry.Not find!\n");
    }
}

【】表示需要填写的代码
来源:

http://www.nowcoder.com/questionTerminal/46d13cc15bde4b948c562c9bef88d7d6?toCommentId=152258

你可能感兴趣的:(数据结构)