#include <stdio.h>
#include <stdlib.h>
typedef struct DNode
{
char elem;
int freq;
struct DNode *pre, *next;
} DNode, *Doublelist;
void CreateFromTail(Doublelist head, int length); // 后插法建表
void LOCATE(Doublelist head, char Lelem); // 进行LOCATE操作
void Visit(Doublelist head, int num); // 对节点进行访问
int main()
{
Doublelist head, sign;
int length, num; // length是双链表的长度,num是访问节点的次数
head = (DNode *)malloc(sizeof(DNode));
scanf("%d %d", &length, &num);
CreateFromTail(head, length);
Visit(head, num);
sign = head; // sign用来遍历双链表
for (int i = 0; i < length; i++)
{
sign = sign->next;
printf("%c ", sign->elem);
}
return 0;
}
void CreateFromTail(Doublelist head, int length) // 后插法建表
{
DNode *end = head, *insert;
for (int i = 0; i < length; i++)
{
char Celem;
char c = getchar(); // 用c来清空缓冲区
scanf("%c", &Celem);
insert = (DNode *)malloc(sizeof(DNode));
insert->freq = 0; // 起始访问频率为0
insert->elem = Celem;
end->next = insert; // 进行双链表的连接
insert->pre = end;
end = insert;
}
end->next = head; // 尾节点与头结点进行连接
head->pre = end;
}
void LOCATE(Doublelist head, char Lelem) // 进行LOCATE操作
{
DNode *start = head->next;
while (start->elem != Lelem)
{
start = start->next; // 不是所访问的节点便询问下一个节点
}
start->freq++;
while (start->freq > start->pre->freq && start->pre != head)
{
DNode *prior = start->pre, *before = prior->pre, *after = start->next; // before为要换位的start节点的前第两个节点,after是start的后一个节点
after->pre = prior; // 进行交换
start->next = prior;
start->pre = before;
prior->next = after;
prior->pre = start;
before->next = start;
}
}
void Visit(Doublelist head, int num) 对节点进行访问
{
for (int i = 0; i < num; i++)
{
char Velem;
char c = getchar();
scanf("%c", &Velem);
LOCATE(head, Velem);
}
}