課程設(shè)計(jì)報(bào)告-利用哈希技術(shù)統(tǒng)計(jì)c源程序關(guān)鍵字出現(xiàn)頻度_第1頁(yè)
已閱讀1頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告</p><p>  題目:利用哈希技術(shù)統(tǒng)計(jì)C源程序關(guān)鍵字出現(xiàn)頻度</p><p>  學(xué)生姓名: </p><p>  學(xué) 號(hào): ______ </p><p>  班 級(jí): ____ </p&g

2、t;<p>  指導(dǎo)教師: _ </p><p>  2012年 6 月 18 日</p><p>  利用哈希技術(shù)統(tǒng)計(jì)C源程序關(guān)鍵字出現(xiàn)頻度</p><p><b>  (1)題目?jī)?nèi)容:</b></p><p>  利用Hash技術(shù)統(tǒng)計(jì)某個(gè)C源程序中的關(guān)鍵字出現(xiàn)的頻

3、度</p><p><b>  (2)基本要求:</b></p><p>  掃描一個(gè)C源程序,用Hash表存儲(chǔ)該程序中出現(xiàn)的關(guān)鍵字,并統(tǒng)計(jì)該程序中的關(guān)鍵字出現(xiàn)的頻度。用線性探測(cè)法解決Hash沖突。設(shè)Hash函數(shù)為:</p><p>  Hash(key)[(key的第一個(gè)字母序號(hào))*100+(key的最后一個(gè)字母序號(hào))] MOD 41<

4、/p><p><b>  一、對(duì)題目的分析</b></p><p>  哈希表是為了便于快速搜索而組織的值組合的集合。Hash Table是一種數(shù)組,可以用任意簡(jiǎn)單變量值來(lái)訪問(wèn)其元素,這種數(shù)組叫做關(guān)聯(lián)數(shù)組,也叫哈希表。值對(duì)的集合。</p><p>  理想的情況下是希望不經(jīng)過(guò)任何比較,一次存儲(chǔ)就能得到所查到的記錄,那就必須在記錄的存儲(chǔ)位置和它的關(guān)鍵

5、字之間建立一個(gè)確定的對(duì)應(yīng)關(guān)系f,使每個(gè)關(guān)鍵字和結(jié)構(gòu)中一個(gè)唯一的存儲(chǔ)位置相對(duì)應(yīng)。</p><p>  基本要求:使用一個(gè)下標(biāo)范圍比較大的數(shù)組來(lái)存儲(chǔ)元素。可以設(shè)計(jì)一個(gè)函數(shù)(哈希函數(shù),也叫做散列函數(shù)),使得每個(gè)元素的關(guān)鍵字都與一個(gè)函數(shù)值(即數(shù)組下標(biāo),hash值)存在一一對(duì)應(yīng)的關(guān)系,于是用這個(gè)數(shù)組單元來(lái)存儲(chǔ)這個(gè)元素。使用hash表存儲(chǔ)關(guān)鍵字時(shí)難免會(huì)有不同的關(guān)鍵字對(duì)應(yīng)同一關(guān)鍵碼的情況,因此必須有個(gè)處理沖突的辦法。</

6、p><p><b>  Hash函數(shù):</b></p><p>  Hash(key)[(key的第一個(gè)字母序號(hào))*100+(key的最后一個(gè)字母序號(hào))] MOD 41</p><p><b>  二、處理沖突的方法</b></p><p>  處理沖突的辦法—線性探測(cè)法</p><

7、p>  用線性探法解決沖突時(shí),把有沖突的關(guān)鍵字往后推移直到有空位置的關(guān)鍵碼時(shí)再插入到hash表中。</p><p><b>  C語(yǔ)言關(guān)鍵字:</b></p><p>  C語(yǔ)言關(guān)鍵字是C語(yǔ)言的保留的一些單詞,這些單詞都有了固定的意義和用途,不可以作為變量或者自定義類(lèi)型或類(lèi)名來(lái)使用。其特點(diǎn)是都有小寫(xiě)字母構(gòu)成。</p><p>  C語(yǔ)言關(guān)

8、鍵字有哪些:</p><p>  double int structbreakelselongswitch caseenumregistercharextern returnunionconstfloatshortunsignedcontinuefor signedvoiddefaultgotosizeofvolatiledowhilestaticifa

9、utocase</p><p>  定義一個(gè)多維數(shù)組,數(shù)組第一行存放關(guān)鍵字,數(shù)組第二行存儲(chǔ)hash函數(shù)處理后關(guān)鍵字結(jié)點(diǎn)地址,用hash函數(shù)存儲(chǔ)關(guān)鍵字</p><p>  Hash(Key)=[(Key第一個(gè)字符在1-26個(gè)字母中的序號(hào))*100+(Key最后一個(gè)字符在1-26個(gè)字母中的序號(hào))%41</p><p>  如此得到如for對(duì)應(yīng)地址3,if對(duì)應(yīng)于地址4,

10、int對(duì)應(yīng)地址18等等。</p><p>  哈希表 H(key)=keyMOD41 處理沖突為線性探測(cè)再散列。</p><p>  三、算法設(shè)計(jì)及部分函數(shù)</p><p>  打開(kāi)含關(guān)鍵字的CPP文件:</p><p>  int Open(char *filename)</p><p><b>  {&

11、lt;/b></p><p>  char word[MaxLength],ch;</p><p><b>  int i;</b></p><p>  FILE *read; //指向FILE類(lèi)的指針*read</p><p>  if((read=fopen

12、(filename,"r"))==NULL) //只讀方式讀取文件,如果為空</p><p><b>  {</b></p><p>  cout<<endl<<"未找到要打開(kāi)的文件,請(qǐng)重新輸入!";</p><p>  return -1;

13、 //跳出Open函數(shù)</p><p><b>  }</b></p><p>  while(!feof(read)) //判斷文件是否結(jié)束,到末尾函數(shù)值為“真”即非0</p><p><b>  {</b></p><p><b>  i=0;</b>

14、</p><p>  ch=fgetc(read); //讀取一個(gè)字符</p><p>  while(LetterNot(ch)==0&&feof(read)==0)</p><p>  ch=fgetc(read); //如果不是字母就接著讀取,關(guān)鍵字都是由字母組成的</p><p>  while

15、(LetterNot(ch)==1&&feof(read)==0)</p><p><b>  {</b></p><p>  if(i==MaxLength)</p><p><b>  {</b></p><p>  while(LetterNot(ch)==1&&

16、;feof(read)==0)</p><p><b>  {</b></p><p>  ch=fgetc(read); //超過(guò)MAXLEN的長(zhǎng)度則一定不為關(guān)鍵字,把余下連一起的字母都讀取</p><p><b>  }</b></p><p><b>  i=0;<

17、/b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  word[i++]=c

18、h; //把讀取到的字母存入word數(shù)組中</p><p>  ch=fgetc(read);</p><p><b>  }</b></p><p><b>  }</b></p><p>  word[i]='\0';</p><p&g

19、t;  if(KeywordsNot(word))</p><p><b>  {</b></p><p>  CreatHash(word);</p><p><b>  }</b></p><p><b>  }</b></p><p>  fclo

20、se(read);</p><p>  cout<<endl<<"文件中關(guān)鍵字已經(jīng)存入表中,請(qǐng)繼續(xù)!"<<endl<<endl<<endl;</p><p><b>  }</b></p><p>  在Hash表中查找關(guān)鍵字找出關(guān)鍵字位置:</p>

21、<p>  int FindHash(char *keyword) //在Hash表中查找關(guān)鍵字</p><p><b>  {</b></p><p>  int key,find,FindColl=0;</p><p>  if(!KeywordsNot(keyword)) //是否關(guān)鍵字</p><

22、p>  return -1;</p><p>  key=GetHashValue(keyword);</p><p>  if(strcmp(Test[key].keyword,keyword)==0)</p><p>  return key;</p><p>  for(find=key+1;find<LengthofHas

23、h;find++)</p><p>  { //線性探測(cè)法</p><p>  FindColl++; //FindColl統(tǒng)計(jì)沖突次數(shù)</p><p>  if(strcmp(Test[find].keyword,keyword)==0)</p><p&g

24、t;<b>  {</b></p><p>  Test[find].coll=FindColl; //把沖突次數(shù)存入coll</p><p>  return find;</p><p><b>  }</b></p><p><b>  }</b></p

25、><p>  for(find=0;find<key;find++) //后面的找不到再?gòu)那懊骈_(kāi)始找</p><p><b>  {</b></p><p>  FindColl++;</p><p>  if(strcmp(Test[find].keyword,keyword)==0)</p>&l

26、t;p><b>  {</b></p><p>  Test[find].coll=FindColl;</p><p>  return find;</p><p><b>  }</b></p><p><b>  }</b></p><p> 

27、 return -1;</p><p><b>  }</b></p><p><b>  建立Hash表:</b></p><p>  int CreatHash(char *keyword) //建立Hash表,keyword是一個(gè)數(shù)組</p><p><b>  {</

28、b></p><p><b>  int key;</b></p><p>  if(!KeywordsNot(keyword)) //判斷是否關(guān)鍵字</p><p>  return -1; </p><p>  key=GetHashValue(keyword); //計(jì)

29、算Hash值</p><p>  if(strlen(Test[key].keyword)>0) //Hash表中該位置存在關(guān)鍵字</p><p><b>  { </b></p><p>  if(strcmp(Test[key].keyword,keyword)==0) //Hash表中該位置的關(guān)鍵字相同</p>

30、<p><b>  { </b></p><p>  Test[key].count++; //頻度加1</p><p>  return 1; //跳出函數(shù)</p><p><b>  }</b></p><p>

31、;  key=FindHash(keyword); //不相同,繼續(xù)查找</p><p>  if(key<0) //沒(méi)有找到相等的keyword</p><p><b>  {</b></p><p>  key=Insert(GetHashValue(keyword));</p><p&g

32、t;  if(key<0) //Hash表滿(mǎn)或者計(jì)算的Hash值有問(wèn)題</p><p>  return -1;</p><p>  strcpy(Test[key].keyword,keyword); //將關(guān)鍵字插入Hash表</p><p><b>  }</b></p><p&

33、gt;<b>  if(key<0)</b></p><p>  return -1;</p><p>  Test[key].count++;</p><p><b>  }</b></p><p>  else //該位置沒(méi)有關(guān)鍵字</p><p><b&g

34、t;  {</b></p><p>  strcpy(Test[key].keyword,keyword);</p><p>  Test[key].count++;</p><p><b>  }</b></p><p><b>  return 1;</b></p>&

35、lt;p><b>  }</b></p><p>  在Hash表中插入關(guān)鍵字:</p><p>  int Insert(int key) //在Hash表中插入關(guān)鍵字</p><p><b>  {</b></p><p>  int find,FindColl=0;</p>

36、<p>  if(key<0||key>=LengthofHash) </p><p>  return -1;</p><p>  for(find=key+1;find<LengthofHash;find++) //分塊查找后部分</p><p><b>  {</b></p>&l

37、t;p>  FindColl++;</p><p>  if(strlen(Test[find].keyword)==0) //若這個(gè)地方為空</p><p><b>  {</b></p><p>  Test[find].coll=FindColl; //把沖突的次數(shù)存入coll中</p><

38、;p>  return find; </p><p><b>  }</b></p><p><b>  }</b></p><p>  for(find=0;find<key;find++) //分塊在前部分查找</p><p><b>  {</b&

39、gt;</p><p>  FindColl++;</p><p>  if(strlen(Test[find].keyword)==0)</p><p><b>  {</b></p><p>  Test[find].coll=FindColl;</p><p>  return find;&

40、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p>  return -1; //Hash表已滿(mǎn)</p><p><b>  }</b></p><p><b>  四、算法的實(shí)現(xiàn)</b>

41、</p><p>  a)引用庫(kù)函數(shù)定義變量</p><p>  #include <iostream.h> </p><p>  #include <string></p><p>  #include <iomanip.h></p><p>  #include <con

42、io.h></p><p>  using namespace std;</p><p>  const int LengthofHash=41; //Hash表長(zhǎng)度</p><p>  int keycount=0; //統(tǒng)計(jì)Hash表中的關(guān)鍵字總數(shù)</p><p>  const int Total=38; //38個(gè)關(guān)鍵字<

43、/p><p>  const int MaxLength=20; </p><p>  char KeyWords[Total][MaxLength]= //列舉38個(gè)關(guān)鍵字</p><p><b>  {</b></p><p>  "bool","break","case

44、","catch","char",</p><p>  "class","const","continue","default","do",</p><p>  "double","else",&quo

45、t;enum","extern","false",</p><p>  "float","for","goto","if","int",</p><p>  "interrupt","long",&qu

46、ot;new","private","public",</p><p>  "register","return","short","signed","sizeof",</p><p>  "static","s

47、truct","switch","typedef","union",</p><p>  "unsigned","void","while",</p><p><b>  };</b></p><p>  b)類(lèi)的

48、構(gòu)造及類(lèi)的對(duì)象</p><p>  class ConuntNum </p><p><b>  {</b></p><p><b>  public:</b></p><p>  int coll; //collision沖突次數(shù)</p><p>  int count;

49、//出現(xiàn)次數(shù)(頻度)</p><p>  char keyword[MaxLength];</p><p><b>  }; </b></p><p>  ConuntNum Test[LengthofHash];</p><p><b>  c)函數(shù)的聲明部分</b></p>&

50、lt;p>  void Menu();</p><p>  void PrintScreen(int key);</p><p>  int Open(char *filename); </p><p>  int LetterNot(char ch);</p><p>  int KeywordsNot(char *word);<

51、;/p><p>  int FindHash(char *keyword);</p><p>  int CreatHash(char *keyword);</p><p>  int Insert(int key);</p><p>  int GetHashValue(char *keyword);</p><p> 

52、 d)在Hash表中分塊查找</p><p>  int FindHash(char *keyword) //在Hash表中查找關(guān)鍵字</p><p><b>  {</b></p><p>  int key,find,FindColl=0;</p><p>  if(!KeywordsNot(keyword))

53、 //是否關(guān)鍵字</p><p>  return -1;</p><p><b>  …………</b></p><p><b>  }</b></p><p><b>  五、源代碼</b></p><p>  #include <iostr

54、eam.h> </p><p>  #include <string></p><p>  #include <iomanip.h></p><p>  #include <conio.h></p><p>  using namespace std;</p><p>  c

55、onst int LengthofHash=41; //Hash表長(zhǎng)度</p><p>  int keycount=0; //統(tǒng)計(jì)Hash表中的關(guān)鍵字總數(shù)</p><p>  const int Total=38; //38個(gè)關(guān)鍵字</p><p>  const int MaxLength=20; </p><p>  char KeyW

56、ords[Total][MaxLength]= //列舉38個(gè)關(guān)鍵字</p><p><b>  {</b></p><p>  "bool","break","case","catch","char",</p><p>  "clas

57、s","const","continue","default","do",</p><p>  "double","else","enum","extern","false",</p><p>  &q

58、uot;float","for","goto","if","int",</p><p>  "interrupt","long","new","private","public",</p><p>  

59、"register","return","short","signed","sizeof",</p><p>  "static","struct","switch","typedef","union",</p

60、><p>  "unsigned","void","while",</p><p><b>  };</b></p><p>  class ConuntNum </p><p><b>  {</b></p><p>

61、;<b>  public:</b></p><p>  int coll; //collision沖突次數(shù)</p><p>  int count; //出現(xiàn)次數(shù)(頻度)</p><p>  char keyword[MaxLength];</p><p><b>  }; </b></

62、p><p>  ConuntNum Test[LengthofHash];</p><p><b>  //先聲明后使用</b></p><p>  void Menu();</p><p>  void PrintScreen(int key);</p><p>  int Open(char *f

63、ilename); </p><p>  int LetterNot(char ch);</p><p>  int KeywordsNot(char *word);</p><p>  int FindHash(char *keyword);</p><p>  int CreatHash(char *keyword);</p>

64、<p>  int Insert(int key);</p><p>  int GetHashValue(char *keyword);</p><p>  void main()</p><p><b>  {</b></p><p><b>  char opt;</b><

65、/p><p>  int option=1,i,count,key,has;</p><p>  char filename[50],word[MaxLength];</p><p>  while(option)</p><p>  { Menu();</p><p><b>  cin>>op

66、t;</b></p><p>  switch(opt)</p><p><b>  {</b></p><p><b>  case '1':</b></p><p>  system("cls");</p><p>  co

67、ut<<"請(qǐng)輸入文件名:";</p><p>  cin>>filename;</p><p>  Open(filename);</p><p>  cout<<endl;</p><p><b>  continue;</b></p><p&

68、gt;<b>  break;</b></p><p><b>  case '2':</b></p><p>  system("cls");</p><p>  cout<<"按回車(chē)鍵繼續(xù)顯示!"<<endl;</p><

69、;p>  for(i=0;i<LengthofHash;i++)</p><p><b>  {</b></p><p>  PrintScreen(i); </p><p>  if((i+1)%10==0)</p><p>  getchar(); //10行一循環(huán)</p><p&g

70、t;<b>  }</b></p><p>  cout<<"CPP文件中關(guān)鍵字總數(shù)為:"<<keycount<<endl;</p><p>  cout<<endl<<endl<<endl<<endl<<endl;</p><p&g

71、t;<b>  continue;</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case '3':</b></p><p>  system(&quo

72、t;cls");</p><p>  cout<<"沖突關(guān)鍵字列表:"<<endl<<endl;</p><p><b>  count=0;</b></p><p>  for(i=0;i<LengthofHash;i++)</p><p><

73、;b>  {</b></p><p>  if(strlen(Test[i].keyword)>0)</p><p><b>  {</b></p><p>  key=GetHashValue(Test[i].keyword);</p><p>  if(key!=i)</p>&

74、lt;p><b>  {</b></p><p><b>  count++;</b></p><p>  cout<<"\t關(guān)鍵字"<<Test[i].keyword;</p><p>  cout<<"\tHash表當(dāng)前位置:"<&

75、lt;i;</p><p>  cout<<"\t沖突次數(shù):"<<Test[i].coll<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

76、;</p><p>  if(count==0) </p><p>  cout<<"沒(méi)有沖突"<<endl<<endl<<endl<<endl<<endl;</p><p><b>  else</b></p><p>  co

77、ut<<endl<<"\t\t\t沖突關(guān)鍵字共:"<<count<<"個(gè)"<<endl;</p><p>  cout<<endl<<endl<<endl<<endl<<endl;</p><p><b>  contin

78、ue;</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case '4':</b></p><p>  system("cls");</p

79、><p>  cout<<"輸入你想要查找的關(guān)鍵字: "<<endl;</p><p>  cin>>word;</p><p>  cout<<endl;</p><p>  PrintScreen(FindHash(word));</p><p>  

80、cout<<endl;</p><p><b>  continue;</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case '5':</b&g

81、t;</p><p><b>  option=0;</b></p><p><b>  break;</b></p><p><b>  default:</b></p><p>  system("cls");</p><p>&

82、lt;b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int Open(char *filename)</p><p><b>  {</b></p><p>  

83、char word[MaxLength],ch;</p><p><b>  int i;</b></p><p>  FILE *read; //指向FILE類(lèi)的指針*read</p><p>  if((read=fopen(filename,"r"))==NULL)

84、 //只讀方式讀取文件,如果為空</p><p><b>  {</b></p><p>  cout<<endl<<"未找到要打開(kāi)的文件,請(qǐng)重新輸入!";</p><p>  return -1; //跳出Open函數(shù)</p><p&g

85、t;<b>  }</b></p><p>  while(!feof(read)) //判斷文件是否結(jié)束,到末尾函數(shù)值為“真”即非0</p><p><b>  {</b></p><p><b>  i=0;</b></p><p>  ch=fgetc(

86、read); //讀取一個(gè)字符</p><p>  while(LetterNot(ch)==0&&feof(read)==0)</p><p>  ch=fgetc(read); //如果不是字母就接著讀取,關(guān)鍵字都是由字母組成的</p><p>  while(LetterNot(ch)==1&&feof(

87、read)==0)</p><p><b>  {</b></p><p>  if(i==MaxLength)</p><p><b>  {</b></p><p>  while(LetterNot(ch)==1&&feof(read)==0)</p><p

88、><b>  {</b></p><p>  ch=fgetc(read); //超過(guò)MAXLEN的長(zhǎng)度則一定不為關(guān)鍵字,把余下連一起的字母都讀取</p><p><b>  }</b></p><p><b>  i=0;</b></p><p><b

89、>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  word[i++]=ch; //把讀取到的字母存入word數(shù)組

90、中</p><p>  ch=fgetc(read);</p><p><b>  }</b></p><p><b>  }</b></p><p>  word[i]='\0';</p><p>  if(KeywordsNot(word))</p&

91、gt;<p><b>  {</b></p><p>  CreatHash(word);</p><p><b>  }</b></p><p><b>  }</b></p><p>  fclose(read);</p><p>  

92、cout<<endl<<"文件中關(guān)鍵字已經(jīng)存入表中,請(qǐng)繼續(xù)!"<<endl<<endl<<endl;</p><p><b>  }</b></p><p>  int LetterNot(char ch) //判斷是否是字母</p><p><b>  

93、{</b></p><p>  if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))</p><p>  return 1; </p><p><b>  else</

94、b></p><p>  return 0; </p><p><b>  }</b></p><p>  int FindHash(char *keyword) //在Hash表中查找關(guān)鍵字</p><p><b>  {</b></p><p>

95、  int key,find,FindColl=0;</p><p>  if(!KeywordsNot(keyword)) //是否關(guān)鍵字</p><p>  return -1;</p><p>  key=GetHashValue(keyword);</p><p>  if(strcmp(Test[key].keyword,ke

96、yword)==0)</p><p>  return key;</p><p>  for(find=key+1;find<LengthofHash;find++)</p><p>  { //線性探測(cè)法</p><p>  FindColl++;

97、 //FindColl統(tǒng)計(jì)沖突次數(shù)</p><p>  if(strcmp(Test[find].keyword,keyword)==0)</p><p><b>  {</b></p><p>  Test[find].coll=FindColl; //把沖突次數(shù)存入coll</p><p>  ret

98、urn find;</p><p><b>  }</b></p><p><b>  }</b></p><p>  for(find=0;find<key;find++) //后面的找不到再?gòu)那懊骈_(kāi)始找</p><p><b>  {</b></p>

99、<p>  FindColl++;</p><p>  if(strcmp(Test[find].keyword,keyword)==0)</p><p><b>  {</b></p><p>  Test[find].coll=FindColl;</p><p>  return find;</p&

100、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  return -1;</p><p><b>  }</b></p><p>  int CreatHash(char *keyword) //建立Hash表

101、,keyword是一個(gè)數(shù)組</p><p><b>  {</b></p><p><b>  int key;</b></p><p>  if(!KeywordsNot(keyword)) //判斷是否關(guān)鍵字</p><p>  return -1; </p&g

102、t;<p>  key=GetHashValue(keyword); //計(jì)算Hash值</p><p>  if(strlen(Test[key].keyword)>0) //Hash表中該位置存在關(guān)鍵字</p><p><b>  { </b></p><p>  if(strcmp(Test[ke

103、y].keyword,keyword)==0) //Hash表中該位置的關(guān)鍵字相同</p><p><b>  { </b></p><p>  Test[key].count++; //頻度加1</p><p>  return 1; //跳出函數(shù)</p>

104、<p><b>  }</b></p><p>  key=FindHash(keyword); //不相同,繼續(xù)查找</p><p>  if(key<0) //沒(méi)有找到相等的keyword</p><p><b>  {</b></p><p>  ke

105、y=Insert(GetHashValue(keyword));</p><p>  if(key<0) //Hash表滿(mǎn)或者計(jì)算的Hash值有問(wèn)題</p><p>  return -1;</p><p>  strcpy(Test[key].keyword,keyword); //將關(guān)鍵字插入Hash表</p>

106、<p><b>  }</b></p><p><b>  if(key<0)</b></p><p>  return -1;</p><p>  Test[key].count++;</p><p><b>  }</b></p><

107、p>  else //該位置沒(méi)有關(guān)鍵字</p><p><b>  {</b></p><p>  strcpy(Test[key].keyword,keyword);</p><p>  Test[key].count++;</p><p><b>  }</b></p>&

108、lt;p><b>  return 1;</b></p><p><b>  }</b></p><p>  int Insert(int key) //在Hash表中插入關(guān)鍵字</p><p><b>  {</b></p><p>  int find,FindCo

109、ll=0;</p><p>  if(key<0||key>=LengthofHash) </p><p>  return -1;</p><p>  for(find=key+1;find<LengthofHash;find++) //分塊查找后部分</p><p><b>  {</b>

110、;</p><p>  FindColl++;</p><p>  if(strlen(Test[find].keyword)==0) //若這個(gè)地方為空</p><p><b>  {</b></p><p>  Test[find].coll=FindColl; //把沖突的次數(shù)存入coll中

111、</p><p>  return find; </p><p><b>  }</b></p><p><b>  }</b></p><p>  for(find=0;find<key;find++) //分塊在前部分查找</p><p><

112、b>  {</b></p><p>  FindColl++;</p><p>  if(strlen(Test[find].keyword)==0)</p><p><b>  {</b></p><p>  Test[find].coll=FindColl;</p><p>

113、  return find;</p><p><b>  }</b></p><p><b>  }</b></p><p>  return -1; //Hash表已滿(mǎn)</p><p><b>  }</b></p><p>  int Keyword

114、sNot(char *word) //判斷是否關(guān)鍵字</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<Total;i++)</p><p>  if(strcmp(word,KeyWords[i])==0)

115、</p><p><b>  return 1;</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  void PrintScreen(int key)</p><p><b&

116、gt;  { </b></p><p>  if(key<0||key>=LengthofHash)</p><p><b>  {</b></p><p>  cout<<"關(guān)鍵字不存在!"<<endl;</p><p><b>  re

117、turn;</b></p><p><b>  }</b></p><p>  if(strlen(Test[key].keyword)==0)</p><p><b>  {</b></p><p>  cout<<"Hash表位置: "<<

118、key<<" 記錄是空的!"<<endl;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  cout<<"Hash表位置: "<<key<<"\t&

119、quot;<<"關(guān)鍵字: "<<Test[key].keyword<<"\t\t"<<"出現(xiàn)次數(shù):"<<Test[key].count<<endl;</p><p>  keycount++;</p><p><b>  }</b><

120、;/p><p>  int GetHashValue(char *keyword) </p><p>  { int HashValue;</p><p>  HashValue=(keyword[0]*100+keyword[strlen(keyword)-1])%41;</p><p>  return HashValue;</

121、p><p><b>  }</b></p><p>  void Menu()</p><p><b>  {</b></p><p>  cout<<"\t\t**********************************"<<endl;</p&

122、gt;<p>  cout<<"\t\t* 1.讀取CPP文件 *"<<endl;</p><p>  cout<<"\t\t* 2.輸出Hash表中的關(guān)鍵字 *"<<endl;</p><p>  cout<<"\t

123、\t* 3.顯示沖突的關(guān)鍵字 *"<<endl;</p><p>  cout<<"\t\t* 4.在Hash表中查找關(guān)鍵字 *"<<endl;</p><p>  cout<<"\t\t* 5.退出 *"

124、<<endl;</p><p>  cout<<"\t\t* 請(qǐng)選擇(1--5): *"<<endl;</p><p>  cout<<"\t\t**********************************"<<endl;</p>&

125、lt;p><b>  }</b></p><p>  六、程序運(yùn)行結(jié)果截圖</p><p><b>  圖1 程序運(yùn)行界面</b></p><p>  圖2 載入含關(guān)鍵字的CPP</p><p>  圖3 輸出Hash表中的關(guān)鍵字</p><p>  圖4 顯示沖突的關(guān)

126、鍵字</p><p>  圖5 查找關(guān)鍵字在Hash表中的位置</p><p>  七、課程設(shè)計(jì)心得體會(huì)</p><p>  這次課程設(shè)計(jì)讓我了解到自己在Hash表這一塊有著許多的不足,在各方面都缺乏最重要的知識(shí)。</p><p>  通過(guò)這次課程設(shè)計(jì),我了解到自己在實(shí)踐操作方面還有很多不足,在實(shí)踐過(guò)程中老師和同學(xué)給了我很大的幫助和鼓勵(lì),學(xué)會(huì)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論