【数据结构】NOJ006 LOCATE操作

本文探讨数据结构中的双向循环链表,重点在于链表中节点的freq域和链表操作,如插入、访问及节点移动。在特定情况下,当两个节点的prec相同时,对于排序顺序的不确定性进行了分析,通过实例展示了两种可能的结果,并指出在实现LOCATE操作时,freq的比较条件可能是关键,第一种情况可得到正确答案(AC),而第二种情况得到部分正确(PE)的答案。
摘要由CSDN通过智能技术生成

数据结构:双向循环链表
存储结构:链式存储
选择链式存储原因:节点要用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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值