实验七 自组织线性表查找——数据结构

实验7查找

【背景】
自组织线性表根据估算的访问频率排列记录,先放置请求频率最高的记录,接下来是请求频率次高的记录,依此类推。自组织线性表根据实际的记录访问模式在线性表中修改记录顺序。自组织线性表使用启发式规则决定如何重新排列线性表。转置方法的基本原理是,在一次查找过程中,一旦找到一个记录,则将它与前一个位置的记录交换位置。这样,随着时间的推移,经常访问的记录将移动到线性表的前端,而曾经频繁使用但以后不再访问的记录将逐渐退至线性表的后面。

尽管一般情况下自组织线性表的效率可能没有查找数和已排序的线性表那么好,但它也有自身的优势。它可以不必对线性表进行排序,新记录的插入代价很小;同时也比查找树更容易实现,且无需额外的存储空间。

【实验目的】
学习课程查找中的“自组织线性表”。实现一个自组织线性表。

【基本要求】
从文件中读入一组汉字集合,用自组织线性表保存。自组织线性表在查询时,采用转置法调整自组织线性表的内容。

从文件中依次读入需查询的汉字,把查询结果保存在文件中(如找到,返回比较的次数,如果没有找到,返回比较的次数)

【代码实现】
List.h

class List
{
	public:
		void Inverse(char a[][2],int i,int j);
		int search(char a[][2],int size,char c[2]);
};

List.cpp

void List::Inverse(char a[][2],int i,int j)
{
	 char temp=a[i][0];
	 a[i][0]=a[j][0];
	 a[j][0]=temp;
	 temp=a[i][1];
	 a[i][1]=a[j][1];
	 a[j][1]=temp;
}

main.cpp

#include <iostream>
#include <fstream>
using namespace std;
#include "List.h"
bool flag;
int List::search(char a[][2],int size,char c[2])
{
	List L;
	flag=0;
	int i;
    for(i=0;i<size;i++)
    {
    	if(a[i][0]==c[0]&&a[i][1]==c[1]) 
		{
			  flag=1;
			  break;
		}
	}
	if(flag) 
	{
		if(i>0) L.Inverse(a,i,i-1);
	 	return i+1;
	}
    else return size;
}
int main(int argc, char** argv) 
{
	int i,j,size1,size2,num;
	List L;
	static char a[100][2],b[100][2],c[2];
	ifstream infile1("zizuzhi.txt",ios::in);
	if(!infile1)
	{
		cerr<<"open error!"<<endl;
		exit(1);
	}
	cout<<"读入的一组汉字为:"<<endl;
	infile1>>a[0];
	for(i=0;;i++)
	{
		if(a[i][0]==0) break;
	} 
	cout<<a[0]<<' '<<endl;
	size1=i;
	ifstream infile2("chazhaobiao.txt",ios::in);
	if(!infile2)
	{
		cerr<<"open error!"<<endl;
		exit(1);
	}
	cout<<"要查找的汉字为:"<<endl;
	infile2>>b[0];
	for(j=0;;j++)
	{
		if(b[j][0]==0) break;
	}
	cout<<b[0]<<' '<<endl;
	size2=j;
	infile1.close();
	infile2.close();
	cout<<"查找结果:"<<endl;
	ofstream outfile;
	outfile.open("查找结果.txt",ios::out);
	for(i=0;i<size2;i++)
	{
		num=L.search(a,size1,b[i]);
		c[0]=b[i][0];
		c[1]=b[i][1];
		if(flag)
		{
			cout<<"查找---"<<c<<"---成功!查找次数为: "<<num<<endl;
			outfile<<"查找---"<<c<<"---成功!查找次数为: "<<num<<endl;
		}
		else
		{
			cout<<"查找---"<<c<<"---失败!查找次数为: "<<num<<endl;
			outfile<<"查找---"<<c<<"---失败!查找次数为: "<<num<<endl;
		}
	}
	outfile.close();
	return 0;
}

【测试样例】
【输入文本】
zizuzhi.txt
落花人独立,微雨燕双飞

chazhaobiao.txt
花雨双飞燕镇山河

【输出文本】
查找结果.txt
查找—花---成功!查找次数为: 2
查找—雨---成功!查找次数为: 8
查找—双---成功!查找次数为: 10
查找—飞---成功!查找次数为: 11
查找—燕---成功!查找次数为: 11
查找—镇---失败!查找次数为: 11
查找—山---失败!查找次数为: 11
查找—河---失败!查找次数为: 11

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章