设为首页 加入收藏

TOP

VC++2012编程演练数据结构散列文件(三)
2014-11-23 17:37:46 来源: 作者: 【 】 浏览:59
Tags:2012 编程 演练 数据结构 文件
被赋值1表示删除成功
goto END; //转去做结束处理
}}
//若d单链表为空,则转去做结束处理
else goto END;
//从d单链表的第二个结点起顺序查找被删除的元素
int j,q;
q=temp.next; //q初始指向第二个结点
FLNode tq;//用tq保存散列主文件中位置为q的结点
while(q!=-1)
{f2.seekg(q*b2);
f2.read((char*)&tq, b2);
for(j=0; j if(tq.data[j].key==x.key) {
x=tq.data[j];break;}
if(j q=tq.next;}
//若找到了被删除的元素,则将第一个结点中的最后一个元素
//移动到被删除元素的位置
if(q!=-1) {tq.data[j]=temp.data[i-1];
temp.data[i-1].key=NullTag;
f2.seekg(q*b2);
f2.write((char*)&tq, b2);
if(i==1) {//把空的表头结点链接到空闲表的表头
A[d]=temp.next;
temp.next=A[m];
A[m]=p;}
f2.seekg(p*b2);
f2.write((char*)&temp, b2);
DeleteTag=1;} //置删除成功标志
//做删除操作的结束处理操作
END:
if(DeleteTag==1) {
f1.seekg(0);
f1.write((char*)A,(m+1)*b1);}
delete [] A;
f1.close();
f2.close();
if(DeleteTag==1) return true;
else return false;
}
//从按桶散列的文件中查找关键字为x.key的元素,
//并由x带回该元素,若查找成功则返回1,否则返回0
template
bool HFile::THFSearch(char* fn1,char* fn2,T& x)
{//以输入和不新建方式打开散列表文件
ifstream f1(fn1, ios::in|ios::binary);
if(!f1) {cerr< exit(1);}
//以输入和不新建方式打开散列主文件
ifstream f2(fn2, ios::in|ios::binary);
if(!f2) {cerr< exit(1);}
//定义数组A并将f1文件读入A中
int* A=new int[m+1];
if(!A) {cerr<<"申请堆内存失败!"< exit(1);}
f1.read((char*)A, (m+1)*b1);
//计算x元素在散列表中的地址
int i,d=x.key%m;
//从d单链表中顺序查找关键字为x.key的元素
int p=A[d];
//从d单链表中顺序查找关键字为x.key的元素
FLNode temp;
while(p!=-1)
{f2.seekg(p*b2);
f2.read((char*)&temp, b2);
for(i=0;i if(temp.data[i].key==x.key)
{x=temp.data[i];//被查找到的元素由x带回
break;}
if(i else p=temp.next;}
//进行查找结束处理
delete [] A;
f1.close();f2.close();
if(p==-1) return false; else return true;
}
//按单链表顺序打印出按桶散列主文件中每个结点的所有元素值
template
void HFile::THFPrint(char* fn1, char* fn2)
{ifstream f1(fn1, ios::in|ios::binary);
if(!f1) {cerr< exit(1);}
ifstream f2(fn2, ios::in|ios::binary);
if(!f2) {cerr< exit(1);}
int* A=new int[m+1];
if(!A) {cerr<<"申请堆内存失败!"< exit(1);}
f1.read((char*)A, (m+1)*b1);
int p;
FLNode pn;
for(int i=0; i {cout< p=A[i];
while(p!=-1) {
f2.seekg(p*b2);
f2.read((char*)&pn, b2);
//输出结点的位置序号
cout<";
//输出结点中每个元素的关键字,以此代替结点的值
for(int j=0; j cout< //使p指向下一个结点
p=pn.next;}
cout< }


类调用如下
[cpp]
//散列文件的类实现的测试
void main()
{ cout<<"运行结果:\n";
//定义保存记录的数组a并初始化
ElemType a[15]={{13,"li"},{18,"liu"},{17,"wphp"},{37,"menrm"},
{8,"ytong"},{22,"zhua"},{24,"push"},{48,"qian"},{34,"tang"},
{57,"shdm"},{55,"kang"},{30,"liuli"},{25,"qiaoh"},
{31,"dukun"},{17,"haiang"}};
//定义保存记录的数组b并初始化
ElemType b[16]={{23,"tang"},{38,"suan"},{56,"kony"},
{55,"shao"},{80,"caik"},{70,"ganwu"},{65,"dukun"},{42,"sini"},
{29,"liuda"},{43,"xitu"},{71,"taoto"},{77,"shouw"},
{93,"shum"},{69,"liyz"},{45,"xuyang"},{19,"wxy"}};
//定义散列表文件和主文件的名字,并由字符指针p1和p2所指向
char *p1=".\\HFile.idx", *p2=".\\HFile.dat";
//初始化散列表文件和主文件
HFile myfile(p1,p2);
//向散列文件插入数组a和b中保存的记录
myfile.THFInsertB(p1,p2,a,15);
myfile.THFInsertB(p1,p2,b,16);
//设mark用于保存删除或查找函数返回的值
int mark;
//定义x保存一个待插入的元素值或保存待删除或查找元素的关键字
ElemType x;
//利用键盘输入操作散列文件
while(1) {
cout< cout<<"1---向散列文件插入一个元素"< cout<<"2---从散列文件中删除一个元素"< cout<<"3---从散列文件中查找一个元素"< cout<<"4---输出散列主文件"< cout<<"5---结束运行"< char ch;
cout<<"请输入你的选择(1-5): ";cin>>

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC++2012编程演练数据结构 KMP算法 下一篇VC++2012编程演练数据结构索引文件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: