数据结构->查找

1.输入一批有序的整形数值,利用折半插找的算法实现查找某数的过程。

2.利用一批数据(不超过13个数),构建一棵二叉排序树,并实现中序遍历该树。

3.将上面的数据利用长度为15的哈希表存储,输出存储后的哈希表。哈希函数采用key%13。

4.根据全班学生的姓名,用拉链法解决碰撞的方法构造一个散列表,选择适当的散列函数,设计并实现插入、删除和查找算法。

5.设计主函数,上机实现。  

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 100
using namespace std;
#define N 30
typedef 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;
}
/*
10
2 3 6 9 15 18 19 52 62 69
62
90
89
56
32
43
53
63
52
86
95
75
65
-1
asfdsdsgsd
jhsdfjksdf
kjsdjk
dsfjlsl
kfkjrfer
jfksjk
tony
sdjfl
dfkll
skdjf
fdsjsd
ll
jj
end
*/


猜你喜欢

转载自blog.csdn.net/yangdelu855/article/details/78898074