/**
算法思想:1.从头至尾遍历双链表,找到data值为x的节点
2.将此节点频度加一,将此节点在链表中删除
3.从右至左找到第一个频度比他大的节点,插入到此节点后面
**/
typedef struct DLNode
{
int data;
int freq;
struct DLNode *prior;
struct DLNode *next;
}DLNode;
void locate( DLNode *l,int x)
{
DLNode *p,*q;
p=l->next;//l即为头结点
while(p!=l)
{
if(p->data == x)
{
q=p;//p指针暂存查找到的这个节点
q->freq = q->freq+1;//访问频度加一
//先将q在原位置删除,因为我们要从后往前找到插入点,
//必须先删除,避免他位置不变,重复插入的情况
q->prior->next=q->next;
q->next->prior=q->prior;
//从这个点开始,向表头方向查找q的插入点
while(p!=l)
{
if(q->freq<p->freq)//从右至左找到第一个比q的频度大的结点
{
//将q插入到此位置的后面
q->next = p->next;
p->next->prior=q;
p->next=q;
q->prior=p;
}
p=p->prior;//p指针前移
}
}
p=p->next;
}
}