/**
* 用链表实现 王道P41 T20
*
* ①算法思想:
* 首先找到相关节点,令其 freq++;
* 如果这个的前面是头节点,或者他的 freq 小于前面节点的 freq,则不需要改变位置;
* 如果不是上面两种情况,
* 那么就要设置一个q,从此节点的前面一个开始和此节点的freq比较并向前移动,
* 找到合适的位置后,将节点摘下并插入到合适的位置中去。
*
* ②数据结构:
* typedef struct DNode{
int data;
int freq;
struct DNode *next,*pre;
}DNode,*DLinkList;
*
* ③算法设计
*/
#include <stdio.h>
#include <iostream>
typedef struct DNode{
int data;
int freq;
struct DNode *next,*pre;
}DNode,*DLinkList;
DLinkList Locate(DLinkList &L,int x){
DLinkList p = L -> next;
while(p -> data != x){
p = p -> next;
}
//找到了 p -> data == x;
p -> freq++;
if(p -> pre == L || p -> pre -> freq > p -> freq)
return p;
//先将p摘下
if(p -> next != NULL)
p -> next -> pre = p -> pre;//注意这边if后面没有{},是因为如果p -> next == NULL.就不执行这一句了
p -> pre -> next = p -> next;//但是这一句一定会执行的
//开始寻找合适的位置
DLinkList q = p -> pre;//从p的前一个位置开始向前遍历就好了
while(q -> freq <= p -> freq){
q = q -> pre;
}
//找到位置了,把之前摘下来的p插进去
p -> next = q -> next;
q -> next -> pre = p;
p -> pre = q;
q -> next = p;
return p;
}
07-12
133
07-12
132
07-12
59
08-29
485
12-15
925