【數據結構作業—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 }

?

轉載于:https://www.cnblogs.com/QingHuan/p/4947787.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ANSYS——對稱模型對稱邊界的確定以及對稱邊界的約束施加問題

目錄 一、什么是對稱模型(對稱模型的特性)? 二、利用模型的對稱特性的目的?

徹底明白Java語言中的IO系統

ava的核心庫java.io提供了全面的IO接口&#xff0c;包括&#xff1a;文件讀寫&#xff0c;標準設備輸出等等。Java中IO是以流為基礎進行輸入輸出的&#xff0c;所有數據被串行化寫入輸出流&#xff0c;或者從輸入流讀入。在具體使用中很多初學者對Java.io包的使用非常含糊&…

第9章 接口

1、抽象類&#xff1a; 包含抽象方法的類叫抽象類&#xff0c;如果一個類包含一個或多個抽象方法(abstract void f();)&#xff0c;該類必須被限定為抽象的&#xff0c;否則編譯出錯。 1、抽象類不能被實例化&#xff0c;實例化的工作應該交由它的子類來完成&#xff0c;它只需…

用node-webkit(NW.js)創建桌面程序

以往寫windows桌面程序需要用MFC、C#之類的技術&#xff0c;那么如果你只會web開發技術呢&#xff1f;或者說你有一個網站&#xff0c;但是你想把你的網站打包成一個桌面應用程序&#xff0c;該如何做呢&#xff1f; 答案就是用node-webkit這個開源框架&#xff0c;他封裝了web…

一頭扎進Node系列 - 目錄

前言 本系列是屬于初級教程。博主我也還只是一個node的新兵蛋子&#xff0c;想通過學習官網的API文檔&#xff0c;慢慢的打好Node基礎。當然后期這系列文檔會慢慢完善&#xff0c;并且會添加一些項目實戰中遇到的一些問題以及解決方案&#xff01;如果你也是初學者&#xff0c;…

ANSYS——“There is at least 1 small equation solver pivot term”問題的解決辦法

目錄 問題出現的原因 問題解決辦法 1、根據提示對節點進行約束的添加

JAVA中幾個常用的方法

類Object是類層次結構的根類&#xff0c;每一個類都使用Object作為超類&#xff0c;所有對象&#xff08;包括數組&#xff09;都實現這個類的方法。jdk1.5中&#xff0c;描述了該類中的11個方法 1.getClass public final Class<? extends Object> getClass() 返回一個對…

ANSYS——載荷的方向

目錄 一、壓力的方向(FORCE) 1、為正的情況 2、為負的情況 二、壓強的方向(PRESSURE)

kindeditor用法簡單介紹(轉)

1&#xff0c;首先去官網下載http://www.kindsoft.net/ 2&#xff0c;解壓之后如圖所示&#xff1a; 由于本人做的是用的是JSP&#xff0c;所以ASP,PHP什么的就用不上了&#xff0c;直接把那些去掉然后將整個文件夾扔進Myeclipse&#xff0c;如圖&#xff1a; 里面有個報錯&am…

hadoop 分片與分塊,map task和reduce task的理解

分塊&#xff1a;Block HDFS存儲系統中&#xff0c;引入了文件系統的分塊概念&#xff08;block&#xff09;&#xff0c;塊是存儲的最小單位&#xff0c;HDFS定義其大小為64MB。與單磁盤文件系統相似&#xff0c;存儲在 HDFS上的文件均存儲為多個塊&#xff0c;不同的是&#…

SOLIDWORKS——參數化建模

https://www.sohu.com/a/259742200_100042821 知識點&#xff1a;投影曲線、曲面填充、掃描、外觀設置 建模步驟 1.先在工具——方程式里輸入一個直徑的變量A120 。 2.在前視基準面上草繪圓&#xff0c;畫一條直徑。直徑等于變量A。 3.旋轉&#xff0c;選擇粉色區域。 4.上視…

Arch 常用工具

一、網絡瀏覽pacman -S firefox firefox-i18n注&#xff1a;該命令中的前者為 Firefox 主程序,后者為語言包。pacman -S opera二、圖像編輯pacman -S gimp #圖像編輯軟件首選 GIMPpacman -S inkscape #矢量圖形編輯軟件Inkscapepacman -S scrot #…

Androd安全——反編譯技術完全解析

0&#xff0e;前言單純從技術角度上來講&#xff0c;掌握反編譯功能確實是一項非常有用的技能。另外既然別人可以反編譯程序&#xff0c;我們當然有理由應該對程序進行一定的保護&#xff0c;因此代碼混淆也是我們必須要掌握的一項技術。看完此篇如果對代碼混淆也感興趣&#x…

python——shape 與reshape

轉載自:https://blog.csdn.net/u010916338/article/details/84066369 shape()和reshape()都是數組array中的方法 numpy中reshape函數的三種常見相關用法 numpy.arange(n).reshape(a, b) 依次生成n個自然數&#xff0c;并且以a行b列的數組形式顯示np.arange(16).reshape(2,…

誤刪了microsoft visual c++后如何正常運行matlab

誤刪了microsoft visual c后如何正常運行matlab 本人在卸載visual studio2013的時候&#xff0c;因為這個軟件卸載的過程中出現一些問題&#xff0c;誤將visual c當成VS的組件一同刪除了。但是在打開matlab 時發現出錯&#xff0c;matlab打開后會出現下面的界面。 出現這個問題…

iScreenLocker 3.1.8 安卓鎖屏通知--蘋果一樣的體驗

*軟件介紹:蘋果鎖屏通知(iScreenLocker)是一款android上ios風格的鎖屏軟件。它顛覆安智通知設計&#xff0c;將原來狀態欄的通知搬到鎖屏界面上來&#xff0c;能夠在桌面輕松收發短信,微博,微信等消息。它獨有的消息喚醒功能。能使手機從待機界面喚醒而消耗非常少的電量。手指輕…

JSP慕課網階段用戶登錄小例子(不用數據庫)

getAttribute和setAttribute一起使用&#xff0c;而getParameter用于取得如request傳來的參數。 Web是請求/響應架構的使用&#xff0c;而request和response就是在服務器端生成的相應的兩個對象&#xff0c;request能夠獲取客戶端傳遞的參數及相關的一些信息&#xff0c;而resp…

機器學習python——python基礎

目錄 1、常用庫 2、shape與reshape&#xff0c;dtype 3、range、arange、linspace、logspace 4、數組的計算、切片 5、繪圖基本設置 6.三維繪圖 1、常用庫 numpy、scipy、matplotlib、math 2、shape與reshape&#xff0c;dtype https://blog.csdn.net/qq_45769063/arti…

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境 本人在給visual studio 2013配置opencv 環境下遇到過一些問題&#xff0c;比如配置不成功或者不能永久配置opencv環境。先將自己的配置經驗分享于此&#xff0c;希望同道中的好友可以用上。 首先自行下載Visual s…

屬性名、變量名與 內部關鍵字 重名 加

procedure TForm4.btn3Click(Sender: TObject); varMyQj: TQJson;MyPrinter: TPrinter; beginMyQj : TQJson.Create;tryMyPrinter.name : A號打印機;MyPrinter.status : enabled;MyPrinter.&type : yes;MyQj.FromRecord<TPrinter>(MyPrinter);Memo1.Lines.Add(MyQj.A…