版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)哈希表實(shí)驗(yàn)報(bào)告優(yōu)質(zhì)資料(可以直接使用,可編輯優(yōu)質(zhì)資料,歡迎下載)
數(shù)據(jù)結(jié)構(gòu)哈希表實(shí)驗(yàn)報(bào)告優(yōu)質(zhì)資料(可以直接使用,可編輯優(yōu)質(zhì)資料,歡迎下載)HUNAN課程實(shí)習(xí)報(bào)告題目:哈希表學(xué)生姓名唐鵬學(xué)生學(xué)號(hào)202108080216專業(yè)班級(jí)物聯(lián)2班指導(dǎo)老師吳帆2021年4月2日本程序來(lái)自于圖書館靠書名來(lái)檢索想要查找的書問(wèn)題。本程序要求:(1)根據(jù)輸入建立圖書名稱表,采用創(chuàng)建散列表實(shí)現(xiàn)。(2)建散列表后,如果想要查找的數(shù)據(jù)在散列表中輸出yes否則輸出no。結(jié)構(gòu)中存在關(guān)鍵字和K相等的記錄,則必定存儲(chǔ)在f(K)的位置上。由此,不需比較便可直接取得所查記錄。這個(gè)對(duì)應(yīng)關(guān)系f稱為散列函數(shù)(Hashfunction),按這個(gè)思想建立的表為散列表。*對(duì)不同的關(guān)鍵字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),這種現(xiàn)象稱沖突。具有相同函數(shù)值的關(guān)鍵字對(duì)該散列函數(shù)來(lái)說(shuō)稱做同義詞。*綜上所述,根據(jù)散列函數(shù)H(key)和處理沖突的方法將一組關(guān)鍵字映象到一個(gè)有限的連續(xù)的地址集(區(qū)間)上,并以關(guān)鍵字在地址集中的“象”,作為這條記錄在表中的存儲(chǔ)位置,這種表便稱為散列表,這一映象過(guò)程稱為散列造表或散列,所得的存儲(chǔ)位置稱散列地址。這個(gè)現(xiàn)象也叫散列桶,在散列桶中,只能通過(guò)順序的方式來(lái)查找,一般只需要查找三次就可以找到??茖W(xué)家計(jì)算過(guò),當(dāng)負(fù)載因子(loadfactor)不超過(guò)75%,查找效率最高。*若對(duì)于關(guān)鍵字集合中的任一個(gè)關(guān)鍵字,經(jīng)散列函數(shù)映象到地址集合中任何一個(gè)地址的概率是相等的,則稱此類散列函數(shù)為均勻散列函數(shù)(UniformHashfunction),這就是使關(guān)鍵字經(jīng)過(guò)散列函數(shù)得到一個(gè)“隨機(jī)的地址”,從而減少?zèng)_突。程序設(shè)計(jì)流程程序思想哈希函數(shù)unsignedinthash_BKDE(char*str)生成映射地址,成為散列表的編號(hào)。哈希表HashTable::HashTable()通過(guò)數(shù)組儲(chǔ)存元素插入函數(shù)voidHashTable::insert(char*c)插入字符串,先計(jì)算要插入字符串生成的映射地址,然后在相應(yīng)的地址插入,如果沒(méi)有空位查找空位插入。查找函數(shù)boolHashTable::find(char*c)進(jìn)行查找,先計(jì)算要生成字符串的地址,再到散列表中進(jìn)行查找比較。主函數(shù)main()輸入:輸入散列表內(nèi)容和要查找的數(shù)據(jù)個(gè)數(shù)和數(shù)據(jù)輸出模塊:散列表查找的結(jié)果。建散列表并查找:建立散列表并遞歸查找流程圖三.實(shí)驗(yàn)源程序:#include<iostream>#include<cstdlib>#include<ctime>usingnamespacestd;unsignedinthash_BKDE(char*str)//哈希函數(shù),題目給出{//初始種子seed可取31131131313131131313etc.. unsignedintseed=131; unsignedinthash=0; while(*str) { hash=hash*seed+(*str++); } return(hash&0x7FFFFFFF);}doublek=(double)(rand()%999)/1000;//隨機(jī)生成小數(shù)隨機(jī)數(shù)0<k<1unsignedinthash_rand(unsignedintvalue)//value<2^32,將轉(zhuǎn)化地址轉(zhuǎn)化為seed{ doublea=k*value; doublen=(a-(int)a)*64;//取小數(shù)部分與2^5相乘 unsignedintseed=(int)n; returnseed;}unsignedintHash(char*str)//生成最終的地址映射即計(jì)算散列地址位置{ returnhash_rand(hash_BKDE(str));}classHashTable//哈希表類{public:HashTable();~HashTable();voidinsert(char*c);boolfind(char*c);private:char**Arr;//二維數(shù)組用于保存字符串書名intArrSize;//散列表單元個(gè)數(shù)在此為2^15=32768};HashTable::HashTable(){ ArrSize=32768; Arr=newchar*[64]; for(inti=0;i<64;i++) { Arr[i]=newchar[100]; Arr[i]=NULL; }}HashTable::~HashTable(){ for(inti=0;i<64;i++) delete[]Arr[i]; delete[]Arr;}voidHashTable::insert(char*c)//插入到哈希表{ unsignedintpos=Hash(c);//計(jì)算散列地址位置 while(Arr[pos]!=NULL) pos=(pos+1);//解決沖突的辦法,尋找空位,向后面挪動(dòng)一個(gè) Arr[pos]=c;//插入存儲(chǔ)}boolHashTable::find(char*c)//查找{ unsignedintpos=Hash(c);//計(jì)算散列地址 while(Arr[pos]!=NULL)//非空時(shí)進(jìn)行查找比較 { if(Arr[pos]==c)returntrue; pos=(pos+1);//尋找下一地址,如果運(yùn)行這一步,這說(shuō)明之前產(chǎn)生了沖突 } returnfalse;}intmain(){ boola[20]; char*c1=newchar[100]; HashTableH; cout<<"輸入字符串個(gè)數(shù)n:\n"; intn; cin>>n; cout<<"輸入n個(gè)字符串:\n"; for(inti=1;i<=n;i++) { cin>>c1; H.insert(c1);//直接插入到散列表的數(shù)組中 } cout<<"輸入待查的字符串個(gè)數(shù)m:\n"; intm; cin>>m; cout<<"輸入要查找的字符串:"<<endl; for(intj=0;j<m;j++) { cin>>c1; a[j]=H.find(c1);//bool量 } cout<<"查找結(jié)果(yes表示存在,no表示不存在):\n"; for(intk=0;k<m;k++) if(a[k]) cout<<"yes\n"; else cout<<"No\n"; return0;}四、實(shí)驗(yàn)截圖五、實(shí)驗(yàn)感想本次的實(shí)驗(yàn)首先要弄清楚哈希表,然后弄清楚最關(guān)鍵的兩個(gè)模塊,插入和查找。插入模塊中,首先要有哈希函數(shù)生成映射地址,要有哈希表保存元素,然后就是自己設(shè)定的解決沖突的辦法,這個(gè)程序是采用向下挪動(dòng)一個(gè)辦法,直到找到為空的地方保存。在查找中也是,先要通過(guò)哈希函數(shù)生成映射地址,通過(guò)這個(gè)地址參看哈希表中時(shí)候有元素,考慮到會(huì)有沖突的產(chǎn)生,那么必須那么必須要通過(guò)循環(huán)查找,要么找到元素,否則直到為空跳出查找。這也是這個(gè)程序的難點(diǎn)所在??傮w來(lái)說(shuō),哈希表對(duì)于提高儲(chǔ)存和查找效率方面有很大的提升。實(shí)驗(yàn)難度不是很大。實(shí)習(xí)報(bào)告題目:設(shè)計(jì)一個(gè)哈希表,完成相應(yīng)的建表和查表程序班級(jí):1503013姓名:李睿元學(xué)號(hào)成日期:2021.12.04需求分析1.假設(shè)人名為中國(guó)人名的漢語(yǔ)拼音形式;2.待填入哈希表的姓名共有30個(gè),去平均查找長(zhǎng)度的上限為2;3.哈希函數(shù)用除留余數(shù)法構(gòu)造,用偽隨機(jī)探測(cè)再散列法處理沖突;4.取讀者周圍較熟悉的30個(gè)人的姓名。概要設(shè)計(jì)1.抽象數(shù)據(jù)類型的定義:(1)人名數(shù)據(jù)表:typedefstructNode{charname[20];intkey;}Node,NodeList[MAX];(2)哈希表:typedefstructhashtable{char*name;intkey;intconflict_time;}HashTable[hashlen];變量:#defineP61//隨機(jī)數(shù)值#defineMAX30//人數(shù)#definehashlen61//哈希表長(zhǎng)2.主要函數(shù)的實(shí)現(xiàn):(1)哈希函數(shù):intHash(intkey)關(guān)鍵字獲得:intGetKey(charstr[])文件流中讀取姓名:voidGetName(NodeList&L,inti,FILE*fp)哈希表的初始化:voidInitialHashTable(HashTable&ht)偽隨機(jī)探測(cè)序列的生成:voidCreatConfilctArray(intn[])(6)哈希表的生成:voidCreatHashTable(HashTable&ht,NodeListL,int*n)哈希表的查詢:voidSearchHashTable(HashTableht,int*n,charget_name[])詳細(xì)設(shè)計(jì)#include<stdio.h>#include<stdlib.h>#include<string.h>#defineP61//隨機(jī)數(shù)值#defineMAX30//人數(shù)#definehashlen61//哈希表長(zhǎng)typedefstructNode{charname[20];intkey;}Node,NodeList[MAX];typedefstructhashtable{char*name;intkey;intconflict_time;}HashTable[hashlen];intHash(intkey){returnkey%P;}intGetKey(charstr[]){intt=0;char*s=str;while(*s){t+=*s;s++;}returnt;}voidGetName(NodeList&L,inti,FILE*fp){/*printf("請(qǐng)以拼音形式輸入第%d個(gè)姓名:",i);scanf("%s",L[i].name);L[i].key=GetKey(L[i].name);*/fscanf(fp,"%s",L[i].name);L[i].key=GetKey(L[i].name);//printf("\n");}voidInitialHashTable(HashTable&ht){intn=0;while(n<hashlen){ht[n].conflict_time=0;ht[n].name=NULL;ht[n].key=0;n++;}}voidCreatConfilctArray(intn[]){//n=(int*)malloc(50*sizeof(int));inti=0,j=0;while(i<50){n[i]=rand()%(hashlen+1);for(;j<i;j++){if(n[i]==n[j]){j=0;n[i]=rand()%(hashlen+1);continue;}}i++;}}voidCreatHashTable(HashTable&ht,NodeListL,int*n){//CreatConfilctArray(n);inti=0;intt;while(i<MAX){t=Hash(L[i].key);if(ht[t].conflict_time==0){ht[t].name=L[i].name;ht[t].conflict_time++;ht[t].key=L[i].key;printf("姓名:%skey值:%d表內(nèi)存儲(chǔ)位置:%d\n",L[i].name,L[i].key,t);}else{intm=0;intd=(t+n[m])%hashlen;while(ht[d].conflict_time!=0){ht[d].conflict_time++;m++;d=(t+n[m])%hashlen;}ht[d].name=L[i].name;ht[d].conflict_time++;ht[d].key=L[i].key;printf("姓名:%skey值:%d表內(nèi)存儲(chǔ)位置:%d\n",L[i].name,L[i].key,d);}i++;}}voidSearchHashTable(HashTableht,int*n,charget_name[]){//printf("請(qǐng)輸入要查詢的姓名:");//charget_name[20];intp=-1;ints_time=1;//scanf("%s",get_name);inth,k;intt;k=GetKey(get_name);t=h=Hash(k);while(1){/*if(ht[h].conflict_time==0&&ht[h].key!=k){printf("表中未找到無(wú)此人!\n");break;}elseif(ht[h].key==k){printf("已找到%s,表內(nèi)存儲(chǔ)位置:%d\n",get_name,h);break;}else{p++;h=n[p];}*/if(ht[h].name==NULL){printf("表中未找到無(wú)此人!\n");break;}elseif(strcmp(ht[h].name,get_name)==0){printf("已找到%s,表內(nèi)存儲(chǔ)位置:%d,查找次數(shù):%d\n",get_name,h,s_time);break;}else{p++;h=(t+n[p])%hashlen;s_time++;}}}intmain(){//printf("請(qǐng)輸入建表所需的三十個(gè)人名!\n");inti,j;NodeListL;HashTableht;InitialHashTable(ht);charget_name[20]={0};intrand_n[50];CreatConfilctArray(rand_n);FILE*fp;fp=fopen("name.txt","r");for(i=0;i<30;i++){GetName(L,i,fp);}fclose(fp);CreatHashTable(ht,L,rand_n);printf("\n");printf("--------------哈希表建表完成-------------");printf("\n");while(1){get_name[20]={0};printf("請(qǐng)輸入要查找的人名(輸入“***”表示結(jié)束程序):");scanf("%s",get_name);printf("關(guān)鍵字:%d",GetKey(get_name));if(strcmp(get_name,"***")==0)break;SearchHashTable(ht,rand_n,get_name);}return0;}調(diào)試分析1.哈希表可以在理想情況下不經(jīng)過(guò)任何比較,一次存取就能得到所查記錄;2.除留余數(shù)法對(duì)于p的選擇很重要,經(jīng)過(guò)分析后的選擇是p為小于等于m的最大素?cái)?shù),最終選擇了61;3.偽隨機(jī)探測(cè)再散列相較于線性探測(cè)再散列或二次探測(cè)再散能有效的防止二次堆積。用戶手冊(cè)1.本程序的運(yùn)行環(huán)境為Windows操作系統(tǒng),執(zhí)行文件為hashtable.exe;2.本程序的輸入的名字存儲(chǔ)在name.txt文件中;3.程序進(jìn)入后已經(jīng)完成哈希表的構(gòu)建并進(jìn)行展示,用戶只需進(jìn)行相應(yīng)的查找;測(cè)試數(shù)據(jù)1.挑選表中已有的十個(gè)姓名進(jìn)行測(cè)試(xiaoli,zhuangshuangshuang,laobai,lujia,xiaohei,huyazhou,abao,haojie,taosiji,wangkun)與上方的哈希表進(jìn)行對(duì)比完全匹配。2.選擇5個(gè)沒(méi)有在表中的名字進(jìn)行查表操作:(lovetianqi,tianjiejie,jiwang,beijing,heheda)數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告姓名學(xué)號(hào)號(hào)實(shí)驗(yàn)地點(diǎn)數(shù)學(xué)樓指導(dǎo)教師實(shí)驗(yàn)名稱隊(duì)列的表示與實(shí)現(xiàn)1、實(shí)驗(yàn)?zāi)康牧私夂驼莆贞?duì)列的數(shù)據(jù)類型描述及其特點(diǎn);完成鏈隊(duì)列的初始化、入隊(duì)、出隊(duì)、取對(duì)頭元素、顯示操作的實(shí)現(xiàn);掌握隊(duì)列的鏈?zhǔn)酱鎯?chǔ)表示與基本操作算法實(shí)現(xiàn);掌握隊(duì)列在實(shí)際問(wèn)題中的應(yīng)用和基本編程技巧。2、實(shí)驗(yàn)方法隊(duì)列的抽象數(shù)據(jù)類型定義:ADTQueue{ //數(shù)據(jù)對(duì)象:D={a[i]|a[i]∈ElemSet,i=1,2,...,n,n>=0} //數(shù)據(jù)關(guān)系:R1={<a[i-1],a[i]>|a[i-1],a[i]∈D,i=2,...,n} //約定其中a[1]端為隊(duì)列頭,a[n]端為隊(duì)列尾 //基本操作: InitQueue(&Q)//操作結(jié)果:構(gòu)造一個(gè)空隊(duì)列Q。 DestoryQueue(&Q)//初始條件:隊(duì)列Q已存在//操作結(jié)果:隊(duì)列Q被銷毀,不再存在 ClearQueue(&Q)//初始條件:隊(duì)列Q已存在//操作結(jié)果:將Q清為空隊(duì)列 QueueEmpty(Q)//初始條件:隊(duì)列Q已存在 //操作結(jié)果:若隊(duì)列Q為空隊(duì)列,則返回TRUE,否則FALSE QueueLength(Q)//初始條件:隊(duì)列Q已存在 //操作結(jié)果:返回Q的元素個(gè)數(shù),即隊(duì)列的長(zhǎng)度 GetHead(Q,&e)//初始條件:Q為非空隊(duì)列 //操作結(jié)果:用e返回Q的隊(duì)頭元素 EnQueue(&Q,e)//初始條件:隊(duì)列Q已存在 //操作結(jié)果:插入元素e為Q的新的隊(duì)尾元素 DeQueue(&Q,&e)//初始條件:Q為非空隊(duì)列 //操作結(jié)果:刪除Q的隊(duì)頭元素,并用e返回其值 QueueTraverse(Q,visit())//初始條件:Q已存在且非空 //操作結(jié)果:從隊(duì)頭到隊(duì)尾,依次對(duì)Q的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。}ADTQueue與線性表類似,隊(duì)列有兩種存儲(chǔ)表示鏈隊(duì)列和循環(huán)隊(duì)列。//-----基本操作的函數(shù)原型說(shuō)明-----statusINitQueue(LinkQueue&Q)//構(gòu)造一個(gè)空隊(duì)列QStatusDestoryQueue(LinkQueue&Q)//銷毀隊(duì)列Q,Q不再存在StatusClearQueue(LinkQueue&Q)//將Q清為空隊(duì)列StatusQueueEmpty(LinkQueueQ)//若隊(duì)列Q為空隊(duì)列,則返回TRUE,否則返回FALSEintQueueLength(LinkQueueQ)//返回Q的元素個(gè)數(shù),即為隊(duì)列的長(zhǎng)度StatusGetHead(LinkQueueQ,QElemType&e)//若隊(duì)列不空,則用e返回Q的隊(duì)頭元素,并返回OK;否則返回ERRORStatusENQueue(LinkQueue&Q,QElemTypee)//插入元素e為Q的新的隊(duì)尾元素StatusDeQueue(LinkQueue&Q,QElemType&e)//若隊(duì)列不空,則刪除Q的隊(duì)頭元素,用e返回其值,并返回OK;否則返回ERRORstatusQueueTraverse(linkQueueQ,visit())//從隊(duì)頭到隊(duì)尾依次對(duì)隊(duì)列Q中的每個(gè)元素調(diào)用函數(shù)visit()。一旦visit失敗,則操作失敗。鏈隊(duì)列://單鏈隊(duì)列——隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)typedefstructQNode{ QElemTypedata; structQNode*next;}QNode,*QueuePtr;typedefstruct{ QueuePtrfront;//隊(duì)頭指針 QueuePtrrear;//隊(duì)尾指針}LinkQueue;//-----單鏈隊(duì)列的基本操作的算法描述------statusINitQueue(LinkQueue&Q){//構(gòu)造一個(gè)空隊(duì)列Q Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW);//存儲(chǔ)分配失敗 Q.front->next=NULL; returnOK;}StatusDestoryQueue(LinkQueue&Q){//銷毀隊(duì)列Q,Q不再存在 while(Q.front){ Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear;} returnOK;}StatusClearQueue(LinkQueue&Q)//將Q清為空隊(duì)列StatusQueueEmpty(LinkQueueQ)//若隊(duì)列Q為空隊(duì)列,則返回TRUE,否則返回FALSEintQueueLength(LinkQueueQ)//返回Q的元素個(gè)數(shù),即為隊(duì)列的長(zhǎng)度StatusGetHead(LinkQueueQ,QElemType&e)//若隊(duì)列不空,則用e返回Q的隊(duì)頭元素,并返回OK;否則返回ERRORStatusENQueue(LinkQueue&Q,QElemTypee){//插入元素e為Q的新的隊(duì)尾元素 p=(QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW);//存儲(chǔ)分配失敗 p->data=e;p->next=NULL; Q.rear->next=p; Q.rear=p; returnOK;}StatusDeQueue(LinkQueue&Q,QElemType&e){//若隊(duì)列不空,則刪除Q的隊(duì)頭元素,用e返回其值,并返回OK;否則返回ERROR if(Q.front==Q.rear)returnERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p)Q.rear=Q.front; free(p); returnOK;}statusQueueTraverse(linkQueueQ,visit())//從隊(duì)頭到隊(duì)尾依次對(duì)隊(duì)列Q中的每個(gè)元素調(diào)用函數(shù)visit()。//一旦visit失敗,則操作失敗。循環(huán)隊(duì)列://循環(huán)隊(duì)列——隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)#defineMAXQSIZE100//最大隊(duì)列長(zhǎng)度typedefstruct{ QElemType*base;//初始化的動(dòng)態(tài)分配存儲(chǔ)空間 intfront;//頭指針,若隊(duì)列不空,指向隊(duì)列頭元素 intrear;//尾指針,若隊(duì)列不空,指向隊(duì)列尾元素的下一個(gè)位置}SqQueue;//-----循環(huán)隊(duì)列的基本操作的算法描述------StatusInitQueue(SqQueue&Q){ //構(gòu)造一個(gè)空隊(duì)列Q Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OVERFLOW);//存儲(chǔ)分配失敗 Q.front=Q.rear=0; returnOK;}intQueueLength(SqQueueQ){//返回Q的元素個(gè)數(shù),即隊(duì)列的長(zhǎng)度 return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}statusEnQueue(SqQueue&Q,QElemType){//插入元素e為Q的新的隊(duì)尾元素 if((Q.rear+1)%MAXQSIZE==Q.front)returnERROR;//隊(duì)列滿 Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; returnOK;}StatusDeQueue(Squeue&Q,QElemType&e){ //若隊(duì)列不空,則刪除Q的隊(duì)頭元素,用e返回其值,并返回OK; //否則返回ERROR if(Q.front==Q.rear)returnERROR; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXQSIZE; returnOK;}3、事先定義的常量和類型/***********************C函數(shù)庫(kù)定義****************/#include<stdio.h>//EOFNULL#include<string.h>#include<malloc.h>//malloc();#include<limits.h>//ENTMAX#include<stdlib.h>#include<math.h>//floor(),fabs(),abs(),ceil(),#include<io.h>//eof()#include<process.h>//exit()#include<iostream.h>//cout,cin/******************函數(shù)結(jié)果狀態(tài)代碼****************/#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1//#defineOVERFLOW-2//因?yàn)閙ath.h中已經(jīng)定義OVERFLOW為3typedefintQElemType;//ElemType是變量的類型定義typedefintStatus;//Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK,TRUE。4、實(shí)驗(yàn)過(guò)程鏈隊(duì)列#include<stdio.h>#include<stdlib.h>#include<process.h>#defineOK1#defineERROR0#defineOVERFLOW0typedefstructQNode{ intdata; structQNode*next;}QNode,*QueuePtr;typedefstruct{ QueuePtrfront; QueuePtrrear;}LinkQueue;intInitQueue(LinkQueue&Q){ Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode)); if(!Q.rear) exit(OVERFLOW); Q.front->next=NULL; returnOK;}voidQueueEmpty(LinkQueueQ){ if(Q.front==Q.rear)printf("該鏈隊(duì)為空:"); else printf("該鏈隊(duì)不為空:");}voidEnQueue(LinkQueue&Q,inte){ QueuePtrp; p=(QueuePtr)malloc(sizeof(QNode)); if(!p) printf("error"); p->data=e; Q.rear->next=p; Q.rear=p; printf("元素%d入隊(duì)成功",e);}intEnnQueue(LinkQueue&Q,inte){ QueuePtrp; p=(QueuePtr)malloc(sizeof(QNode)); if(!p) returnERROR; p->data=e; Q.rear->next=p; Q.rear=p; returnOK;}voidDeQueue(LinkQueue&Q){ QueuePtrp; if(Q.front==Q.rear) printf("該鏈隊(duì)為空"); p=Q.front->next; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); printf("隊(duì)首元素刪除成功");}voidGetHead(LinkQueue&Q){ QueuePtrp; if(Q.front==Q.rear) printf("該鏈隊(duì)為空"); p=Q.front->next; printf("隊(duì)首元素為:%d",p->data);}voidOutQueue(LinkQueue&Q){ QueuePtrp; if(Q.front==Q.rear) printf("該鏈隊(duì)為空"); p=Q.front->next; while(p!=Q.rear->next) { printf("%d",p->data); p=p->next; }}voidLengthQueue(LinkQueue&Q){ intf=0; QueuePtrp; if(Q.front==Q.rear) printf("該隊(duì)列的長(zhǎng)度是:%d",f); else { p=Q.front->next; while(p!=Q.rear->next) { p=p->next; f++; } printf("該隊(duì)列的長(zhǎng)度是:%d",f); }}voidmain(){ system("cls"); intflag=1,i; LinkQueueQ; InitQueue(Q); printf("************************鏈隊(duì)列功能菜單***********************\n"); printf("1:初始化鏈隊(duì)列,2:判斷鏈隊(duì)列是否為空,3:進(jìn)入隊(duì)列,4:取出隊(duì)首元素\n"); printf("5:輸出該隊(duì)列的所有元素,6:輸出該隊(duì)列的長(zhǎng)度,7:結(jié)束程序,8:清屏\n"); while(flag) { printf("\n請(qǐng)輸入操作符:"); scanf("%d",&i); switch(i) { case1: inte,n,k; printf("請(qǐng)輸入隊(duì)列的長(zhǎng)度:"); scanf("%d",&n); printf("請(qǐng)輸入隊(duì)列的元素:"); for(e=1;e<=n;e++) { scanf("%d",&k); EnnQueue(Q,k); } printf("初始化鏈隊(duì)成功"); break; case2: QueueEmpty(Q); break; case3: intj; printf("請(qǐng)輸入要進(jìn)入隊(duì)列的元素"); scanf("%d",&j); EnQueue(Q,j); break; case4: GetHead(Q); break; case5: printf("該隊(duì)列的元素是:"); OutQueue(Q); break; case6: LengthQueue(Q); break; case7: flag=0; break; case8: system("cls"); break; } } printf("程序結(jié)束");}循環(huán)隊(duì)列#include<stdio.h>#include<stdlib.h>#include<process.h>#defineMAXSIZE10;#defineOK1;#defineERROR0;#defineOVERFLOW0;typedefstruct{ int*data; intfront; intrear;}SqQueue;intInitQueue_Sq(SqQueue&Q){Q.data=(int*)malloc(10*sizeof(int)); if(!Q.data) exit(0); Q.front=Q.rear=0; returnOK;}intEnQueue_Sq(SqQueue&Q,inte){ if((Q.rear+1)%10==Q.front) returnERROR; Q.data[Q.rear]=e; Q.rear=(Q.rear+1)%10; returnOK;}voidIfEmpty(SqQueueQ){ if(Q.rear=Q.front) printf("該循環(huán)隊(duì)列是空隊(duì)列\(zhòng)n"); else printf("該循環(huán)隊(duì)列不是空隊(duì)列\(zhòng)n");}voidIfFull(SqQueueQ){ if((Q.rear+1)%10==Q.front) printf("該循環(huán)隊(duì)列已滿\n"); else printf("該循環(huán)隊(duì)列未滿\n");}voidInQueue_Sq(SqQueue&Q,inte){ if((Q.rear+1)%10==Q.front) printf("循環(huán)隊(duì)列已滿\n"); else { Q.data[Q.rear]=e; Q.rear=(Q.rear+1)%10; printf("元素%d成功進(jìn)入循環(huán)隊(duì)列\(zhòng)n",e); }}voidDeQueue_Sq(SqQueue&Q
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第三單元 文明與家園(解析版)-2023-2024學(xué)年九年級(jí)道德與法治上學(xué)期期中考點(diǎn)大串講(部編版)
- 2025年度時(shí)尚雜志模特專屬簽約合同樣本4篇
- 2025年度個(gè)人挖掘機(jī)械操作培訓(xùn)合同2篇
- 2025年智能家居與家居用品定制合同2篇
- 二零二五年度智慧城市基礎(chǔ)設(shè)施建設(shè)合同21篇
- 二零二五年度國(guó)際貿(mào)易廣告?zhèn)鞑ズ贤瑯颖?篇
- 房地產(chǎn)市場(chǎng)風(fēng)險(xiǎn)分析
- 2025年家庭網(wǎng)絡(luò)智能設(shè)備使用合同
- 二零二五年度房地產(chǎn)項(xiàng)目開(kāi)發(fā)管理合同3篇
- 2025年商業(yè)稅收政管版終合同
- 《健康體檢知識(shí)》課件
- 2023年護(hù)理人員分層培訓(xùn)、考核計(jì)劃表
- 生產(chǎn)計(jì)劃主管述職報(bào)告
- GB/T 44769-2024能源互聯(lián)網(wǎng)數(shù)據(jù)平臺(tái)技術(shù)規(guī)范
- 【經(jīng)典文獻(xiàn)】《矛盾論》全文
- 《子宮肉瘤》課件
- 《準(zhǔn)媽媽衣食住行》課件
- 大美陜西歡迎你-最全面的陜西省簡(jiǎn)介課件
- 給男友的道歉信10000字(十二篇)
- 客人在酒店受傷免責(zé)承諾書范本
- 練字本方格模板
評(píng)論
0/150
提交評(píng)論