这个哈希表程序出了点问题 不能实现哈希表的删除功能 会有随机值输出
跪求大神帮我看一下改怎么改
下面是源代码:
#include<stdio.h>
#include<string.h>
#define SUCCESS 1;
#define UNSUCCESS 0;
#define NULLKEY -1;
#define Tablelength 13;
#define p 13;//H(key)=key % p
#define MAXSIZE 25typedef int T;
template<class T>
struct ElemType
{
T key;//关键字
};
template <class T>
class LHSearch
{
private:
ElemType<T>*HT;//开放定址哈希表
int count;//当前数据元素个数
int size;//哈希表长度
public:
LHSearch();//
~LHSearch();//
void InitHashTable(int n);//
int Hash(T key);//计算哈希地址
void Collision(int &s);//冲突,计算下一个地址
int Search(T key,int &s);//哈希查找
int Insert(ElemType<T> e);//元素插入
int Delete(ElemType<T> e);//元素删除
void Display();//显示哈希表
};
template<class T>
LHSearch<T>::LHSearch()
{
HT=NULL;
size=0;
count=0;
}
template<class T>
LHSearch<T>::~LHSearch()
{
delete[] HT;
count=0;
}
template<class T>
int LHSearch<T>::Hash(T key)
{//由哈希函数求哈希地址
return key%p;
}
template<class T>
void LHSearch<T>::Collision(int &s)
{//开放定址解决冲突
s=s++;
}
template <class T>
int LHSearch<T>::Search(T key,int &s)
{//查找,找到返回
// int s;
s=Hash(key);
while ((HT[s].key!=-1)&&(key!=HT[s].key))
Collision(s);
if(HT[s].key==key)
return 1;
else
return 0;
}
template <class T>
int LHSearch<T>::Insert(ElemType<T> e)
{//插入元素
int s;
if(count==size)
{
printf("表满,不能插入!\n");
return UNSUCCESS;
}
else
{
s=Hash(e.key);
int f;
f=Search(e.key,s);
if(f)//表中已有和e的关键字相同的元素,不进行插入操作
{
printf("该元素已存在,不能插入!\n");
return UNSUCCESS;
}
else
{
HT[s].key=e.key;
printf("插入成功!\n");
count++;
return SUCCESS;
}
}
} template <class T>
int LHSearch<T>::Delete(ElemType<T> e)
{
//删除元素
int s,i;
if(count==NULL)
{
printf("表空,不能删除!\n");
return UNSUCCESS;
}
else
{
s=Hash(e.key);
int q;
q=Search(e.key,s);
if(q)
{
while(HT[s].key)
HT[s++].key=HT[s+1].key;
printf("删除成功!\n");
count--;
return SUCCESS;
}
else{
printf("该元素不存在,不能删除!\n");
return UNSUCCESS;
}
}
}
template<class T>
void LHSearch<T>::InitHashTable(int n)
{
size=n;
HT=new ElemType<T>[size];
for(int i=0;i<size;i++)//初始化,把哈希表置空
HT[i].key=NULLKEY;
}
template<class T>
void LHSearch<T>::Display()
{
int i;
for(i=0;i<size;i++)
if(HT[i].key!=-1)
printf("%d\t",i);
printf("\n");
for(i=0;i<size;i++)
if(HT[i].key!=-1)
printf("%d\t",HT[i].key);
printf("\n");
}
void main()
{
int m;
T key;
int s=0;
ElemType<int> e;
LHSearch<int> a;
printf("输入相应代码,必须先创建哈希表\n");
printf("\t| |\t\n");
printf("\t| 哈希表应用 |\t\n");
printf("\t| 欢迎使用! |\t\n");
printf("\t|================================================|\t\n");
printf("\t| |\t\n");
printf("\t|【1】-->建立!\t 【2】-->插入!\t 【3】-->删除! |\t\n");
printf("\t| |\t\n");
printf("\t| 【4】-->查找!\t 【5】-->退出! |\t\n");
printf("\t| |\t\n");
do
{
printf("请选择你想进行的操作:");
scanf("%d",&m);
switch(m)
{
case 1://创建查找表
//printf("请输入表容量:\n");
//scanf("%d",&m);
a.InitHashTable(MAXSIZE);
printf("依次输入表元素,-1结束:\n");
for(scanf("%d",&e.key);e.key!=-1;scanf("%d",&e.key))
a.Insert(e);
a.Display();
break;
case 2://插入元素
printf("依次输入要插入的元素:\n");
scanf("%d",&e.key);
a.Insert(e);
a.Display();
break;
case 3://删除元素
printf("输入要删除的元素:\n");
scanf("%d",&e.key);
a.Delete(e);
a.Display();
break;
case 4://查找元素
printf("输入查找关键字:\n");
scanf("%d",&key);
if(a.Search(key,s))
printf("找到!\n");
else
printf("不存在,未找到!\n");
break;
case 6://结束
printf("结束!感谢您的使用\n");
break;
}
}
while(m!=5);
}
跪求大神帮我看一下改怎么改
下面是源代码:
#include<stdio.h>
#include<string.h>
#define SUCCESS 1;
#define UNSUCCESS 0;
#define NULLKEY -1;
#define Tablelength 13;
#define p 13;//H(key)=key % p
#define MAXSIZE 25typedef int T;
template<class T>
struct ElemType
{
T key;//关键字
};
template <class T>
class LHSearch
{
private:
ElemType<T>*HT;//开放定址哈希表
int count;//当前数据元素个数
int size;//哈希表长度
public:
LHSearch();//
~LHSearch();//
void InitHashTable(int n);//
int Hash(T key);//计算哈希地址
void Collision(int &s);//冲突,计算下一个地址
int Search(T key,int &s);//哈希查找
int Insert(ElemType<T> e);//元素插入
int Delete(ElemType<T> e);//元素删除
void Display();//显示哈希表
};
template<class T>
LHSearch<T>::LHSearch()
{
HT=NULL;
size=0;
count=0;
}
template<class T>
LHSearch<T>::~LHSearch()
{
delete[] HT;
count=0;
}
template<class T>
int LHSearch<T>::Hash(T key)
{//由哈希函数求哈希地址
return key%p;
}
template<class T>
void LHSearch<T>::Collision(int &s)
{//开放定址解决冲突
s=s++;
}
template <class T>
int LHSearch<T>::Search(T key,int &s)
{//查找,找到返回
// int s;
s=Hash(key);
while ((HT[s].key!=-1)&&(key!=HT[s].key))
Collision(s);
if(HT[s].key==key)
return 1;
else
return 0;
}
template <class T>
int LHSearch<T>::Insert(ElemType<T> e)
{//插入元素
int s;
if(count==size)
{
printf("表满,不能插入!\n");
return UNSUCCESS;
}
else
{
s=Hash(e.key);
int f;
f=Search(e.key,s);
if(f)//表中已有和e的关键字相同的元素,不进行插入操作
{
printf("该元素已存在,不能插入!\n");
return UNSUCCESS;
}
else
{
HT[s].key=e.key;
printf("插入成功!\n");
count++;
return SUCCESS;
}
}
} template <class T>
int LHSearch<T>::Delete(ElemType<T> e)
{
//删除元素
int s,i;
if(count==NULL)
{
printf("表空,不能删除!\n");
return UNSUCCESS;
}
else
{
s=Hash(e.key);
int q;
q=Search(e.key,s);
if(q)
{
while(HT[s].key)
HT[s++].key=HT[s+1].key;
printf("删除成功!\n");
count--;
return SUCCESS;
}
else{
printf("该元素不存在,不能删除!\n");
return UNSUCCESS;
}
}
}
template<class T>
void LHSearch<T>::InitHashTable(int n)
{
size=n;
HT=new ElemType<T>[size];
for(int i=0;i<size;i++)//初始化,把哈希表置空
HT[i].key=NULLKEY;
}
template<class T>
void LHSearch<T>::Display()
{
int i;
for(i=0;i<size;i++)
if(HT[i].key!=-1)
printf("%d\t",i);
printf("\n");
for(i=0;i<size;i++)
if(HT[i].key!=-1)
printf("%d\t",HT[i].key);
printf("\n");
}
void main()
{
int m;
T key;
int s=0;
ElemType<int> e;
LHSearch<int> a;
printf("输入相应代码,必须先创建哈希表\n");
printf("\t| |\t\n");
printf("\t| 哈希表应用 |\t\n");
printf("\t| 欢迎使用! |\t\n");
printf("\t|================================================|\t\n");
printf("\t| |\t\n");
printf("\t|【1】-->建立!\t 【2】-->插入!\t 【3】-->删除! |\t\n");
printf("\t| |\t\n");
printf("\t| 【4】-->查找!\t 【5】-->退出! |\t\n");
printf("\t| |\t\n");
do
{
printf("请选择你想进行的操作:");
scanf("%d",&m);
switch(m)
{
case 1://创建查找表
//printf("请输入表容量:\n");
//scanf("%d",&m);
a.InitHashTable(MAXSIZE);
printf("依次输入表元素,-1结束:\n");
for(scanf("%d",&e.key);e.key!=-1;scanf("%d",&e.key))
a.Insert(e);
a.Display();
break;
case 2://插入元素
printf("依次输入要插入的元素:\n");
scanf("%d",&e.key);
a.Insert(e);
a.Display();
break;
case 3://删除元素
printf("输入要删除的元素:\n");
scanf("%d",&e.key);
a.Delete(e);
a.Display();
break;
case 4://查找元素
printf("输入查找关键字:\n");
scanf("%d",&key);
if(a.Search(key,s))
printf("找到!\n");
else
printf("不存在,未找到!\n");
break;
case 6://结束
printf("结束!感谢您的使用\n");
break;
}
}
while(m!=5);
}
参考下面:十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495