哈希表的基本运算(链表实现)

来源:互联网 发布:淘宝低于5元不计销量 编辑:程序博客网 时间:2024/06/07 05:23

// 哈希表的基本运算.cpp :定义控制台应用程序的入口点。

#include "stdafx.h"

typedef int KeyType;

const int NUM = 10;//0-9下表的数组用来存放不同索引值

#include

struct  HashTable

{

   KeyTypekey;

   HashTable*next;

   HashTable*head;//头结点

};

 

void Initial(KeyType a[],intn)//初始化数据

{

  cout<<"请输入"<<n<<"个测试数据"<<endl;

   for (int i =0; i < n; i++)

   {

     cin>>a[i];

   }

}

 

void CreateHT(HashTable ht[],KeyType a[],intn)//采用头插法建立哈希表

{

   for (int i =0; i < NUM; i++)

   {

     ht[i].head = new HashTable;

     ht[i].head->next = NULL;//初始化数据

   }

   for (int i =0; i < n; i++)//采用带有头结点的头插法

   {

     int n = a[i] % NUM;

     //HashTable *head = new HashTable;

     HashTable * p = new HashTable;

     p->key = a[i];

     p->next = ht[n].head->next;

     ht[n].head->next = p;

     //ht[n].head = head;

   }

}

 

void display(HashTable ht[])//输出信息

{

   for (int i =0; i < NUM; i++)

   {

     cout<<"索引为"<<i<<"的数据有:";

      HashTable *p= ht[i].head->next;

      while (p !=NULL)

     {

       cout<<p->key<<" ";

       p = p->next;

     }

  cout<<endl;

   }

}

 

void add(HashTable ht[],KeyTypedata)//插入数据

{

   int n = data% NUM;

   HashTable * p= new HashTable;

   p->key =data;

   p->next =ht[n].head->next;

  ht[n].head->next = p;

}

 

int Remove(HashTable ht[],KeyType data)

{

   int n = data% NUM;

   HashTable *p= ht[n].head;

   while (p !=NULL)

   {

     HashTable *q = p;//q用来保存待删点的前一个点

     p = p->next;

     if(p->key == data)

     {

       if(p->next == NULL)//如果是所在索引表的最后一个元素

       {

          q->next = NULL;

       }

       else

       {

          q->next = p->next;

       }

       delete(p);

       return 1;//删除成功

     }

   }

   return0;//删除失败

}

 

int _tmain(int argc, _TCHAR* argv[])

{

   HashTableht[NUM];

   HashTableTest[NUM];

   intn;

   KeyTypea[20];//假设数组长度不超过20

  cout<<"请输入测试数组的个数(这里假设小于20:"<<endl;

  cin>>n;

  Initial(a,n);

  CreateHT(ht,a,n);

  cout<<"插入数据前,数据为:"<<endl;

  display(ht);

  add(ht,5);

  cout<<"插入数据5之后,数据为:"<<endl;

  display(ht);

  cout<<"删除数据5之后,数据为:"<<endl;

  Remove(ht,5);

  display(ht);

   return0;

}