每日一题———22.定位双向链表的数据,并且记录访问频率,按访问频率排序

前言

数据结构每日一题

声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出

题目

给定一个头指针L为带头结点的非循环双向链表,并且节点内多了一个freq域(记录访问次数),按要求实现一个Locate(L,X)算法,实现定位查找X值,并且在找到X的时候freq+1,同时将链表中的结点保持访问次数递增排列

要点

  • 双链表的遍历
  • 双链表的结点插入
  • 双链表的结点提取

思想

  • 遍历整个双链表,找到元素值为X的结点,并且freq+1
  • 将该节点取下,遍历整个双链表寻找到小于该节点的freq的结点,将该节点插入
DLinklist Locate(DLinklist L,ElemType X){
	DNode *p=L->next,*q;
	//p非空,且值不为X的结点后移
	while(p!=NULL && p->data !=X){
		p=p->next;
		if(p ==NULL)	//遍历完也没有找到P
			printf("不存在值为X的结点");
		else{
			p->freq ++;
			//取下P结点
			if(p->next != NULL){
				p=p->next->prior=p->prior;
				p->prior->next=p->next;
			}
			//寻找到freq值小于取下的结点的freq,将p插入(q从后往前找)
			while(q != L && q->freq <= p->freq ){
				q=q->prior;
				p->next=q->next;
				q->next->prior=p;
				p->next=q;
				q->next=p;
			}
		}
	}
	return p;	//返回值为X的结点
}

中缀转后缀的方法

  1. 遇到操作数(a,b,c)的时候:直接输出,添加到后缀表达式中
  2. 栈为空的时候,遇到运算符直接输出
  3. 遇到左括号:将其入栈
  4. 遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出的元素是左括号(左括号不输出直接删除)
  5. 遇到其他运算符:加减乘除,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
    比较入栈元素和栈顶元素,只有优先级小于栈顶元素才入栈,其余都出栈
  6. 最终将栈的元素依次出栈输出
而塞过 2021-6-7
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值