数据结构:双向循环链表
存储结构:链式存储
选择链式存储原因:节点要用freq域,用数组太麻烦
实现的操作:插入节点、访问节点、被访问节点需要往链表头移动
需要注意的地方:题中没有写清楚:当两个节点的prec相同时,该用什么顺序排列
比如下面这种情况:
假设用(val,freq)代表一个节点
假设原始链表为这样:
(头)→(1,2)→(2,1)→(3,0)→(4,0)
那么,访问了一次4后,节点4的freq从0变成了1,需要往前移动,移动之后的链表有下面两种可能性:
第一种(AC):(头)→(1,2)→ (2,1)→(4,1) →(3,0)
第二种(PE):(头)→(1,2)→ (4,1)→(2,1) →(3,0)
这就涉及到比较frec时,是<,还是<=的问题
根据本人测试,第一种是AC的,第二种是PE(我也不知道为啥不是WA?)
#include <iostream>
#include <stdlib.h>
#include <climits>
using namespace std;
typedef struct node
{
char val;
int freq;
struct node *pre;
struct node *next;
}*List;
int main()