【数据结构作业—02】双链表

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 }
时间: 2024-12-29 06:45:43

【数据结构作业—02】双链表的相关文章

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)

数据结构实践——循环双链表应用

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目- 循环双链表应用] 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一个算法Insert(ha,hb,i).其功能是:i=0时,将线性表hb插入到线性表ha的最前面:当i>0时,将线性表hb插入到线性表ha中第i个节点的后面:当i大于等于线性表ha的长度时,将线性表hb插入到线性表ha的最后面. 请在实现算法时,除项目中给出的特殊要求,其余工作均可利用项目4完成的算法支持. [参考解答](循环双链表的基本运算算法,请参考

【c++版数据结构】之双链表的实现(带头结点以及尾节点)

所实现的双链表的结构如下图所示: 双链表的实现,和第一篇文章单链表的实现大致相同点击打开链接 本篇文章在构建节点的同时,初始化构建节点的前驱和后继,具体细节参考下列代码 头文件:DList.h #ifndef DLIST_H_ #define DLIST_H_ typedef enum{FALSE,TRUE}Status; #include<iostream> #include<cassert> using namespace std; template<class Type

[C++11][数据结构]自己的双链表实现

这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式,而是使用传统的[head,tail].不过,为了配合stl算法,我还是加了两个begin(),end()方法,模拟了一下stl容器.模拟的还算及格,至少我可以做类似for (; begin != end; ++begin)这样的事,也可以让我的容器搭配一些stl算法,这在之后的demo里可以看到.

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

数据结构之自建算法库——循环双链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时循环链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:cdlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CDLINKLIST_H_INCLUDED #define CDLINKLIST_H_INCLUDED //循环双链表基本运算函数 typedef int E

数据结构之自建算法库——双链表

本文针对数据结构基础系列网络课程(2):线性表中第12课时双链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:dlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef DLINKLIST_H_INCLUDED #define DLINKLIST_H_INCLUDED typedef int ElemType; typedef s

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

没什么新的内容,把自己写的练习代码贴出来,供大家批判. 1 /* 2 本程序用来测试非线性存储结构:双链表 3 */ 4 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 10 //**************************************************0 11 // 定义双链表数据结构 12 struct dbllink 13 { 14 char data; 15 struct dbllink* preN