当前位置:   article > 正文

查找实验(C语言)

查找实验(C语言)

1.实验目的

(1)掌握静态查找表算法(重点掌握折半查找);

(2)掌握动态查找表——二叉排序树查找算法;

2.实验要求

算法1:采用顺序存储结构创建静态查找表,对查找表进行顺序查找和改进的顺序查找,并对其查找效率进行比较;

算法2:采用顺序存储结构创建静态查找表——有序表,对有序表进行二分查找;

3.代码实现 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #define MAXSIZE 100
  5. #define MAX_NODE 100
  6. //定义
  7. typedef int keytype;
  8. typedef struct
  9. {
  10. keytype key;
  11. int info;
  12. }ElemType;
  13. //定义
  14. typedef struct
  15. {
  16. ElemType elem[MAXSIZE];
  17. int length;
  18. }Sstable;
  19. //定义
  20. typedef struct node
  21. {
  22. int data;
  23. struct node *LChild;
  24. struct node *RChild;
  25. }BST;
  26. //创建BST(二叉树)
  27. void CreateBST( BST *T, int arr[], int n )
  28. {
  29. BST *s, *p, *q;
  30. int i;
  31. T->data = arr[0];
  32. T->LChild = NULL;
  33. T->RChild = NULL;
  34. for( i = 1; i < n; i++ )
  35. {
  36. s = (BST *)malloc( sizeof(BST) );
  37. s->data = arr[i];
  38. s->LChild = NULL;
  39. s->RChild = NULL;
  40. p = T;
  41. while( p != NULL )
  42. {
  43. if( s->data == p->data )
  44. {
  45. printf( "%d existed.\n", s->data );
  46. q = NULL;
  47. break;
  48. }
  49. q = p;
  50. if( s->data < p->data )
  51. {
  52. p = p->LChild;
  53. }
  54. else if( s->data > p->data )
  55. {
  56. p = p->RChild;
  57. }
  58. }
  59. if( q != NULL && s->data < q->data )
  60. {
  61. q->LChild = s;
  62. }
  63. else if( q != NULL && s->data > q->data )
  64. {
  65. q->RChild = s;
  66. }
  67. }
  68. }//CreateBST
  69. //查找二叉树
  70. int SearchBST( BST *T, int key )
  71. {
  72. int flag = 0; //查找成功标志,初始化为失败
  73. BST *p = T;
  74. while( p != NULL )
  75. {
  76. if ( p->data == key )
  77. {
  78. flag = 1;
  79. break;
  80. }
  81. else if( key < p->data )
  82. {
  83. p = p->LChild;
  84. }
  85. else
  86. {
  87. p = p->RChild;
  88. }
  89. }
  90. return( flag );
  91. }//SearchBST
  92. //创建一个顺序表
  93. void Create(Sstable &ST, int n)
  94. {
  95. int i;
  96. printf("请输入顺序表元素(用空格隔开):\n");
  97. for(i = 1;i <= n;i++)
  98. {
  99. scanf("%d", &ST.elem[i].key);
  100. }
  101. }
  102. //静态查找表算法
  103. int Search_Seq(Sstable ST, keytype key)
  104. {
  105. int i = ST.length;
  106. ST.elem[0].key = key;
  107. while(i >= 0)
  108. {
  109. if(key == ST.elem[i].key)
  110. {
  111. return i;
  112. }
  113. i--;
  114. }
  115. }
  116. //折半查找
  117. int Search_Bin(Sstable ST,keytype key)
  118. {
  119. int low, high, mid;
  120. low = 1;
  121. high = ST.length;
  122. while(low <= high)
  123. {
  124. mid = (low + high)/2;
  125. if(key == ST.elem[mid].key)
  126. {
  127. return mid;
  128. }
  129. else if(key < ST.elem[mid].key)
  130. {
  131. high=mid-1;
  132. }
  133. else
  134. {
  135. low=mid+1;
  136. }
  137. }
  138. return 0;
  139. }
  140. //主函数
  141. int main()
  142. {
  143. Sstable ST;
  144. keytype key;
  145. int i;
  146. printf("***欢迎使用查找系统***\n");
  147. printf("请选择你要进行的操作:\n");
  148. printf("1.静态查找表算法\n");
  149. printf("2.折半查找\n");
  150. printf("3.二叉树查找\n");
  151. printf("请选择:");
  152. scanf("%d", &i);
  153. switch (i) {
  154. case 1: {//静态查找表算法
  155. printf("新建顺序表\n请输入长度:");
  156. scanf("%d",&ST.length);
  157. Create(ST,ST.length);
  158. printf("请输入想要查找的元素:\n");
  159. scanf("%d", &key);
  160. i = Search_Seq(ST, key);
  161. if(i)
  162. {
  163. printf("元素位置在:%d\n", i);
  164. }
  165. else
  166. {
  167. printf("元素不存在!\n");
  168. }
  169. break;
  170. }
  171. case 2: {//折半查找
  172. printf("新建有序顺序表\n请输入长度:");
  173. scanf("%d",&ST.length);
  174. Create(ST,ST.length);
  175. printf("请输入想要查找的元素:\n");
  176. scanf("%d", &key);
  177. i=Search_Bin(ST,key);
  178. if(i)
  179. {
  180. printf("元素位置在:%d\n",i);
  181. }
  182. else
  183. {
  184. printf("元素不存在!\n");
  185. }
  186. break;
  187. }
  188. case 3:{
  189. int arr[] = { 18, 3, 7, 20, 14, 19, 27, 2 };
  190. BST *T = ( BST * )malloc( sizeof( BST ) );
  191. CreateBST( T, arr, 8 );
  192. int flag, key;
  193. key = 10;
  194. flag = SearchBST( T, key );
  195. if( flag == 0 )
  196. {
  197. printf( "failure : %d is not on the BST\n", key );
  198. }
  199. else
  200. {
  201. printf( "success : %d is on the BST\n", key );
  202. }
  203. key = 19;
  204. flag = SearchBST( T, key );
  205. if( flag == 0 )
  206. {
  207. printf( "failure : %d is not on the BST\n", key );
  208. }
  209. else
  210. {
  211. printf( "success : %d is on the BST\n", key );
  212. }
  213. return 0;
  214. break;
  215. }
  216. case 0: {
  217. printf("期待下次使用!\n");
  218. break;
  219. }
  220. }
  221. return 0;
  222. }

4.运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/613025
推荐阅读
相关标签
  

闽ICP备14008679号