国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言數據結構之 折半查找實例詳解

2020-01-26 14:04:08
字體:
來源:轉載
供稿:網友

數據結構 折半查找

實例代碼:

/*   名稱:折半查找    語言:數據結構C語言版    編譯環境:VC++ 6.0   日期: 2014-3-26  */  #include <stdio.h> #include <malloc.h> #include <windows.h>   #define N 11 // 數據元素個數   typedef int KeyType; // 設關鍵字域為整型   typedef struct // 數據元素類型  {   KeyType key;  // 關鍵字域    int others;   // 其它部分   }ElemType;   // Search_Seq.h 靜態查找表的順序存儲結構  typedef struct {   // 數據元素存儲空間基址,建表時按實際長度分配,0號單元留空   ElemType *elem;   int length; // 表長度  }SSTable;  ElemType r[N]={   {05,1},{13,2},{19,3},{21,4},   {37,5},{56,6},{64,7},{75,8},   {80,9},{88,10},{92,11} }; // 數據元素(以教科書P219的數據為例),全局變量    // 靜態查找表(順序表和有序表)的基本操作(7個)   // 構造一個含n個數據元素的靜態順序查找表ST(數據來自全局數組r)  int Creat_Seq(SSTable *ST,int n) {    int i;   (*ST).elem = (ElemType *)calloc(n+1, sizeof(ElemType));    // 動態生成n+1個數據元素空間(0號單元不用)    if(!(*ST).elem)     return 0;   for( i = 1; i <= n; i++)     *((*ST).elem+i) = r[i-1]; // 將全局數組r的值依次賦給ST    (*ST).length = n;   return 1; }  // 重建靜態查找表為按關鍵字非降序排序  void Ascend(SSTable *ST) {     int i, j, k;   for(i = 1; i < (*ST).length; i++)   {     k = i;     (*ST).elem[0] = (*ST).elem[i]; // 待比較值存[0]單元      for(j = i+1; j <= (*ST).length; j++) //從中找到第i小的值       if ((*ST).elem[j].key < (*ST).elem[0].key)       {         k=j;         (*ST).elem[0]=(*ST).elem[j];       }     if(k != i) // 有更小的值則交換      {       (*ST).elem[k]=(*ST).elem[i];       (*ST).elem[i]=(*ST).elem[0];     }   } }  // 構造一個含n個數據元素的靜態按關鍵字非降序查找表ST, // 數據來自全局數組r  int Creat_Ord(SSTable *ST,int n) {   int f;   f = Creat_Seq(ST,n);  //構建一個靜態表   if( f ) //靜態表存在,則對其進行重建     Ascend(ST);   return f; }  // 銷毀表ST  int Destroy(SSTable *ST) {    free((*ST).elem);   (*ST).elem = NULL;   (*ST).length = 0;    return 1; }  // 在有序表ST中折半查找其關鍵字等于key的數據元素。若找到,則函數 // 值為該元素在表中的位置,否則為0。  int Search_Bin(SSTable ST,KeyType key) {     int low, high, mid;   low = 1; // 置區間初值    high = ST.length;   while(low <= high)   {     mid = (low + high) / 2;     if(key == ST.elem[mid].key) // 找到待查元素        return mid;     else if(key < ST.elem[mid].key)       high = mid - 1;   // 繼續在前半區間進行查找      else       low = mid + 1;   // 繼續在后半區間進行查找    }   return 0; // 順序表中不存在待查元素  }  // 按順序對ST的每個元素調用函數Visit()一次且僅一次。 int Traverse(SSTable ST,void(*Visit)(ElemType)) {     ElemType *p;   int i;      p = ++ST.elem; // p指向第一個元素,第0個元素沒有用    for(i = 1; i <= ST.length; i++)     Visit( *p++ );      return 1; }  void print(ElemType c) // Traverse()調用的函數  {   printf("(%d %d) ", c.key, c.others); }  int main() {   SSTable st;   int i;   KeyType s;      Creat_Ord(&st, N); // 由全局數組產生非降序靜態查找表st    Traverse(st,print); // 順序輸出非降序靜態查找表st     printf("/n請輸入待查找值的關鍵字: ");   scanf("%d", &s);   i = Search_Bin(st, s); // 折半查找有序表    if( i )     print(st.elem[i]);   else     printf("沒找到./n");    Destroy(&st);   system("pause");   return 0; }  /* 輸出效果:  (5 1) (13 2) (19 3) (21 4) (37 5) (56 6) (64 7) (75 8) (80 9) (88 10) (92 11) 請輸入待查找值的關鍵字: 75 (75 8) 請按任意鍵繼續. . .   */  

運行結果如下:

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 大田县| 荆州市| 湖南省| 新泰市| 连山| 嘉义县| 合水县| 涞源县| 定日县| 荆州市| 贡嘎县| 祁门县| 乌审旗| 原阳县| 加查县| 观塘区| 济源市| 天等县| 富顺县| 彰化县| 贵州省| 甘孜县| 美姑县| 东平县| 高雄县| 项城市| 汪清县| 青铜峡市| 东乌珠穆沁旗| 四川省| 平安县| 鲁山县| 剑河县| 蓝田县| 孝感市| 白银市| 和顺县| 车致| 银川市| 惠州市| 定陶县|