简易散列表实现电话号码查询系统
問(wèn)題描述:按電話號(hào)碼和用戶名為關(guān)鍵字,建立散列表。實(shí)現(xiàn)查找用戶和顯示用戶信息。本案例在vs2012編譯通過(guò)。
1.頭文件 Hsah.h
#pragma once
#include<iostream>
using namespace std;
struct Node
{
char *name; //姓名
char *address;//地址
char *num;//電話
Node *pNext;
};
class Hsah
{
private:
Node *phone;//指針存儲(chǔ)散列表,鏈地址法
Node *nam;
public:
Hsah();
~Hsah();?
int hashphone(char * num); //電話號(hào)碼散列表函數(shù)
int hashname(char * name); //姓名的散列表函數(shù)
Node * push(char *pname,char *add,char *pnum);
void append(char *pname,char *add,char *pnum);//添加記錄
Node * findnum(char *pnum);//按號(hào)碼查找
Node * findname(char *pname);//按姓名查找
void showphone();
void showname();
};
2.Hsah.cpp文件
#include "Hsah.h"
Hsah::Hsah()
{
this->phone=new Node [20]; //分配數(shù)組空間存儲(chǔ)哈希表
this->nam=new Node [20];
for(int i=0;i<20;i++) ? // 將指針滯空
{
this->phone[i].pNext=nullptr;
this->nam[i].pNext=nullptr;
}
}
Hsah::~Hsah()
{
delete [] phone;
delete [] nam;
}
int Hsah::hashphone(char * num) //電話號(hào)碼散列表函數(shù)
{
if(num==nullptr)
{
}
int key=0;
while(*num!='\0')
{
key+=(*num)-48 ;
num++;
}
return key%20;
}?
int Hsah::hashname(char * name) //姓名的散列表函數(shù)
{
int key=0;
int i=0;
while(name[i]!=NULL)
{
key+=int(name[i]);
i++;
}
return abs(key%20); //abs函數(shù)保證key為正值
}
Node * Hsah::push(char *pname,char *add,char *pnum)//分配存儲(chǔ)空間
{
Node *p=new Node;
? ? int len1 = strlen(pname);
int len2 = strlen(add);
int len3 = strlen(pnum);
p->name=new char[len1+1];
strcpy(p->name,pname);
(p->name)[len1] = '\0';
p->address = new char[len2+1];
strcpy(p->address,add);
(p->address)[len2] = '\0';
p->num=new char[len3+1];
strcpy(p->num,pnum);
(p->num)[len3] = '\0';
p->pNext=nullptr;
? ? return p;
}
void Hsah::append(char *pname,char *add,char *pnum)
{
Node * newphone=new Node;
Node * newname=new Node;
newphone=push(pname,add,pnum);
newname=push(pname,add,pnum);
newphone->pNext=nullptr;
newname->pNext=nullptr;
if(phone[hashphone(pnum)].pNext==nullptr)
{
newphone->pNext=phone[hashphone(pnum)].pNext;
? ? phone[hashphone(pnum)].pNext=newphone;
}
else
{
Node *p=phone[hashphone(pnum)].pNext;
while(p->pNext!=nullptr)
{
p=p->pNext;
}
p->pNext=newphone;
}
if(nam[hashname(pname)].pNext==nullptr)
{
newname->pNext=nam[hashname(pname)].pNext;
nam[hashname(pname)].pNext= newname;
}
else
{
Node *p=nam[hashname(pname)].pNext;
while(p->pNext!=nullptr)
{
p=p->pNext;
}
p->pNext=newname;
} ?
}
Node * Hsah::findnum(char *pnum)//按號(hào)碼查找
{
Node *p=phone[hashphone(pnum)].pNext;
while(p!=nullptr)
{
if(strcmp(pnum,p->num)==0)
break;
p=p->pNext;
}?
if(p)
{
cout<<p->name<<" "<<p->num<<" "<<p->address<<endl;
}
else
{
cout<<"沒有此人記錄!"<<endl;
return nullptr;
}
return p;
}
Node * Hsah::findname(char *pname)//按姓名查找
{
Node *p=nam[hashname(pname)].pNext;
while(p!=nullptr)
{
if(strcmp(pname,p->name)==0)
break;
p=p->pNext;
}
if(p)
{
cout<<p->name<<" "<<p->num<<" "<<p->address<<endl;
}
else
{
cout<<"沒有此人記錄!"<<endl;
return nullptr;
}
return p;
}
void ?Hsah::showphone()
{
for(int i=0;i<20;i++)
{
if(phone[i].pNext==nullptr)
{
continue ;
}
else
{
Node *p=phone[i].pNext; //還是phone[i].pNext部位空
while(p)
{
cout<<"姓名:"<<p->name<<endl;
cout<<"電話號(hào)碼:"<<p->num<<endl;
cout<<"住宅地址:"<<p->address<<endl;
p = p->pNext;
}
}
}
}
?
void ?Hsah::showname()
{
for(int i=0;i<20;i++)
{
if(nam[i].pNext==nullptr)
{
continue ;
}
else
{
Node *p=nam[i].pNext; //還是nam[i].pNext部位空
while(p)
{
cout<<"姓名:"<<p->name<<endl;
cout<<"電話號(hào)碼:"<<p->num<<endl;
cout<<"住宅地址:"<<p->address<<endl;
p = p->pNext;
}
}
}
cout<<"請(qǐng)按任意鍵繼續(xù):";
cin.get();
}
3.main函數(shù)測(cè)試
#include"Hsah.h"
int main()
{
Hsah hs;
? // 添加記錄
hs.append("小東","中關(guān)村22號(hào)","15675650786");
hs.append("小智","下家村58號(hào)","15685638912");
? ? ? ? hs.append("小明","詳細(xì)28號(hào)","14226048511") ;
hs.append("小南","月月光45號(hào)","13226856411") ;
? ? ? ? hs.append("小北","明朗小8號(hào)","13205501111") ;
??
cout<<endl;
//按號(hào)碼查找
hs.findnum("15675650786");
hs.findnum("15685638912");
hs.findnum("17584511");
cout<<endl;
//按姓名查找
hs.findname("小明");
hs.findname("小南");
hs.findname("小");
cout<<endl;
? //顯示列表
hs.showphone();
cout<<endl;
hs.showname();
?
system("pause");
return 0;
}
運(yùn)行結(jié)果:
注:該博客為本人第一次書寫,還有很多不足,后續(xù)將一一補(bǔ)齊,如有侵犯到某人的權(quán)利,請(qǐng)聯(lián)系本人,本人立馬刪除!
總結(jié)
以上是生活随笔為你收集整理的简易散列表实现电话号码查询系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab var std,Matla
- 下一篇: 基于STM32的双向DC-DC变换器(论