06 LOCATE 操作(严 2.38)

这篇博客介绍了一种双向循环链表,其中每个节点包含访问频度域freq。LOCATE操作在访问节点x后会增加其freq并按访问频度重新排序链表。博主分享了实现LOCATE操作的思路和代码,特别提到了在处理char类型输入时getchar()函数的注意事项。
摘要由CSDN通过智能技术生成

题目

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(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值