180 likes | 323 Views
2.7.1 基本概念 2.7.2 静态查找表 2.7.3 动态查找. 第 2 章 数据结构 2.7 查找. 第 2 章 数据结构 2.7 查找. 2.7.1 基本概念 查找 —— 又称检索 , 根据给定的值 , 在查找表中查找是否存在关键字等于给定的值 , 若存在一个或几个这样的记录 , 则称查找成功 , 查找的结果是对应记录在查找表中的位置或整个记录的值。若查找不成功,查找的结果可以给出一个特定的值或 “ 空 ” 指针。
E N D
2.7.1 基本概念 2.7.2 静态查找表 2.7.3 动态查找 第2章 数据结构 2.7 查找
第2章 数据结构 2.7查找 2.7.1基本概念 查找——又称检索,根据给定的值,在查找表中查找是否存在关键字等于给定的值,若存在一个或几个这样的记录,则称查找成功,查找的结果是对应记录在查找表中的位置或整个记录的值。若查找不成功,查找的结果可以给出一个特定的值或“空”指针。 查找表——存放同一类型的数据元素。每个数据元素由若干个数据项组成,其中有一个可以唯一地标识该记录的数据项称为主关键字(primary key)。当记录只有一个数据项时,它就是该记录的关键字。
2.7.2静态查找表 一、顺序表上顺序查找 顺序表的类型说明如下: #define MAXSIZE 100 #define KEYTYPE int typedef struct {KEYTYPE key; ……; }SSELEMENT; typedef struct {SSELEMENT r[MAXSIZE]; int len; }SSTABLE; 第2章 数据结构 2.7查找
第2章 数据结构 2.7查找 • 查找思路:从表的一端开始,顺序扫描查找表,依次将扫描到的记录关键字和给定值K比较,若当前记录的关键字与K相等,则查找成功,返回记录在表中的位置序号;若扫描结束仍未找到关键字等于K的记录,则查找不成功,返回0。 算法如下: int seq_search(KEYTYPE k,SSTABLE st) {int j; j=st.len; st.r[0].key=k; while(st.r[j].key!=k) j--; return j; }
第2章 数据结构 2.7查找 二、有序表查找 静态查找表中记录的关键字有序时,可以用二分查找(binary search)。它是一种查找效率较高的方法。 二分查找的算法思路: 每次将给定值K与有序表中间位置上的记录关键字比较,确定待查记录所在的范围,然后逐步缩小范围直到确定找到或找不到对应记录为止。设有序表ST中记录的关键字按升序排列,整型变量指针low和high分别指向有序表中待查记录所在范围的下界和上界,中间记录所在位置用mid指示,mid=「 (low+high) 」/2,K和mid所指的记录关键字st.r[mid].key比较,有三种可能的结果:
第2章 数据结构 2.7查找 (1)k<st.r[mid].key:待查记录如果存在,必定落在mid位置的左半部分,high=mid-1,继续在左半部分进行二分查找。 (2)k=st.r[mid].key:查找成功,mid所指记录就是查到的记录。 (3)k>st.r[mid].key:待查记录如果存在,必定落在mid位置的右半部分,low=mid+1,继续在右半部分进行二分查找。 出现查找区间的下界大于上界时,宣告查找失败
第2章 数据结构 2.7查找 • 算法如下: int search_bin(KEYTYPE k,SSTABLE st) {int low,high,mid; low=1; high=st.len; while(low<=high) {mid=(low+high)/2; if(k==st.r[mid].key) return mid; else if(k<st.r[mid].key) high=mid-1; else low=mid+1;} return 0; }
第2章 数据结构 2.7查找 2.7.3动态查找 若对表中记录经常进行插入和删除操作,用动态查找。 本节重点介绍二叉排序树查找: 二叉排序树(binary sort tree)如果非空,具有下列性质: (1)若它的左子树不空,则左子树上所有结点的关键字均小于它的根结点的关键字; (2)若它的右子树不空,则右子树上所有结点的关键字均大于它的根结点的关键字; (3)它的左子树、右子树分别也是二叉排序树
第2章 数据结构 2.7查找 二叉排序树实际上是增加了限制条件的特殊二叉树。 二叉排序树上的查找思路: 在一棵以二叉链表为存储结构的二叉排序树上,要找比某结点x小的结点,只需通过结点x的左指针到它的左子树中去找;而要找比某结点x大的结点,只需通过结点x的右指针到它的右子树中去找。 可以证明二叉排序树的中根遍历序列是按结点关键字递增排序的有序序列。
第2章 数据结构 2.7查找 二叉排序树的结点结构: #define KEYTYPE int; typedef stuct node {KEYTYPE key; struct node *lchild,*rchild; }BSTNODE;
第2章 数据结构 2.7查找 一、二叉排序树的生成和插入 按给定值在二叉排序树中查询 BSTNODE *searchnode(int w,BSTNODE *r) {BSTNODE *p; if(r==NULL) p=NULL; else {if(w==r->key) p=r; else if(w>r->key) p=searchnode(w,r->rchild); else p=searchnode(w,r->lchild);} return p; }
第2章 数据结构 2.7查找 将一个元素插入二叉排序树中 BSTNODE *insert_bst(int w,BSTNODE *p) {if(p==NULL) {p=malloc(sizeof(BSTNODE)); p->lchild=NULL; p->rchild=NULL; p->key=w;} else if(w>p->key) p->rchild=insert_bst(w,p->rchild); else p->lchild=insert_bst(w,p->lchild); return p; }
中序遍历二叉排序树,并显示遍历结果 void print_bst(BSTNODE *p) {if(p!=NULL) {print_bst(p->lchild); printf("%d ",p->key); if(p->lchild!=NULL) printf("<%d lchild:%d> ",p->key, p->lchild->key); else printf("<%d lchild=NULL> ",p->key); if(p->rchild!=NULL) printf("<%d rchild:%d>",p->key, p->rchild->key); else printf("<%d rchild=NULL>",p->key); printf("\n"); print_bst(p->rchild);} }
BSTNODE *creat_bst()//建立二叉排序树模块 {BSTNODE *root,*p; int loop=0,s; root=NULL; do {printf("\n"); scanf("%d",&s); if(s==0) loop=1; else {p=searchnode(s,root); if(p==NULL) {root=insert_bst(s,root); print_bst(root);} } if(root!=NULL) printf("root=%d\n",root->key); }while(!loop); return root; }
二叉排序树上的查找 void search_bst(BSTNODE *root) {int s;BSTNODE *p; printf("input you want:"); scanf("%d",&s); if(s!=0) {p=searchnode(s,root); if(p==NULL) printf("not exsit!"); else printf("exsit!");} }
实验六: 1、试一试有序表的二分查找算法 #define MAXSIZE 100 #define KEYTYPE int typedef struct {KEYTYPE key; }SSELEMENT; typedef struct {SSELEMENT r[MAXSIZE]; int len; }SSTABLE;
实验六: main() {KEYTYPE k;SSTABLE st;int a; st.len=10; st.r[1].key=5;st.r[2].key=12;st.r[3].key=30;st.r[4].key=45;st.r[5].key=70;st.r[6].key=73;st.r[7].key=80;st.r[8].key=85; st.r[9].key=89;st.r[10].key=100; scanf("%d",&k); a=search_bin(k,st); if(a) printf("location:%d\n",a ); else printf("not find\n"); }
实验六: 2、建立一棵二叉排序树并按中序遍历打印出来 #include <stdio.h> #include <stdlib.h> #define KEYTYPE int typedef struct node {KEYTYPE key; struct node *lchild,*rchild; }BSTNODE; main() {BSTNODE *root; root=creat_bst(); }