数据结构->查找
来源:互联网 发布:网络管理员好考吗 知乎 编辑:程序博客网 时间:2024/06/13 01:57
1.输入一批有序的整形数值,利用折半插找的算法实现查找某数的过程。
2.利用一批数据(不超过13个数),构建一棵二叉排序树,并实现中序遍历该树。
3.将上面的数据利用长度为15的哈希表存储,输出存储后的哈希表。哈希函数采用key%13。
4.根据全班学生的姓名,用拉链法解决碰撞的方法构造一个散列表,选择适当的散列函数,设计并实现插入、删除和查找算法。
5.设计主函数,上机实现。
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxn 100using namespace std;#define N 30typedef struct node1{ char name[20]; struct node1 *next;} NODE;NODE *HashTable[N];typedef struct node{ int data; struct node *lchild,*rchild;} dsnode,*dstree;int data[maxn];int hs (int data[],int n,int t){ data[0]=t; int r=n,l=0; int mid; while(r>=l) { mid=(r+l)/2; if(data[mid]==t) return mid; else if(data[mid]>t) r=mid-1; else l=mid+1; } return 0;}void charu(dstree &T,int t){ dsnode *S; if(!T) { S=(dsnode *)malloc(sizeof(dsnode)); // printf("%p\n",S); S->data=t; S->lchild=NULL; S->rchild=NULL; T=S; } else if(t<T->data) charu(T->lchild,t); else if(t>T->data) charu(T->rchild,t);}void creat(dstree &T){ int data; scanf("%d",&data); while(data!=-1) { charu(T,data); scanf("%d",&data); } //printf("%p\n",T);}int s[15],cnt=0;int tt[15];void bianli(dstree T){ if(T) { bianli(T->lchild); printf("%d ",T->data); s[cnt++]=T->data; bianli(T->rchild); }}void H(int key){ int f=key%13; if(tt[f]==0) tt[f]=key; else { for(int i=1; i<15; i++) { f=(f+i)%15; if(tt[f]==0) { tt[f]=key; break; } } }}int hh(char name[]){ int gg=1; for(int i=0; i<strlen(name); i++) gg=gg+(name[i]*2); return gg%N;}int searchh(char name[]){ int hs=hh(name); NODE *s=HashTable[hs]; int i=1; for(; s!=NULL; s=s->next) { i++; if(strcmp(s->name,name)==0) return i; } return -1;}void creathashmap(dstree T){ for(int i=0; i<=15; i++) tt[i]=0; for(int i=0; i<cnt; i++) H(s[i]);}void crhash(char name[]){ int hasht; hasht=hh(name); NODE *h=(NODE *)malloc(sizeof(NODE)); strcpy(h->name,name); h->next=HashTable[hasht]; HashTable[hasht]=h;}int delhh(char name[]){ int hs=hh(name); NODE *p=HashTable[hs],*s=HashTable[hs]; int i=0; for(; s!=NULL; s=s->next) { i++; if(strcmp(s->name,name)==0) { p->next=s->next; return 1; free(s); } p=s; } return -1;}int main(){ int n,t,i; //折半 scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&data[i]); printf("请输入要查找的数\n"); scanf("%d",&t); printf("查找%d的结果为:\n",t); if(hs(data,n,t)!=0) printf("%d的位置为%d\n",t,hs(data,n,t)); else printf("查无此数\n"); printf("请输入要查找的数\n"); scanf("%d",&t); printf("查找%d的结果为:\n",t); if(hs(data,n,t)!=0) printf("%d的位置为%d\n",t,hs(data,n,t)); else printf("查无此数\n"); //排序二叉树 dstree T=NULL; creat(T); printf("中序遍历结果为 :"); bianli(T); printf("\n"); creathashmap(T); printf("创建散列表结果为 :"); for(int i=0;i<15;i++) printf("%d ",tt[i]); printf("\n"); getchar(); char name[20]; printf("输入要创建hashmap的姓名\n"); gets(name); while(strcmp(name,"end")!=0) { crhash(name); gets(name); } //search hash printf("\n查找tony\n"); int kk=searchh("tony"); if(kk==-1) printf("无此人\n"); else printf("此人存在于hashmap%d的第%d个\n",hh(name),kk); printf("\n删除tony\n"); kk=delhh("tony"); if(kk==-1) printf("无此人\n"); else printf("删除成功\n"); printf("\n再次查找tony\n");kk=searchh("tony"); if(kk==-1) printf("无此人\n"); else printf("此人存在于hashmap%d的第%d个\n",hh(name),kk); return 0;}/*102 3 6 9 15 18 19 52 62 6962908956324353635286957565-1asfdsdsgsdjhsdfjksdfkjsdjkdsfjlslkfkjrferjfksjktonysdjfldfkllskdjffdsjsdlljjend*/
阅读全文