当前位置:   article > 正文

数据结构实验-顺序表的查找_实验9-1:实现顺序查找的算法 目的:领会顺序查找的过程和算法设计。 内容:编写一个

实验9-1:实现顺序查找的算法 目的:领会顺序查找的过程和算法设计。 内容:编写一个

(1)实验要求:

掌握常用的查找方法,了解各种查找方法的过程及其依据的原则,并掌握各种查找方法的效率的分析方法。

(2)实验内容:

必做:随机产生一组m到n之间的一组整数,根据这一组整数完成如下操作:

建立一个顺序表,输入一个关键字,对该表进行顺序查找和折半查找。

选做:从键盘读入一组数据,建立二叉排序树并对其进行查找、遍历、插入、删除等有关操作。

顺序查找就是从头开始扫一遍,找到该元素

折半查找就是二分,每次均分两半找到该元素,折半查找是对有序顺序表的操作。这个实验我们随机生成的一组数据没有顺序,所有需要我们先对其进行排序,然后才能用二分进行查找。搜索该元素是否在序列中。

C++有lower_bound和upper_bound函数,可以直接二分

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

顺序表的建立和初始化

  1. #define ListInitSize 100//初始时线性表的内存
  2. #define ListIncerment 10//当内存不足时追加的内存
  3. typedef struct
  4. {
  5. int *base;
  6. int length;
  7. int listsize;
  8. }SqList;
  9. //初始化操作
  10. void InitSqList(SqList &L)
  11. {
  12. L.base = (int*)malloc(ListInitSize*sizeof(int));
  13. if(!L.base){
  14. cout << "分配失败";
  15. return ;
  16. }
  17. L.length = 0;
  18. L.listsize = ListInitSize;
  19. }

顺序查找

  1. //顺序查找
  2. void sxcz(SqList L,int a)
  3. {
  4. cout << "顺序查找" << endl;
  5. bool flag = 0;
  6. for(int i = 0;i < L.length;i++){
  7. if(L.base[i] == a){
  8. cout << "找到该元素" << endl;
  9. flag = 1;
  10. }
  11. }
  12. if(!flag)
  13. cout << "没有找到给元素" << endl;
  14. }

折半查找代码

  1. //折半查找
  2. void zbcz(SqList L,int a)
  3. {
  4. cout << "折半查找" << endl;
  5. int l = 0;
  6. int r = L.length-1;
  7. int mid;
  8. bool flag = 0;
  9. while(l <= r){
  10. mid = (l+r)/2;
  11. // cout << mid <<endl;
  12. if(a == L.base[mid]){
  13. cout << "找到该元素" << endl;
  14. flag = 1;
  15. break;
  16. }
  17. else if(a < L.base[mid])
  18. r = mid-1;
  19. else
  20. l = mid+1;
  21. }
  22. if(!flag)
  23. cout << "没有找到该元素" << endl;
  24. }

主程序

  1. SqList L;
  2. InitSqList(L);
  3. srand(unsigned(time(0)));//用系统时间做伪随机数种子
  4. int n;
  5. cout << "请输入需要插入元素的个数:";
  6. cin >> n;
  7. int x,y;
  8. cout << "请输入需要限制的元素范围m和n:";
  9. cin >> x >> y;
  10. if(x > y)
  11. swap(x,y);
  12. for(int i = 0;i < n;i++){
  13. L.base[i] = rand() % (y-x) + x;
  14. L.length++;
  15. cout << L.base[i] << " ";
  16. }
  17. cout << endl;
  18. cout << "请输入需要查找的元素:";
  19. int a;
  20. cin >> a;
  21. sxcz(L,a);
  22. paixu(L);
  23. cout << "排序后的元素顺序"<< endl;
  24. for(int i = 0;i < L.length;i++){
  25. cout << L.base[i] << " ";
  26. }
  27. cout << endl;
  28. zbcz(L,a);

选做题

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef struct BiTNode {
  5. int data;
  6. struct BiTNode *leftchild, *rightchild;
  7. }BiTnode,*BiTree;
  8. //查找
  9. bool searchBST(BiTree T,int key,BiTree f,BiTree &p)
  10. {
  11. if (!T)
  12. {
  13. p = f;
  14. return false;
  15. }
  16. else if (key == T->data)
  17. {
  18. p = T;
  19. return true;
  20. }
  21. else if (key < T->data)
  22. return searchBST(T->leftchild, key, T, p);
  23. else
  24. return searchBST(T->rightchild, key, T, p);
  25. }
  26. //插入
  27. bool insertBST(BiTree &T, int key)
  28. {
  29. BiTree p, s;
  30. if (!searchBST(T, key, NULL, p))
  31. {
  32. s = (BiTree)malloc(sizeof(BiTNode));
  33. s->data = key;
  34. s->leftchild = s->rightchild = NULL;
  35. if (!p)
  36. T = s;
  37. else if(key < p->data)
  38. p->leftchild = s;
  39. else
  40. p->rightchild = s;
  41. return true;
  42. }
  43. else
  44. return false;
  45. }
  46. //删除
  47. bool Delete(BiTree &p)
  48. {
  49. BiTree q, s;
  50. if (p->rightchild == NULL) //右子树空,则重接左子树
  51. {
  52. q = p;
  53. p = p->leftchild;
  54. free(q);
  55. }
  56. else if (p->leftchild == NULL) //左子树空,则重接右子树
  57. {
  58. q = p; p = p->rightchild; free(q);
  59. }
  60. else //两个子树都是非空的
  61. {
  62. q = p; s = p->leftchild;
  63. while (s->rightchild)
  64. {
  65. q = s;
  66. s = s->rightchild;
  67. }
  68. p->data = s->data;
  69. if (q != p)
  70. q->rightchild = s->leftchild;
  71. else
  72. q->leftchild = s->leftchild;
  73. free(s);
  74. }
  75. return true;
  76. }
  77. bool deleteBST(BiTree &T,int key)
  78. {
  79. if (!T)
  80. return false;
  81. else
  82. {
  83. if (key == T->data)
  84. return Delete(T);
  85. else if (key < T->data)
  86. return deleteBST(T->leftchild, key);
  87. else
  88. return deleteBST(T->rightchild, key);
  89. }
  90. }
  91. void InOrderTraverse(BiTree T)
  92. {
  93. if (T)
  94. {
  95. InOrderTraverse(T->leftchild);
  96. printf("%d ", T->data);
  97. InOrderTraverse(T->rightchild);
  98. }
  99. }
  100. int main()
  101. {
  102. //二叉树的创建
  103. int n;
  104. cout << "输入二叉树的节点个数:";
  105. cin >> n;
  106. BiTree T = NULL;
  107. cout << "开始建树BST,请输入" << n << "个节点\n";
  108. for (int i = 0; i < n; i++)
  109. {
  110. int a;
  111. cin >> a;
  112. insertBST(T, a);
  113. }
  114. cout << "中序遍历\n";
  115. InOrderTraverse(T);
  116. cout << endl;
  117. //二叉树的查找与插入
  118. BiTree f = NULL;
  119. BiTree p;
  120. cout << "请输入需要查找的值:";
  121. int key;
  122. cin >> key;
  123. if (searchBST(T, key, f, p))
  124. cout << "该元素在二叉排序树中\n";
  125. else
  126. {
  127. cout << "该元素不在二叉排序树中\n";
  128. }
  129. //二叉树的删除
  130. cout << "请输入想要删除的元素:";
  131. cin >> key;
  132. if (searchBST(T, key, f, p))
  133. {
  134. deleteBST(T, key);
  135. cout << "删除后的中序遍历: \n";
  136. InOrderTraverse(T);
  137. cout << endl;
  138. }
  139. else
  140. cout << "该元素不在二叉排序树中\n";
  141. }

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

闽ICP备14008679号