[关闭]
@yudesong 2017-06-24T15:51:07.000000Z 字数 2875 阅读 570

查找

数据结构 查找


1. 二分查找算法
  1. //二分法查找算法,要求待排序的数已经按照从小到大排好了
  2. int binSearch(int *a,int len,int value)
  3. {
  4. int mid,left,right;
  5. left=0;
  6. right=len-1;
  7. while(left<=right)
  8. {
  9. mid=(left+right)/2;
  10. if(a[mid]==value) return mid;
  11. if(a[mid]>value) right=mid-1;
  12. if(a[mid]<value) left=mid+1;
  13. }
  14. return -1;
  15. }
2. 顺序查找
  1. int seqSearch(int *a,int len,int value)
  2. {
  3. int i=0;
  4. while(i<len)
  5. {
  6. if(a[i]==value) return i;
  7. if(a[i]!=value) i++;
  8. }
  9. return -1;
  10. }
3. 二叉查找
  1. /* 二叉树的二叉链表结点结构定义 */
  2. typedef struct BiTNode /* 结点结构 */
  3. {
  4. int data; /* 结点数据 */
  5. struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
  6. } BiTNode, *BiTree;
  7. /* 递归查找二叉排序树T中是否存在key, */
  8. /* 指针f指向T的双亲,其初始调用值为NULL */
  9. /* 若查找成功,则指针p指向该数据元素结点,并返回TRUE */
  10. /* 否则指针p指向查找路径上访问的最后一个结点并返回FALSE */
  11. Status SearchBST(BiTree T, int key, BiTree f, BiTree *p)
  12. {
  13. if (!T) /* 查找不成功 */
  14. {
  15. *p = f;
  16. return FALSE;
  17. }
  18. else if (key==T->data) /* 查找成功 */
  19. {
  20. *p = T;
  21. return TRUE;
  22. }
  23. else if (key<T->data)
  24. return SearchBST(T->lchild, key, T, p);
  25. /* 在左子树中继续查找 */
  26. else
  27. return SearchBST(T->rchild, key, T, p);
  28. /* 在右子树中继续查找 */
  29. }
  30. /* 当二叉排序树T中不存在关键字等于key的数据元素时, */
  31. /* 插入key并返回TRUE,否则返回FALSE */
  32. Status InsertBST(BiTree *T, int key)
  33. {
  34. BiTree p,s;
  35. if (!SearchBST(*T, key, NULL, &p))
  36. {
  37. s = (BiTree)malloc(sizeof(BiTNode));
  38. s->data = key;
  39. s->lchild = s->rchild = NULL;
  40. if (!p)
  41. *T = s; /* 插入s为新的根结点 */
  42. else if (key<p->data)
  43. p->lchild = s; /* 插入s为左孩子 */
  44. else
  45. p->rchild = s; /* 插入s为右孩子 */
  46. return TRUE;
  47. }
  48. else
  49. return FALSE;
  50. /* 树中已有关键字相同的结点,不再插入 */
  51. }
  52. /*若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点*/
  53. /* 并返回TRUE;否则返回FALSE。 */
  54. Status DeleteBST(BiTree *T,int key)
  55. {
  56. if(!*T) /* 不存在关键字等于key的数据元素 */
  57. return FALSE;
  58. else
  59. {
  60. if (key==(*T)->data) /* 找到关键字等于key的数据元素 */
  61. return Delete(T);
  62. else if (key<(*T)->data)
  63. return DeleteBST(&(*T)->lchild,key);
  64. else
  65. return DeleteBST(&(*T)->rchild,key);
  66. }
  67. }
  68. /* 从二叉排序树中删除结点p,并重接它的左或右子树。 */
  69. Status Delete(BiTree *p)
  70. {
  71. BiTree q,s;
  72. /* 右子树空则只需重接它的左子树(待删结点是叶子也走此分支) */
  73. if((*p)->rchild==NULL)
  74. {
  75. q=*p; *p=(*p)->lchild; free(q);
  76. }
  77. else if((*p)->lchild==NULL) /* 只需重接它的右子树 */
  78. {
  79. q=*p; *p=(*p)->rchild; free(q);
  80. }
  81. else /* 左右子树均不空 */
  82. {
  83. q=*p; s=(*p)->lchild;
  84. /* 转左,然后向右到尽头(找待删结点的前驱) */
  85. while(s->rchild)
  86. {
  87. q=s;
  88. s=s->rchild;
  89. }
  90. (*p)->data=s->data;
  91. /* s指向被删结点的直接前驱(将被删结点前驱的值取代被删结点的值) */
  92. if(q!=*p)
  93. q->rchild=s->lchild; /* 重接q的右子树 */
  94. else
  95. q->lchild=s->lchild; /* 重接q的左子树 */
  96. free(s);
  97. }
  98. return TRUE;
  99. }
4. 哈希查找
  1. #define MaxSize 100
  2. typedef struct
  3. {
  4. int key;
  5. char *data;
  6. int count;
  7. }HashTbale[MaxSize];
  8. void createHT(HashTbale ha,int x[],int n,int m,int p)
  9. {
  10. int i,n1=0;
  11. for(i=0;i<m;i++)
  12. {
  13. ha[i].key=-1;
  14. ha[i].count=0;
  15. }
  16. for(i=0;i<n;i++)
  17. insertHT(ha,n1,x[i],p);
  18. }
  19. void insertHT(HashTbale ha,int &n,int k,int p)
  20. {
  21. int i,adr;
  22. adr=k%p;
  23. if(ha[adr].key==-1||ha[adr].key==-2)
  24. {
  25. ha[adr].key=k;
  26. ha[adr].count=1;
  27. }
  28. else
  29. {
  30. i=1;
  31. do
  32. {
  33. adr=(adr+1)%p;
  34. i++;
  35. }while(ha[adr].key!=-1&&ha[adr].key!=-2);
  36. ha[adr].key=k;
  37. ha[adr].count=i;
  38. }
  39. }
  40. int searchHT(HashTbale ha,int p,int key)
  41. {
  42. int i=0,adr;
  43. adr=k%p;
  44. while(ha[adr].key!=-1&&ha[adr].key!=k)
  45. {
  46. i++;
  47. adr=(adr+1)%p;
  48. }
  49. if(ha[adr].key==k) return adr;
  50. else return -1;
  51. }
  52. int deleteHT(HashTbale ha,int p,int k,int &n)
  53. {
  54. int adr;
  55. adr=searchHT(ha,p,k);
  56. if(adr!=-1)
  57. {
  58. ha[adr].key=-2;
  59. n--;
  60. }else
  61. {
  62. return 0;
  63. }
  64. }
  65. int main()
  66. {
  67. int x[]={16,74,60,43,54,,90,46,31,29,88,77};
  68. int n=11,m=13,p=13,i,k=29;
  69. HashTbale ha;
  70. createHT(ha,x,n,m,p);
  71. i=searchHT(ha,p,k);
  72. if(i!=-1)
  73. {
  74. printf("ha[%d].key=%d\n",i,k);
  75. }
  76. k=77;
  77. deleteHT(ha,p,k,n);
  78. return 0;
  79. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注