用VS2019写C++遇到的问题

LHZ12138 2019-12-17 04:04:24
变量值传递给CreateHT之后回到main函数,p被莫名奇妙改变了。
百思不得其解,求大神解答。


//哈希表的创建,插入,删除和查找
//哈希函数采用除留余数法
//解决冲突的方法用开放地址法中的线性探测法和拉链法
#include<iostream>
using namespace std;
typedef struct node
{
int key;
struct node* next;
}NodeType;//单链表结点类型
typedef struct
{
NodeType* firstp;//首结点指针
}HashTable;
void InsertHT(HashTable ha[], int& n, int p, int k);//将关键字插入到哈希表中
void CreateHT(HashTable ha[], int& n, int m, int p, int keys[], int n1);//创建哈希表
bool DeleteHT(HashTable ha[], int& n, int p, int k);//删除哈希表中的关键字k
void SearchHT(HashTable ha[], int p, int k);//查找关键字k
void ASL(HashTable ha[], int n, int m);//求ASL
int main()
{
int n, m;
int p = 13;
m = 13;
HashTable ha[10];
int keys[13] = {16,74,60,43,54,90,46,31,29,88,77};
CreateHT(ha, n, m, p, keys, 13);
DeleteHT(ha, n,p, 7) ? cout << "成功!" <<endl: cout << "失败" << endl;
SearchHT(ha,p, 21);
ASL(ha, n, m);
return 0;
}

void CreateHT(HashTable ha[], int& n, int m, int p, int keys[], int n1)
{
for (int i = 0; i < m; i++)
ha[i].firstp = nullptr;
n = 0;
for (int j = 0; j < n1; j++)
InsertHT(ha, n, p, keys[j]);
}
void InsertHT(HashTable ha[], int& n, int p, int k)
{
int adr = k % p;
NodeType* tmp=new NodeType;
tmp->key = k;
tmp->next = nullptr;
if (ha[adr].firstp == nullptr)
ha[adr].firstp = tmp;
else
{
tmp->next = ha[adr].firstp;
ha[adr].firstp = tmp;
}
n++;
}
bool DeleteHT(HashTable ha[], int& n, int p, int k)
{
int adr = k % p;
NodeType* q = ha[adr].firstp,*pre;
if (!q)
return false;
if (q->key == k)
{
ha[adr].firstp = q->next;
delete q;
n--;
return true;
}
pre = q; q = q->next;
while (q != nullptr && q->key != k)
{
pre = q;
q = q->next;
}
if (q == nullptr)
return false;
else
{
pre->next = q->next;
delete q;
n--;
return true;
}
}
void SearchHT(HashTable ha[], int p, int k)
{
int adr = k % p;
NodeType* ptr = ha[adr].firstp;
int i = 0;
while (ptr != nullptr && ptr->key != k)
{
ptr = ptr->next;
i++;
}
if (ptr == nullptr)
cout << "失败:" << "关键字" << k << "比较" << i << "次" << endl;
else
cout << "失败:" << "关键字" << k << "比较" << i << "次" << endl;
}
void ASL(HashTable ha[], int n, int m)
{
NodeType* p;
int succ = 0, unsucc = 0;
int s;
for (int i = 0; i < m; i++)
{
s = 0;
p = ha[i].firstp;
while (p != nullptr)
{
s++;
p = p->next;
succ += s;
}
unsucc += s;
}
cout << "成功ASL=" << succ * 1.0 / n << endl;
cout << "不成功ASL=" << unsucc * 1.0 / m << endl;
}
...全文
436 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhshang 2019-12-24
  • 打赏
  • 举报
回复
就用上2019了呀,太时尚了
LHZ12138 2019-12-18
  • 打赏
  • 举报
回复
感谢感谢感谢。
铖邑 2019-12-17
  • 打赏
  • 举报
回复
ha只有10个元素,m是13明显就越界了

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧