string指针问题,使用哈希表维护电话簿,蒟蒻求调
  • 板块学术版
  • 楼主isop
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/23 19:24
  • 上次更新2024/4/23 21:18:10
查看原帖
string指针问题,使用哈希表维护电话簿,蒟蒻求调
1071516
isop楼主2024/4/23 19:24

正文代码insert函数处;在为name赋值时出错

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int hashlength=11;

int position(int num)//求地址,取余 
{
	return num%hashlength;
}

typedef struct node
{
	string name;
	ll num,key;
	//int comparation;
	int flag=0;//是否存过 
}elemtype;

typedef struct
{
	elemtype *base;//首地址
	int count;
	int length; 
}hash;

void init(hash &h)
{
	h.base=(elemtype*)malloc(hashlength*sizeof(elemtype));//分配内存
	h.length=hashlength;
	for(int i=0;i<hashlength;i++)
	{
		h.base[i].key=NULL;//初始化 
	} 
}

void insert(hash &h,ll innum,string inname,ll inkey)//插入,新建联系人
{
	int address=position(inkey);
	while(h.base[address].flag==1)//冲突 
	{
		address=(address++)%hashlength;
	}
	h.base[address].num=innum;
	//str1.assign(str2); 使str1=str2
	h.base[address].name.assign(inname);//此处出错
	h.base[address].flag=1;
	return;
}

int search(hash &h,ll inkey)//此处不能return -1; 
{
	int address=position(inkey);
	if(h.base[inkey].flag==0) return 0;//为空 
	//int findtime=1;//查询次数 
	address=(address++)%hashlength;//从下一地址开始查找
	while(h.base[address].key!=inkey||h.base[address].flag==1) 
	{
		//findtime++;
		if(address==position(inkey)||h.base[address].key==NULL) return 0;//不存在 
		address=(address++)%hashlength;
	}
	cout<<address<<endl;
	return address;
}

void searchpro(hash &h)
{
	cout<<"请输入查询联系人的首字母(大写):";
	char x;
	cin>>x;
	int inkey=int(x);
	int address=position(inkey),findtime=0;//查询次数
	address=(address++)%hashlength;//从下一地址开始查找
	while(address!=position(inkey))//查找完一轮
	{
		if(h.base[address].key==inkey) 
		{
			findtime++;
			cout<<h.base[address].name<<" "<<h.base[address].num<<endl;	
		}
	}
	if(findtime==0)
	{
		cout<<"联系人不存在"<<endl;
	}
}

void create(hash &h)
{
	cout<<"输入姓名、号码:";
	string inname;
	ll innum,inkey;
	cin>>inname>>innum;
	inkey=int(inname[0]);
	if(search(h,inkey)) cout<<"已有此记录"<<endl;
	else 
	{
		cout<<"录入成功"<<endl; 
		insert(h,innum,inname,inkey);
	}
}

int main()
{
	hash hashtable;
	init(hashtable);
	int n;
	cout<<"哈希表长度为11"<<endl;
	cout<<"请输入操作次数:"; 
	cin>>n;
	while(n)
	{
		n--;
		cout<<"新建联系人请按 1 ,查询请按 2 :";
		int a;
		cin>>a;
		if(a==1) 
		{
			create(hashtable);
			continue;
		}
		else if(a==2) searchpro(hashtable);
		else 
		{
			cout<<"请重新输入,";
			continue;  
		}
	}
}
2024/4/23 19:24
加载中...