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

📄 9_6.c

📁 数据结构C语言版台湾知城数位科技有限公司出版2002
💻 C
字号:
/* ======================================== */
/*    程式实例: 9_6.c                       */
/*    费氏数组搜索                          */
/* ======================================== */
#include <stdlib.h>
#define MAX  21                   /* 最大阵列容量         */

struct element                    /* 记录结构宣告         */
{
   int key;                       /* dj寻键值             */
};
typedef struct element record;    /* 结构新型态           */
record data[MAX] = {              /* 结构阵列宣告         */
       2,   5,   7,   9,  17,  21,  25,
      33,  46,  89, 100, 121, 127, 139,
     237, 279, 302, 356, 455, 467, 500  };

/* ---------------------------------------- */
/*  费氏数组 - 计算费氏数                   */
/* ---------------------------------------- */
int fib(int n)
{
   if ( n <= 1 )                  /* N 是否小於壹         */
      return n;                   /* 传回N                */
   else
      return fib(n-2) + fib(n-1); /* 递回计算费氏数       */
}

/* ---------------------------------------- */
/*  计算费氏数组的 n 值当 Fn <= n + 1       */
/* ---------------------------------------- */
int fibindex(int n)
{
   int temp;

   temp = 1;                      /* 建定temp值           */
   while ( fib(temp) <= n + 1 )   /* 比较回路             */
      temp++;                     /* 如果成立temp加一     */
   return temp - 1;               /* 传回n                */
}

/* ---------------------------------------- */
/*  费氏数组搜索                            */
/* ---------------------------------------- */
int fibsearch(int n,int key)
{
   int index;                     /* 费氏数的n值          */
   int mid;                       /* 费氏数的变数         */
   int fn1;                       /* 前一个费氏数         */
   int fn2;                       /* 前二个费氏数         */
   int temp;

   index = fibindex(n + 1);       /* 计算Fn <= n + 1      */
   mid = fib(index - 1);          /* 起始的费氏数         */
   fn1 = fib(index - 2);          /* 前一个费氏数         */
   fn2 = fib(index - 3);          /* 前二个费氏数         */
   while ( mid != 0 )             /* 费氏搜索主回路       */
   {
      if ( key < data[mid-1].key )  /* 比较小             */
         if ( fn2 <= 0 )
            mid = 0;              /* 没有找到             */
         else
         {
            mid = mid - fn2;      /* 左子树新费氏数       */
            temp = fn1;
            fn1 = fn2;            /* 前一个费氏数         */
            fn2 = temp - fn2;     /* 前二个费氏数         */
         }
      else
         if ( key > data[mid-1].key ) /* 比较大           */
            if ( fn1 <= 1 )
               mid = 0;           /* 没有找到             */
            else
            {
               mid = mid + fn2;   /* 右子树新费氏数       */
               fn1 = fn1 - fn2;   /* 前一个费氏数         */
               fn2 = fn2 - fn1;   /* 前二个费氏数         */
            }
         else
            return mid - 1;       /* 找到了               */
   }
   return -1;                     /* 没有找到             */
}

/* ---------------------------------------- */
/*  主程式: 在一个已排序的阵列, 接着输入    */
/*  值用费氏数组搜索来找值.                 */
/* ---------------------------------------- */
void main()
{
   int found;                     /* 是否找到变数         */
   int value;                     /* 搜索值的内容         */

   while ( 1 )                    /* 主回路开始           */
   {
      printf("\n请输入搜索值(0-500) ==> ");
      scanf("%d",&value);         /* 读入搜索值           */
      if ( value != -1 )
      {
         found = fibsearch(MAX,value);  /*呼叫费氏数组搜索*/
         if ( found != -1 )
            printf("找到搜索值:%d[%d]\n",value,found);
         else
            printf("没有找到搜索值:%d\n",value);
      }
      else
         exit(1);                 /* 结束程式             */
   }
}

⌨️ 快捷键说明

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