2.实现下述要求的Locate运算的函数

问题描述

设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate (L, x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面(如果该结点没有找到与它访问频度相等的结点,链接到表头后面结点),使得链表中所有结点,保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

解决方案要求

输入参数:

  1. 输入n,n表示双向链表L的长度,L中的结点的data域依次为1到n。
  2. 随机多次调用Locate函数,输入x(调用函数次数由用户决定)。

输出参数:

调用Locate函数结束后,从头结点开始依次输出链表L中个结点的内容(data+freq)。

参考样例:

代码:

  1 #include "stdlib.h"
  2 #include <iostream>
  3 using namespace std;
  4
  5 typedef int ListData;
  6 typedef struct DoubleNode {
  7     ListData data, frequency;
  8     struct DoubleNode *prior, *next;
  9 }DoubleNode, *DoubleList;
 10
 11 void CreateDoubleList (DoubleList &first) {
 12     first = (DoubleNode*)malloc(sizeof(DoubleNode));
 13     if(first == NULL)    {
 14         cout << "存储分配错误!" << endl;
 15         exit(1);
 16     }
 17     first->prior = first->next = first;
 18 }
 19
 20 void IniteList(DoubleList &first, ListData n)    {
 21     DoubleNode *carrier, *temp = first;
 22     for (int i = 0; i < n; i++)    {
 23         carrier = (DoubleNode*)malloc(sizeof(DoubleNode));
 24         carrier->data = i + 1;
 25         carrier->frequency = 0;
 26         //Insert
 27         carrier->prior = temp;
 28         temp->next = carrier;
 29         carrier->next = first;
 30         carrier->next->prior = carrier;
 31
 32         temp = carrier;
 33     }
 34 }
 35
 36 DoubleList Locate(DoubleList &first, ListData x, ListData n)    {
 37     DoubleNode *temp = first->next;
 38     while(temp->data != x && temp != first)    {
 39         temp = temp->next;
 40     }
 41     if (temp == first)    {
 42         cout << "Please input number range from " << 1 << " to " << n << endl;
 43         exit(1);
 44     }
 45     else
 46         return temp;
 47 }
 48
 49 void SortList(DoubleList &first, ListData x, ListData n)    {
 50     DoubleNode *temp;
 51     temp = Locate(first, x, n);
 52     int tempNumber;
 53     temp->frequency++;
 54     if (temp->prior != first)    {
 55         while (temp->frequency > temp->prior->frequency)    {
 56             //SWAP
 57             tempNumber = temp->prior->data;
 58             temp->prior->data = temp->data;
 59             temp->data = tempNumber;
 60             //cout << "temp->prior->data " << temp->prior->data << endl;
 61             //cout << "temp->data " << temp->data << endl;
 62
 63             tempNumber = temp->prior->frequency;
 64             temp->prior->frequency = temp->frequency;
 65             temp->frequency = tempNumber;
 66             //cout << "temp->prior->frequency " << temp->prior->frequency << endl;
 67             //cout << "temp->frequency " << temp->frequency << endl;
 68         }
 69     }
 70 }
 71
 72 int main()    {
 73     int n;
 74     cout << "Please input the link list length:" << endl;
 75     cin >> n;
 76
 77     cout << "The link list data are" << endl;
 78     for (int i = 0; i < n; i++)
 79         cout << "The   " << i + 1 << " node is   " << i + 1 << ", its frequency is 0." << endl;
 80
 81     cout << "Let's start to test Locate Function.(-1 meansstopping input number)" << endl;
 82
 83     DoubleList first;
 84     CreateDoubleList(first);
 85     IniteList(first, n);
 86
 87     int x = 0;
 88     while(1)    {
 89         cout << "Please input number :";
 90         cin >> x;
 91         if (x != -1) {
 92             SortList(first, x, n);
 93         }
 94         else    break;
 95
 96
 97     }
 98     cout << "After test, the link list data are:" << endl;
 99     DoubleNode *temp = first->next;
100     int count = 0;
101     while(temp != first)    {
102         count++;
103         cout << "The   " << count << " node is   " << temp->data
104             << ", its frequency is " << temp->frequency << "." << endl;
105         temp = temp->next;
106     }
107
108     return 0;
109 }

转载于:https://www.cnblogs.com/QingHuan/p/4947787.html

【数据结构作业—02】双链表相关推荐

  1. 圆桌问题(数据结构作业+数组和链表)(1024程序员不容易,这次给源码)

    文章目录 问题描述 输入说明 输出说明 输入范例 输出范例 题目分析 问题重点 思路分析 源码 事故现场 关于走路有点弄混了,分不清步数了 第一次提交 第二次提交 第三次提交 第四次提交 分析与总结 ...

  2. 【Java数据结构】实现双链表

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 MyLinked ...

  3. 一篇解双链表(0基础看)(C语言)《数据结构与算法》

    目录 序言 带头双向循环链表 1. 概念 2. 效果展示图 3. 接口实现 3.01. 本文章要实现的接口 ​3.02. 双链表的实现 3.03. 双链表的初始化 3.04. 打印链表 3.05. 动 ...

  4. 数据结构上机实践第四周项目6- 循环双链表应用

    数据结构实践--循环双链表应用 线性表都是单向的?链表都是单向的? 本次实践将利用循环双链表进行实际应用,感受这种数据结构的好处 要求如下: 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一 ...

  5. 数据结构大作业:纯C双链表实现贪吃蛇

    整理电脑文件资料,发现的自己18年(大一下学期)写的数据结构大作业贪吃蛇.时光流逝,转眼间2年就过去了. 老师意见:有存档功能,就能满分了. 看代码,借思路,独自实现,成长自己. 游戏效果图如下: 代 ...

  6. 【算法和数据结构】_13_小算法_双链表

    没什么新的内容,把自己写的练习代码贴出来,供大家批判. 1 /* 2 本程序用来测试非线性存储结构:双链表 3 */ 4 5 6 #include <stdio.h> 7 #include ...

  7. 【手写数据结构】双链表最详细图解

    原创公众号:bigsai 原创不易,如果有收获请不要吝啬你的一键三连! 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以 ...

  8. 数据结构与算法—一文多图搞懂双链表

    目录 前言 双链表介绍 与单链表区别 结构的设计 具体方法的解析 初始化 增加 空表插入: 头插入: 尾插入: 编号插入: 删除 单节点删除: 头删除: 尾删除: 普通删除: 代码与测试 总结与感悟 ...

  9. 浅谈:数据结构之双链表结构与代码模拟双链表的实现

    双链表 本文是观看尚硅谷韩老师数据结构与算法根据老师讲解自己做的笔记,部分信息收集网络 与单链表区别 逻辑上没有区别.他们均是完成线性表的内容.主要的区别是结构上的构造有所区别. 对于单链表: 对于一 ...

最新文章

  1. 零代价修复海量服务器的内核缺陷——UCloud内核热补丁技术揭秘
  2. 龙尚科技的生态秘诀:品质赢得信誉 互惠促成长久合作
  3. Knockout应用开发指南(完整版) 目录索引
  4. js Date.parse()兼容性问题
  5. java string转bytebuf,如何将Java字符串转换为字节[]?
  6. python里的resize_利用python之wxpy模块玩转微信!这部小儿科吗!
  7. 3GPP Release、TSG、RAN等概念介绍
  8. webrtc 视频 demo
  9. java按钮权限控制_详解Spring Security 中的四种权限控制方式
  10. i = i+1 和 i += 1
  11. 压缩视图状态之ajax(atlas)修正版
  12. 樊登读书会2016年推荐书目汇总
  13. CENTOS6 安装配置 pptpd 心得
  14. unsw计算机专业排名,新南威尔士大学UNSW计算机科学Computer Science专业排名第54位(2021年THE世界大学商科排名)...
  15. 文字直接转语音,一直都这么简单!
  16. 【组织架构】中国铁路郑州局集团有限公司
  17. Matlab AppDesigner编程教程第1章——面向对象编程
  18. HTML lable标签
  19. 【排序】八种常用排序
  20. 计算机网络技术实训报告大一,计算机网络技术实训报告.doc

热门文章

  1. 图形推理1000题pdf_普华永道 网申笔试 OT 含泪总结归纳 - 逻辑推理
  2. 计算机一级考试无法显示评分,计算机一级评分各题标准
  3. 深度学习之自编码器(4)变分自编码器
  4. 深度学习之循环神经网络(4)RNN层使用方法
  5. 小辣椒p60手机怎么样_奇葩对决!3600元的格力手机与3599元的小辣椒V19,谁更强?...
  6. c++语言get:_用C++给R语言加速:Rcpp简单用法
  7. Linux16.04配置CUDA8.0+CUDNNV5.1
  8. ai 图灵测试_适用于现代AI系统的“视觉图灵测试”
  9. docker安装ubuntu镜像
  10. C语言编译流程:预处理、编译、汇编、链接