题目
description:
设有一个双向循环链表,每个结点中除有 pre,data 和 next 三个域外,还增设了一个访问频度域 freq。在链表被起用之前,频度域 freq 的值均初始化为零,而每当对链表进行一次 LOCATE(L,x)的操作后,被访问的结点(即元素值等于 x 的结点)中的频度域 freq 的值便增 1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序排列,以便始终保持被频繁访问的结点总是靠近表头结点。试编写符合上述要求的LOCATE 操作的程序。
input:
第一行输入双向循环链表的节点数 m 和被访问的节点数 n,
第二行输入双向循环链表各节点的值,
第三行依次输入被访问的节点。
output:
输出符合上述要求的双向循环链表。
输出经过 n 次 LOCATE 后的链表。
sample_input:
7 1
a b c d e f g
d
sample_output:
d a b c e f g
思路
-
建表
输入字符,创建双向循环链表。注意双向循环链表的next和pre的指向,由于是双向,故最后一个结点的next指针要指向头节点 -
LOCATE操作
简单来说,就是输入n个字符,将其存储在数组中,然后遍历链表,按数组中的字符顺序,将链表中对应的结点依次提到头节点之后,并且该节点的freq+1,最后得到的链表符合要求“使其按访问频度非递增的次序排列,以便始终保持被频繁访问的结点总是靠近表头结点” -
getchar()
这是我在本次代码设计中遇到的最大的坑,因为元素类型是char,在使用getchar()输入结点数值时候的空格和回车也会被读取,故需要在输入前后各使用一个getchar()吸收字符串前后的回车和中间的空格,才可以正确输入
代码
#include <stdio.h>
#include <stdlib.h>
typedef struct DLNode {
char data;
int freq = 0;
struct DLNode *pre;
struct DLNode *next;
} DLNode;
DLNode *createDLNode(