這個哈希表程式出了點問題 不能實作哈希表的洗掉功能 會有隨機值輸出
跪求大神幫我看一下改怎么改

下面是源代碼:
#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 25
typedef 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);
}
uj5u.com熱心網友回復:
哈希表 不能 太滿, 否則 沖突 不斷 !uj5u.com熱心網友回復:
除錯是程式必須要掌握的技能之一uj5u.com熱心網友回復:
先單步跟蹤一下,看哪里有問題uj5u.com熱心網友回復:
不要依賴除錯器輸出復雜資料結構!而要將復雜資料結構的整個內容在處理它的每一步使用一小段代碼按自己很容易理解的格式輸出,非常有助于除錯!或者可以說是“基礎設施”參考下面:十字鏈表交換任意兩個節點C源代碼(C指標應用終極挑戰)http://download.csdn.net/detail/zhao4zhong1/5532495
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/73870.html
標籤:基礎類
