链地址法实现hash表,查找关键字,输出关键字

#include<iostream>
using namespace std;

typedef int KeyType;
const int MAXSIZE = 100;
struct ElemNode
{
    KeyType key;
    ElemNode *next;
};
class LinkHash
{
private:
    ElemNode *ht;
    int n;
    KeyType p;
public:
    LinkHash(int , int);
    ~LinkHash(){};
    int find(KeyType K);
    void creat_hash();
    void Printout();
};

LinkHash::LinkHash(int n1, int p1)
{
    n = n1;
    p = p1;
    ht = new ElemNode[n];
    for(int i=0; i<n; i++)
    {
        ht[i].key = 0;
        ht[i].next = nullptr;
    }
}
/*LinkHash::~LinkHash()*/
//{
    //for(int i=0; i<n; i++)
    //{
        //ht[i].key = 0;
        //while(ht[i].next != nullptr)
        //{
            //ElemNode *p =ht[i].next;
            //ElemNode *q = p->next;
            //if(q==nullptr)
            //{
                //delete p;
                //break;
            //}
            //while(q!=nullptr)
            //{
                //delete p;
                //p = q;
                //q = q->next;
            //}
        //}
    //}
/*}*/

int LinkHash::find(KeyType K)
{
    ElemNode *q;
    int i= K%p;
    if(ht[i].key == K)
        return i;
    q = ht[i].next;
    while(q!=nullptr && q->key != K)
        q = q->next;
    if(q!=nullptr && q->key == K)
        return i;
    else
        return -1;
}

void LinkHash::creat_hash()
{
    int i,j,K;
    ElemNode *r,*s,*q;
    cout<<"\n 请逐一输入各个关键字(-1结束)";
    cin>>K;
    while(K!=-1)
    {
        i = K%p;
        if(ht[i].key == 0)
        {
            ht[i].key = K;
            cout<<"\n 插入成功";
        }
        else if(ht[i].key == K)
            cout<<"\n查找成功,不再插入,位置在"<<i;
        else
        {
            q = ht[i].next;
            r = q;
            while(q!=nullptr && q->key!=K)
            {
                r = q;
                q = q->next;
            }
            if(q!=nullptr && q->key == K)
                cout<<"\n查找成功,不再插入,位置在  的外链上"<<i;
            else
            {
                s = new ElemNode;
                s->key = K;
                s->next = nullptr;
                if(ht[i].next == nullptr)
                    ht[i].next = s;
                else
                    r->next = s;
                cout<<"\n插入成功";
            }
        }
        cout<<"\n 请逐一输入各个关键字(-1结束)";
        cin>>K;
    }
}

void LinkHash::Printout()
{
    int i, j;
    ElemNode *r,*s;
    for(int i=0; i<n; i++)
    {
        cout<<"\n  i= ";
        if(ht[i].key != 0)
            cout<<"  key="<<ht[i].key;
        r = ht[i].next;
        while(r!=nullptr)
        {
            cout<<"\tkey= "<<r->key;
            r = r->next;
        }
    }
}

int main(int argc, char *argv[])
{
    int p0,n0,i;
    cout<<"\n 请输入n值(n应大于等于记录总数)";
    cin>>n0;
    cout<<"\n 请输入p值(p应不大于n的质数)";
    cin>>p0;
    LinkHash ha(n0,p0);
    ElemNode a;
    int k;
    char ch;
    cout<<"\n\n    1.建立哈希表(链地址法)";
    cout<<"\n    2.在哈希表中查找关键字";
    cout<<"\n    3.输出哈希表";
    cout<<"\n    4.结束程序";
    cout<<"\n------------------------------------------";
    cout<<"\n请输入你的选择(1,2,3,4)";
    cin>>k;
    while(k>0 && k<4)
    {
        switch(k)
        {
            case 1:
                ha.creat_hash();
                break;
            case 2:
                cout<<"\n 请输入待查找的关键字:";
                cin>>a.key;
                i=ha.find(a.key);
                if(i==-1)
                    cout<<"\n 关键字"<<a.key<<" 不存在";
                else
                    cout<<"\n 成功查找到"<<a.key<<" 位置在"<<i;
                break;
            case 3:
                ha.Printout();
                break;
            default:
                break;
        }
        cout<<"\n请输入你的选择(1,2,3,4)";
        cin>>k;
    }
    return 0;
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include #include typedef struct node { int data; struct node *next; }node; init_hash(node **A,int n) { int i; for(i=0;idata=0; A[i]->next=NULL; } } insert_hash(node **A,int value,int n) { int key; node *p,*q; key=value%n; if(A[key]->next!=NULL) { p=A[key]->next; while(p->next!=NULL) p=p->next; q=(node *)malloc(sizeof(node)); q->data=value; q->next=NULL; p->next=q; } else { q=(node *)malloc(sizeof(node)); q->data=value; q->next=NULL; A[key]->next=q; } } int search_hash(node **A,int value,int n) { int key; node *p; key=value%n; if(A[key]->next==NULL) return 0; else { p=A[key]->next; while(p!=NULL) { if(p->data==value) return 1; } return 0; } } delete_hash(node **A,int value,int n) { int key; node *p,*q; key=value%n; p=A[key]; q=A[key]->next; while(q->data!=value) { p=q; q=q->next; } p->next=q->next; free(q); } print_hash(node **A,int n) { int i; node *p; for(i=0;inext!=NULL) { p=A[i]->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } } } printf("\n"); } main() { int i,n,value,Case; node **A; printf("输入待排序元素个数:\n"); scanf("%d",&n); A=(node **)malloc(sizeof(node*)*n); //申请一个指针型数组A[n] init_hash(A,n);//初始化数组A printf("输入hash的值(空格键分开):\n"); for(i=0;i<n;i++) //建hash { scanf("%d",&value); insert_hash(A,value,n); } printf("请选择hash的操作\n1.查询\t2.插入\t3.删除\t4.输出\n"); scanf("%d",&Case); switch(Case) { case 1: { printf("请输入要查询的元素:"); scanf("%d",&value); printf(search_hash(A,value,n)?"Success!\n":"Failure!\n"); //查询 } case 2: { printf("请输入要插入的元素:"); scanf("%d",&value); insert_hash(A,value,n); //插入 } case 3: { printf("请输入要删除的元素:"); scanf("%d",&value); printf(search_hash(A,value,n)?"删除成功!\n":"中不存在该元素!\n"); delete_hash(A,value,n); } case 4: //输出 { printf("中元素为:\n"); print_hash(A,n); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值