⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text8-18.htm

📁 浙江大学计算机学院数据结构课程的教学课件
💻 HTM
字号:
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" link="#0000FF" vlink="#3399FF" alink="#FF0066">
<div id="Layer1" style="position:absolute; width:711px; height:21px; z-index:1; top: 10px; background-color: #CCCCCC; layer-background-color: #CCCCCC; border: 1px none #000000; left: 26px"><b>|</b><font face="宋体" size="2"><a href="../text1/text1-0.htm">第一章</a></font><b>|</b><font face="宋体" size="2"><a href="../text2/text2-0.htm">第二章</a></font><b>|</b><font face="宋体" size="2"><a href="../text3/text3-0.htm">第三章</a></font><b>|</b><font face="宋体" size="2"><a href="../text4/text4-0.htm">第四章</a></font><b>|</b><font face="宋体" size="2"><a href="../text5/text5-0.htm">第五章</a></font><b>|</b><font face="宋体" size="2"><a href="../text6/text6-0.htm">第六章</a></font><b>|</b><font face="宋体" size="2"><a href="../text7/text7-0.htm">第七章</a></font><b>|</b><font face="宋体" size="2">第八章</font><b>|</b><font face="宋体" size="2"><a href="../text9/text9-0.htm">第九章</a></font><b>|</b><font face="宋体" size="2"><a href="../text10/text10-0.htm">第十章</a></font><b>|</b><font size="2" face="宋体"><a href="../textA/textA-0.htm">算法分析</a><b><font color="#000000">|</font></b> 
  </font></div>
<pre align="left">

<b><font face="Arial" size="4">#include  < stdio.h>
#include  < alloc.h>
#include  < atdlib.h>
#define WORD_SIZE 5 </font></b><font face="Arial">   <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">  /* max number of directory bits */</font></b></i>
<font size="4"><b>#define PAGE_SIZE 10</b> </font> <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">  /*max size of a page */</font></b></i>
<b><font size="4">#define DIRECTORY _SIZE 32</font></b>   <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">  /* max size of directory */</font></b></i>
<b><font size="4">typedef struct page *paddr ; 
typedef struct</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">page</font></b>{
       <b><font size="4"> int local_depth ;<i><font face="Arial, Helvetica, sans-serif" color="#CC0099">  </font></i></font></b><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* page level */</font></b></i>
    <b><font size="4">    char *name[PAGE_SIZE] ; 
        int num_idents ; </font></b> <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* # of identifiers in page */</font></b></i>
      <b><font size="4">  } ; 
        
typedef struct{
        char *key ;   </font></b>   <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* pointer to string */</font></b></i>
       <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099"> /* other fields */</font></b></i>
        }<b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">brecord </font><font size="4">; 
int globle_depth ;</font></b> <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099"> /* trie height */</font></b></i>
<b><font size="4">paddr directory[DIRECTORY_SIZE] ; </font></b> <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* pointers to pages */</font></b></i>

<b><font size="4">paddr </font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">hash</font></b> <b><font size="4"> ( char *,short int ) ; </font></b>
<font size="4"><b>paddr</b></font> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">buddy</font></b>  <b><font size="4">( paddr ) ; </font></b>
<b><font size="4">short int</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">pgsearch</font></b> <b><font size="4"> ( char *,paddr ) ; </font></b>
<b><font size="4">int</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">convert</font></b> <b><font size="4"> ( paddr ) ; </font></b>
<b><font size="4">void </font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">enter</font></b>  <b><font size="4">( brecord,paddr ) ; </font></b>
<b><font size="4">void </font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">pgdelete</font></b> <b><font size="4"> ( char *,paddr ) ;</font></b> 
<b><font size="4">paddr</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">find</font></b>  <b><font size="4">( brecord,char * ) ; </font></b>
<b><font size="4">void</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">insert</font></b> <b><font size="4"> ( brecord,char * ) ; </font></b>
<b><font size="4">int</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">size</font></b>  <b><font size="4">( paddr ) ; </font></b>
<b><font size="4">void</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">coalesce</font></b>  <b><font size="4">( paddr,paddr ) ;</font></b> 
<b><font size="4">void</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">delete </font></b> <b><font size="4">( brecord,char * ) ; </font></b>

<b><font size="4">paddr</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">hash </font></b><font size="4"><b> ( char *key,short int precision )</b></font>
{
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/*key is hashed using a uniform hash function ,and the 
low precision bits are returned as the page address */</font></b></i>
}

<b><font size="4">paddr</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">buddy </font></b><font size="4"><b> ( paddr index )</b></font>
{
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* Take an address of a page and returns the page's
buddy,i.e.,the leading bit is complemented */</font></b></i>
}

<b><font size="4">int</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">size </font></b><font size="4"><b> ( paddr ptr )</b></font>
{ <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">  /* return the number of identifiers in the pages */</font></b></i>
}

<b><font size="4">void</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">coalesce</font></b>  <b><font size="4">( paddr ptr,paddr buddy )</font></b>
{
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* combine page ptr and its buddy into a single page */</font></b></i>
}

<b><font size="4">short int</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">pgsearch</font></b>  <b><font size="4">( char *key,paddr index )</font></b>
{
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* Search a page for a key.If found return 1 othwise return 0 */
</font></b></i>}

<b><font size="4">int</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">convert</font></b> <b><font size="4"> ( paddr ptr )</font></b>
{
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* Convert a pointer to a page to an equivalent   integer */
</font></b></i>}
<b><font size="4">void<font color="#FF0000"> </font></font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">enter</font></b>  <b><font size="4">( brecord r,paddr ptr )
{</font></b>
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* Insert a new record into the page pointed at by ptr */</font></b></i>
}

<b><font size="4">void</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">pgdelete</font></b>  <b><font size="4">( char *key,paddr ptr )
{</font></b>
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* remove the record with key,from the page pointed to by ptr */</font></b></i>
}

<b><font size="4">short int</font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000"> find </font></b> <b><font size="4">( char *key,paddr *ptr )
{</font></b>
<i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* return 0 if key is not found and 1 if it is.Also,</font><font face="Arial"><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">return a pointer   ( in ptr ) to the</font></b></i></font><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">
 page that was searched.</font><font face="Arial"><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">Assume that an empty directory has one page. */</font></b></i></font><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">
</font></b></i>       <b><font size="4"> paddr index ; 
        int intindex ;        
        index = hash  ( key,globle_depth ) ; 
        intindex = convert  ( index ) ; 
        *ptr = directory[intindex] ; 
        return pgsearch  ( key,ptr ) ; 
}

void</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">insert </font></b><font size="4"><b> ( brecord r,char *key )
{
        paddr ptr ; 
        if find  ( key,&ptr ){
            fprintf  ( stderr,"The key is already in the table.\n" ) ; 
            exit  ( 1 ) ; 
        }
        if   ( ptr->num_idents !=  PAGE_SIZE ){
            enter  ( r,ptr ) ; 
            ptr->num_idents++ ; 
        }
        else {</b></font>
        <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">    /* Split the page into two,insert the new key,and</font><font face="Arial"><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099"> update globe_depth </font></b></i></font><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">
        </font></b></i> <i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">  if necessary.</font><font face="Arial"><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">If this causes globle_depth to exceed </font></b></i></font><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">
            WORD_SIZE</font><font face="Arial"><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099"> then print an error and terminate. */</font></b></i></font><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">          </font></b></i>
<b><font size="4">        } ; 
}
</font></b>
<b><font size="4">void</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">delete </font></b><font size="4"><b> ( brecord r,char *key )
{</b></font><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* find and delete the record r from the file */</font></b></i>
       <b><font size="4"> paddr ptr ; 
        if   ( !</font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">find</font></b>  <b><font size="4">( key,&ptr ) ){
            fprintf  ( stderr,"key is not in the table.\n" ) ; 
            return ;  </font></b><i><b><font face="Arial, Helvetica, sans-serif" size="3" color="#CC0099">/* non-fatal error */</font></b></i>
        <b><font size="4">}</font></b>
        <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">pgdelete</font></b> <b><font size="4"> ( key,ptr ) ; 
        if   (</font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000"> size </font></b> <b><font size="4">( ptr ) +<font color="#FF0000"> </font></font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">size</font></b>  <b><font size="4">(</font></b> <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">buddy </font></b> <b><font size="4">( ptr ) ) <= PAGE_SIZE )</font></b>
            <b><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">coalesce</font></b> <b><font size="4"> ( ptr,buddy  ( ptr ) ) ; 
}

void<font color="#FF0000"> </font></font><font face="Arial, Helvetica, sans-serif" size="4" color="#FF0000">main </font></b> <b><font size="4">( void )
{
}

</font></b></font></pre>
<table width="731" cellspacing="0" cellpadding="0">
  <tr> 
    <td width="327">&nbsp;</td>
    <td width="271"><a href="../index.htm"><img width="60" height="25" usemap="#MapMap4" border="0" src="../../images/home.gif"></a><a href="../index.htm"><map name="MapMap4"><area shape="rect" coords="42,-34,88,-15" href="text0.htm"><area shape="rect" coords="4,4,55,23" href="text8-index.htm"></map></a></td>
    <td width="131"><font face="楷体_GB2312" size="2"><b><a href="text8-17.htm">上一页</a> 
      <a href="text8-19.htm">下一页</a> </b></font></td>
  </tr>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -