zoukankan      html  css  js  c++  java
  • 【数据结构作业—02】双链表

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

    问题描述

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

    解决方案要求

    输入参数:

    1. 输入nn表示双向链表L的长度,L中的结点的data域依次为1n
    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 }
  • 相关阅读:
    【转】python 面向对象(进阶篇)
    【转】Python 面向对象(初级篇)
    【转】MySQL— pymysql and SQLAlchemy
    【转】MySQL— 索引
    pycharm+pygame飞机大战
    python+Django创建购物网站(二)
    python语言系统学习(三)
    复习NLP-实战(九)----语言模型
    Linux常用命令--跟K8S相关
    Nginx-ingress-controller部署应用
  • 原文地址:https://www.cnblogs.com/QingHuan/p/4947787.html
Copyright © 2011-2022 走看看