欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實習(xí)報告-銀行業(yè)務(wù)模擬

      時間:2019-05-14 16:55:12下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實習(xí)報告-銀行業(yè)務(wù)模擬》,但愿對你工作學(xué)習(xí)有幫助,當然你在寫寫幫文庫還可以找到更多《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實習(xí)報告-銀行業(yè)務(wù)模擬》。

      第一篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實習(xí)報告-銀行業(yè)務(wù)模擬

      數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實習(xí)報告

      題目:銀行業(yè)務(wù)模擬

      班級:計算機科學(xué)技術(shù)2004

      姓名:張芳芳

      學(xué)號: ***

      一. 需求分析:

      1.用 Visual C++ 工具設(shè)計實現(xiàn)一個用事件驅(qū)動的銀行業(yè)務(wù)離散模型, 模擬每一個客戶到達銀行、排入人最少的業(yè)務(wù)窗口隊列、排至窗口并處理完業(yè)務(wù)后離開的整個過程,統(tǒng)計客戶在銀行的平均逗留時間(即最近20人的平均逗留時間),適時地調(diào)整同時營業(yè)的窗口數(shù)(即能自動根據(jù)平均隊長調(diào)整營業(yè)窗口數(shù),縮減窗口時,應(yīng)將此前排在被減窗口的客戶繼續(xù)處理完),在保持合理的逗留時間的條件下,節(jié)省銀行投入的資源。假設(shè)相繼到達銀行的兩乘客間的時間間隔(可用↑和↓來控制其大?。┖兔總€客戶業(yè)務(wù)處理花費時間長短都各不相同,而且應(yīng)是隨機的,其平均值可控制。

      2.某時刻其狀態(tài)的改變被稱為”事件”,例如:一個客戶到達銀行;一個客戶(處理完業(yè)務(wù))從某窗口離開;一個客戶排入某窗口的隊尾;這些都是事件。按時間依次發(fā)生的事件序列就模擬了系統(tǒng)的運行。某些事件之間的因果關(guān)系表現(xiàn)為事件的驅(qū)動關(guān)系。針對模型的具體研究目標,需要對模型做一定簡化,在能表現(xiàn)模型的主要性態(tài)的前提下,應(yīng)設(shè)置盡可能少的事件。要求模擬兩種事件:一個客戶到達和一個客戶從某窗口離開。要求形象地顯示多個窗口隊列的變化情況。

      3.必須采用事件驅(qū)動的離散模型,不要采用時間驅(qū)動方案(指用計時器來確定事件發(fā)生的方式)。離散事件驅(qū)動模型的特點是只關(guān)注和刻畫事 物的狀態(tài)變化(即事件),不關(guān)心變化的過渡過程。這是對事物的一種簡化,也會帶來局限。模型靠每一個事件引發(fā)其它事件的方式來維持運轉(zhuǎn)。每個事件都有發(fā)生時間,模型的運轉(zhuǎn)實際就是按事件發(fā)生時間順序逐個處理事件,'處理'將產(chǎn)生新的事件。因此,建模的關(guān)鍵就是全面分析事物的主要特點,抽象出幾種能反映本質(zhì)的事件和它們之間的驅(qū)動關(guān)系。有時,這種驅(qū)動關(guān)系不一定反映實際的因果關(guān)系,而是維持系統(tǒng)運轉(zhuǎn)的需要。系統(tǒng)時間就是當前事件的事件發(fā)生時間,它不是等間隔變化而是跳躍變化的。

      4.模型中的簡化和假設(shè)應(yīng)是合理的, 避免歪曲事物的主要性質(zhì)。每個客戶到達和下一客戶到達時間的間隔以及每個客戶業(yè)務(wù)花費時間都應(yīng)是隨機的,其平均值應(yīng)便于調(diào)整。其中,客戶到達時間的平均間隔應(yīng)能在運行中用鍵盤實時調(diào)整。每個客戶到達和下一個客戶到達時間的間隔有時可能取零值(相當于兩人同時到達),但每一個客戶花費的業(yè)務(wù)處理時間則不可能取零值(>=1分鐘)。

      5.能比較形象地實時顯示各隊列的狀態(tài)及客戶平均逗留時間、平均隊列長度、已辦完業(yè)務(wù)的客戶數(shù)。模型應(yīng)能自動根據(jù)平均隊長調(diào)整營業(yè)窗口數(shù),縮減窗口時,應(yīng)將此前排在被減窗口的客戶繼續(xù)處理完。

      6.還要形象地實時顯示系統(tǒng)時間,即當前業(yè)務(wù)發(fā)生時間,采用 分鐘:秒 的形式輸出,當?shù)竭_銀行關(guān)門時間時,若還有客戶沒處理完業(yè)務(wù),將繼續(xù)處理,直至最后一個客戶離開,但不能延時過久,盡快將剩余客戶處理完。

      7.為了簡化操作我沒有用C語言而是用了C++,因為C++有地址傳送,方便處理。二. 概要設(shè)計:

      1. 單鏈表的抽象數(shù)據(jù)類型定義為: ADT eventlist{ 數(shù)據(jù)對象:D={qi|qi∈ElemSet,i=1,2,……,n,n>=o} 數(shù)據(jù)關(guān)系:R={〈qi-1,qi>|qi-1,qi∈D,i=2,3,……,n} 隊列的抽象數(shù)據(jù)類型定義: ADT Queue{ 數(shù)據(jù)對象:D={ai|ai∈ElemSet,i=1,2,……,n,n>=o} 數(shù)據(jù)關(guān)系:R={〈ai-1,ai>|ai-1,ai∈D,i=2,3,……,n} 基本操作:

      Initqueue(linkqueue &q)操作結(jié)果:構(gòu)造一個空的隊列q;

      Initlist(linklist &ev)操作結(jié)果:構(gòu)造一個空的鏈表ev;

      Queueempty(linkqueue q)初始條件:隊列q已存在;

      操作結(jié)果:若隊列為空,則返回TURE,否則返回ERROR; Queuelength(linkqueue q)初始條件:隊列q已存在;

      操作結(jié)果:返回隊列的長度; Mininum(linkqueue q[])初始條件:隊列數(shù)組已存在

      操作結(jié)果:返回隊列數(shù)組中最短隊的長度;

      Enqueue(linkqueue &q,qelemtype e)初始條件:隊列數(shù)組已存在 操作結(jié)果:在隊尾插入一個元素e Delqueue(linkqueue &q,int l)初始條件:隊列數(shù)組已存在操作結(jié)果:刪除隊列q的隊頭

      Orderinsert(eventlist &ev,event en)初始條件:事件鏈表ev已存在

      操作結(jié)果:將新生成客戶到達事件插入事件鏈表ev中 Openforday()操作結(jié)果:初始化操作 Customerarrived()初始條件:初始化操作完畢

      操作結(jié)果:處理客戶到達事件 Customerdepature(event en)初始條件:初始化操作完畢,已有客戶到達

      操作結(jié)果:處理客戶離開事件 Time()初始條件:客戶到達時間已隨機生成

      操作結(jié)果:化為系統(tǒng)時間,用 分:秒 形式表示 Bank_Simulation()初始條件:銀行業(yè)務(wù)模擬

      操作結(jié)果:打印出窗口,平均隊長,近20人的平均逗留時間,客戶到達人數(shù)

      和已處理的客戶人數(shù)

      2.本程序包含五個模塊:

      (1)主程序模塊:

      Void main(){ 接受命令;

      處理命令; }(2)事件鏈表表單元模塊——實現(xiàn)鏈表的抽象數(shù)據(jù)類型;(3)隊列單元模塊——實現(xiàn)隊列的抽象數(shù)據(jù)類型;

      (4)事件結(jié)點結(jié)構(gòu)單元模塊——定義鏈表的結(jié)點結(jié)構(gòu);

      (5)隊列結(jié)點結(jié)構(gòu)單元模塊——定義隊列的結(jié)點結(jié)構(gòu);

      各模塊之間的調(diào)用關(guān)系如下:主程序模塊—〉鏈表、隊列表單元模塊—>隊列、鏈表結(jié)點結(jié)構(gòu)單元模塊。

      三. 詳細設(shè)計: #define Qu 4 #define Khjg 5 #define Blsj 30 #include “c1.h” typedef struct { int OccurTime;int NType;}Event,ElemType;#include “c2_5.h” typedef LinkList EventList;#include “bo2_5.cpp”//

      typedef struct { int ArrivalTime;int Duration;}QElemType;#include “c3_2.h” #include “bo3_2.cpp” // EventList ev;Event en;Event et;LinkQueue q[Qu];QElemType customer;int TotalTime=0,CustomerNum=0;int CloseTime;

      int cmp(Event a, Event b){ if(a.OccurTime==b.OccurTime)

      return 0;else

      return(a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);}

      void OpenForDay(){ int i;InitList(ev);en.OccurTime=0;en.NType=Qu;OrderInsert(ev,en,cmp);for(i=0;i

      InitQueue(q[i]);}

      void Random(int &d,int &i){ d=rand()%Blsj+1;i=rand()%Khjg+1;}

      int Minimum(LinkQueue Q[]){ int l[Qu];int i,k;for(i=0;i

      l[i]=QueueLength(Q[i]);k=0;for(i=1;i

      if(l[i]

      {

      l[0]=l[i];

      k=i;

      } return k;}

      void CustomerArrived(){ QElemType f;int durtime,intertime,i;++CustomerNum;Random(durtime,intertime);et.OccurTime=en.OccurTime+intertime;et.NType=Qu;if(et.OccurTime

      OrderInsert(ev,et,cmp);i=Minimum(q);f.ArrivalTime=en.OccurTime;f.Duration=durtime;EnQueue(q[i],f);if(QueueLength(q[i])==1){

      et.OccurTime=en.OccurTime+durtime;

      et.NType=i;

      OrderInsert(ev,et,cmp);} }

      void CustomerDeparture(){ int i;i=en.NType;DeQueue(q[i],customer);TotalTime+=en.OccurTime-customer.ArrivalTime;if(!QueueEmpty(q[i])){

      GetHead(q[i],customer);

      et.OccurTime=en.OccurTime+customer.Duration;

      et.NType=i;

      OrderInsert(ev,et,cmp);} }

      void Bank_Simulation(){ Link p;OpenForDay();while(!ListEmpty(ev)){

      DelFirst(ev,GetHead(ev),p);

      en.OccurTime=GetCurElem(p).OccurTime;

      en.NType=GetCurElem(p).NType;

      if(en.NType==Qu)

      CustomerArrived();

      else

      CustomerDeparture();} printf(“客戶總數(shù):%dn客戶共耗時:%d分鐘n時:%dn”,CustomerNum,TotalTime,TotalTime/CustomerNum);}

      int main(){ printf(“請輸入銀行營業(yè)時間(單位:分)n”);scanf(“%d”,&CloseTime);Bank_Simulation();return 0;}

      四. 測試數(shù)據(jù):

      平均每人耗

      五. 調(diào)試分析:

      1.我在編寫這些函數(shù)時覺得Orderinsert(eventlist &ev,event en)函數(shù)使我很迷惑,不知道該怎么插入新生事件,因為不是直接插入隊尾,我不明白該用什么方法。后來又仔細研究了課本上那個例子才發(fā)現(xiàn)原來是比較事件發(fā)生時間,這樣才正確插進去了。

      2.顯示隊列時我遇到最大障礙,開始時每個隊列只能顯示一個客戶,查了好久后發(fā)現(xiàn)原來我的事件表只生成了一個結(jié)點,而且后面的指針都沒指正確,當然不對了,又做修改后發(fā)現(xiàn)又出了個大問題,隊列只能進人卻不能出人了,開始我懷疑是不是刪除隊頭函數(shù)寫錯了,但查了很久發(fā)現(xiàn)并沒錯,又繼續(xù)查,才發(fā)現(xiàn)原來在Customerdepature(event en)函數(shù)中,我沒有寫打印隊列函數(shù),這怎么能顯示離開狀態(tài)呢?修改后,顯示就正常了。

      3.開始我不知道老師要求的是近二十人的平均逗留時間,于是求的就是全部客戶的平均逗留時間,后來老師說這樣不行,還要修改,于是我又編寫了一個數(shù)組專門來存放這二十人的,用這些人的全部逗留時間除以20才得到正確的時間。

      4.我開始沒有處理系統(tǒng)時間,即直接將隨機生成的客戶到達時間輸出,在老師哪兒沒有通過,經(jīng)老師提點,原來分鐘用ti/60顯示,秒用ti%60顯示即可。

      5.在用上下鍵控制間隔時間時也有很多麻煩,發(fā)現(xiàn)編寫算法后,雖然能調(diào)動時間的顯示,但對隊列的顯示根本沒有作用,又是一番周折才查出原來這兩個地方根本沒有聯(lián)系起來,重新編寫后,又調(diào)試好久才運行正常了。

      七.附錄

      1.主程序:bank.cpp 2.常用定義文件:c1.h 3.鏈表定義與操作文件:c2_5.h bo2_5.h 4.隊列定義與操作文件:c3-2.h bo3-2.h

      第二篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告

      數(shù)據(jù)結(jié)構(gòu)課程設(shè)計

      散列表的應(yīng)用:插隊買票

      專業(yè) 計算機科學(xué)與技術(shù)(網(wǎng)絡(luò)技術(shù))

      金玲 計算機131 1310704114 張靜林 2015年1月23日 學(xué)生姓名 班學(xué)級 號

      指導(dǎo)教師 完成日期

      目錄概述……………………………………………………………………………………1 1.1 課程設(shè)計目的……………………………………………………………………….1 1.2 課程設(shè)計內(nèi)容……………………………………………………………………….1 2 系統(tǒng)需求分析……………………………………………………………………….1 2.1 主體功能…………………………………………………………………………....2 3系統(tǒng)概要設(shè)計…………………………………………………………………………2 3.1 系統(tǒng)流程圖………………………………………………………………………….2 4 系統(tǒng)詳細設(shè)計…………………………………………………………………………3 5 測試……………………………………………………………………………………5 5.1 測試方案…………………………………………………………………………….5 5.2 測試結(jié)果…………………………………………………………………………….5 6 小結(jié)……………………………………………………………………………………5 參考文獻…………………………………………………………………………………5 附錄………………………………………………………………………………………7 附錄1 源程序清單……………………………………………………………………...7 概述

      1.1 課程設(shè)計目的

      數(shù)據(jù)結(jié)構(gòu)課程設(shè)計是為數(shù)據(jù)結(jié)構(gòu)課程獨立開設(shè)的實踐性教學(xué)環(huán)節(jié)。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計對于鞏固數(shù)據(jù)結(jié)構(gòu)知識,加強學(xué)生的實際動手能力和提高學(xué)生綜合素質(zhì)是十分必要的。課程設(shè)計的目的:

      1.要求學(xué)生達到熟練掌握C語言的基本知識和技能。

      2.了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計方法,具備初步的獨立分析和設(shè)計能力。3.提高程序設(shè)計和調(diào)試能力。學(xué)生通過上機實習(xí),驗證自己設(shè)計的算法的正確性。學(xué)會有效利用基本調(diào)試方法,迅速找出程序代碼中的錯誤并且修改。

      4.培養(yǎng)算法分析能力。分析所設(shè)計算法的時間復(fù)雜度和空間復(fù)雜度,進一步提高程序設(shè)計水平。

      5.初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計、程序編碼、測試等基本方法和技能。

      1.2課程設(shè)計內(nèi)容

      本課程設(shè)計的任務(wù)是寫一個程序模擬這種情況。每個隊伍都允許插隊。如果你在排隊,有一個以上的朋友要求插隊,則你可以安排他們的次序。每次一個人入隊,并且如果這個入隊的人發(fā)現(xiàn)隊伍中有自己的朋友,則可以插入到這個朋友的后面;當隊伍中的朋友不止一個的時候,這個人會排在最后一個朋友的后面;如果隊伍中沒有朋友,則他只能夠排在這個隊伍的最后面。每一個入隊的人都先進行上述的判斷。當隊伍前面的人買到車票之后,依次出隊。系統(tǒng)需求分析

      2.1 主體功能

      程序從“input.txt”文件讀入測試用例,一個文件可包含多個測試用例。每個用例的第一行是朋友組的數(shù)目n(1<=n<=1000)。對于一個朋友組以朋友的數(shù)目j(1<=j<=1000)開始,由朋友的個數(shù)以及他們的名字組成,一個空格后接該組朋友的名字,以空格分開,并且每個人的名字都不同。每個名字不超過四個字母,由{A,B,...,Z,a,b,...,z}組成。一個朋友組最多有1000個人,每個人只屬于一個朋友組。n=0時,測試數(shù)據(jù)結(jié)束。

      下面是一些具體命令:.ENQUEUE——X入隊;.DEQUEUE——排隊頭的人買票,離開隊伍,即出隊;.STOP——一個測試用例結(jié)束。

      測試結(jié)果輸出到“output.txt”文件中。每個測試用例第一行輸出“Scenario#k”,k是測試用例的序號(從1開始)。對每一個出隊命令,輸出剛買票離開隊伍的人名。兩個測試試用例 之間隔一空行,最后一個用例結(jié)束不輸出空行。系統(tǒng)概要設(shè)計

      3.1 系統(tǒng)流程圖 系統(tǒng)詳細設(shè)計

      本題目主要解決兩個問題:一是怎么存放和查找大量數(shù)據(jù)(主要是姓名);二是怎么操作“ENQUEUE”和“DEQUEUE”命令。

      用散列表來存放和查找數(shù)據(jù)。由于最多有1000個朋友組,每組最多有1000人,使用平方探測法解決沖突,則表的大小是2*(1000*1000),所以選擇TableSize=2000003(2000003是大于2000000的最小素數(shù))。同一個組內(nèi)的都是朋友,所以每個人除了記錄他的名字name,還要記錄他屬于哪個組group,另外用info來表示該單元是否被占用,數(shù)據(jù)結(jié)構(gòu)如圖4.1所示。散列函數(shù)是根據(jù)Honer法則計算一個以64為階的多項式,如圖4.2所示。沖突解決方法采用平方探測法,如圖4.3所示。

      #define TabSize 2000003 typedef struct hashtab *PtrToHash;struct hashtab

      /*散列表數(shù)據(jù)結(jié)構(gòu)*/ { char name[5];

      /*名字*/ int group;

      /*屬于哪個朋友組*/ char info;

      /*標志位,該單元是否被占用*/ };圖4.1數(shù)據(jù)結(jié)構(gòu):散列表

      Int Hash(char *key,int TableSize){

      Int HashVal=0;

      While(key!=NULL)

      HashVal=(HashVal<<6)+*key;

      Return HashVal%TableSize;} 圖4.2散列函數(shù)

      Long int Find(PtrToHash hash,char *c){

      key=c;

      CurrentPos=Hash(key,TableSize);

      CollisionNum=0;

      While((單元被占用)and(單元內(nèi)的名字與查找的名字不同))

      {

      CurrentPos+=2*(++CollisionNum)-1;

      If(CurrentPos>=TabSize)

      CurrentPos=TabSize;

      }

      Return CurrentPos;} 圖4.3用平方探測法解決沖突

      第二個問題是關(guān)于怎么操作“ENQUEUE”和“DEQUEUE”命令。這可以用隊列來模擬。由于有插隊現(xiàn)象的存在,不能單純的用一個數(shù)組來表示隊列,因為這樣的話,插入一個朋友,則他后面的人都要往后移一個單位,刪除一個人,則他后面的人都要前移一個,會降低效率。所以,采用一個Index標記來表示當前元素的后繼元素,最后一個單元的后繼元素是第0個,形成環(huán),數(shù)據(jù)結(jié)構(gòu)如圖4.4所示。不用鏈表是因為鏈表存放指針也需要空間,并且鏈表插入、刪除的效率沒有數(shù)組高。

      typedef struct Que *PtrToQue;struct Que

      /*隊列數(shù)據(jù)結(jié)構(gòu)*/ { long int HashVal;

      /*散列值*/ long int Index;

      /*在中的隊列序號*/ };圖4.4數(shù)據(jù)結(jié)構(gòu):隊列

      輸入ENQUEUE命令,如果隊伍里有朋友,則排在朋友后面;如果沒有朋友,則排在隊尾。入隊時,用一個數(shù)組記錄每個朋友組的最后一位,以便下一個朋友到來時排到他后面,這個數(shù)組被稱為“插隊數(shù)組”。

      輸入DEQUEUE命令,則根據(jù)“先進先出”,按照各個元素和它后繼元素的先后順序,每次刪除隊列重的第一個。程序結(jié)構(gòu)如圖4.5所示。

      While(讀測試文件){

      if(輸入”ENQUEUE”)

      {

      讀入名字;

      插入散列表;

      插入隊列;

      }

      else if(輸入”DEQUEUE”)

      {

      刪除隊列第一個名字;

      將該名字輸出到文件;

      }

      else stop;} 圖4.5入隊、出隊操作 測試

      5.1 測試方案 按輸入要求輸入正常測試數(shù)據(jù),測試程序是否能正確解決問題,得到正確答案。應(yīng)注意邊界測試。例如,將n,j分別取為1的用例和n為1000的用例。n,j比較大時需寫程序生成測試用例。

      不按輸入要求輸入數(shù)據(jù),測試程序能否對輸入內(nèi)容進行數(shù)據(jù)合法性檢測并進行相應(yīng)的異常處理。例如,將n或j取為小于1或大于1000的數(shù),名字超過4個字母等情況下的測試用例。5.2 測試結(jié)果 小結(jié)

      在前面的學(xué)習(xí)過程中我們學(xué)到了很多知識而這次課程設(shè)計又是對我們所學(xué)的 一次總結(jié),剛開始,可以說是沒有頭緒,于是就去圖書館找資料,找到了一些關(guān)于程序方面的,可這遠遠不夠,這只是小小的開始。我們必須掌握很多已學(xué)的知識才能很好的完成本次的課程設(shè)計。在這次課程設(shè)計中,總的感覺是我遇到了很多困難這主要是由于我編寫代碼的經(jīng)驗不足,有時雖然是一個很小的問題但解決起來卻花費了我不少的時間,值得欣慰的是,當自己苦思冥想或者和其它同學(xué)一起探討把問題解決的時候我還是覺得獲益非淺,這就是在摸索中尋求到的知識。在設(shè)計時也免不了存在著些不足,所以在今后的學(xué)習(xí)中我會努力取得更大的進步。雖然對著電腦做程序,有些累,可當看到勞動成果時,卻有另一番滋味。

      參考文獻

      [1]范策,周世平,胡曉琨.《算法與數(shù)據(jù)結(jié)構(gòu)(C語言版)》[M].北京:機械工業(yè)出版社,2004 [2]嚴蔚敏.《數(shù)據(jù)結(jié)構(gòu)(C語言版)》.北京:清華大學(xué)出版社,2004 [3]許卓群,楊冬青,唐世渭,張銘.《數(shù)據(jù)結(jié)構(gòu)與算法》.北京:高等教育出版社,2004 [4]徐孝凱.《數(shù)據(jù)結(jié)構(gòu)實用教程(第二版)》.北京:清華大學(xué)出版社,2006

      附錄

      附錄1 源程序清單

      #include #include #include #define TabSize 2000003

      /*散列表大小TabSize 是大于表最大空間的素數(shù)*/ #define Max 1000001

      /*隊列空間最大值*/ struct hashtab;typedef struct hashtab *PtrToHash;struct hashtab

      /*散列表數(shù)據(jù)結(jié)構(gòu)*/ { char name[5];

      /*名字*/ int group;

      /*屬于哪個朋友組*/ char info;

      /*標志位,該單元是否被占用*/ };struct Que;typedef struct Que *PtrToQue;struct Que

      /*隊列數(shù)據(jù)結(jié)構(gòu)*/ { long int HashVal;

      /*散列值*/ long int Index;

      /*在中的隊列序號*/ };

      int hashedx=0;

      /*標記元素是否已經(jīng)在散列表里*/ long int Find(PtrToHash hash,char *c)/*查找在散列表中的位置*/ { char *key;long int CurrentPos,CollisionNum;

      key=c;for(CurrentPos=0;*key;++key)

      /*散列函數(shù),計算散列值*/

      CurrentPos=(CurrentPos<<6)+*key;CurrentPos%=TabSize;

      /*散列值*/ CollisionNum=0;/*如果當前單元被占用:單元內(nèi)的元素與當前操作的名字不同,使用平方探測法解決沖突;與當前操作的名字相同,則直接返回在散列中的位置*/ while((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)))

      {

      /*平方探測法*/

      CurrentPos+=2*(++CollisionNum)-1;

      if(CurrentPos>=TabSize)

      CurrentPos-=TabSize;}

      if((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)==0))

      /*元素已經(jīng)在散列表里*/

      hashedx=1;else /*元素不在散列表里*/

      hashedx=0;return CurrentPos;/*返回在散列表中的位置*/ }

      int main(){ long int Find(PtrToHash hash,char *c);

      /*查找在散列表中的位置*/

      PtrToHash hash;

      /*散列表*/ PtrToQue queue;

      /*隊列*/ int *grouppos;

      /*記錄每個朋友組的最后一位,即插隊數(shù)組*/ int n;

      /*測試用例數(shù)目*/ int num;

      /*當前測試用例序號*/ long int i,ii,j,key,temp;long int head,last;

      /*隊列的頭和尾*/ char c[8],tempc[8];

      /*名字*/ FILE *fpin,*fpout;

      /*輸入、輸出文件指針*/

      if(!(fpin=fopen(“input.txt”,“r”)))

      /*打開測試文件*/ {

      printf(“fopen error!”);

      /*文件打開錯誤*/

      return-1;} if(!(fpout=fopen(“output.txt”,“w”)))

      /*打開輸出文件*/ {

      printf(“fopen error!”);

      return-1;}

      hash=(PtrToHash)malloc(sizeof(struct hashtab)*TabSize);/*為散列表申請空間*/ queue=(PtrToQue)malloc(sizeof(struct Que)*Max);/*為隊列申請空間*/ grouppos=(int *)malloc(sizeof(int)*1000);/*申請空間記錄每個朋友組的最后一位*/ for(i=0,j=1;i

      queue[i].Index=j;queue[i-1].Index=0;/*最后一個單元的后繼單元是第0個,形成環(huán)*/ num=0;for(fscanf(fpin,“%d”,&n);n;fscanf(fpin,“%d”,&n))/*輸入當前測試用例的朋友組數(shù)*/ {

      if(n<1||n>1000)

      /*處理異常輸入n*/

      {

      fprintf(fpout,“n is out of rangen”);

      return-1;

      }

      num++;

      if(num!=1)

      /*兩個測試用例間輸入一空行*/

      fprintf(fpout,“n”);

      for(i=0;i

      hash[i++].info=0;

      /*初始化散列表,標記位置0*/

      for(i=0;i

      /*對每一組朋友*/

      {

      fscanf(fpin,“%d”,&j);

      /*當前組里的人數(shù)*/

      if(j<1||j>1000)

      /*處理異常輸入j*/

      {

      fprintf(fpout,“j is out of rangen”);

      return-1;

      }

      for(;j;--j)

      {

      fscanf(fpin,“%s”,c);

      /*輸入名字*/

      for(ii=0;ii

      tempc[ii]='