电子地图管理系统

GTBL_打开.txt:
#linkID=51660;roadnameflag=0;branch=0;dispclass=11;roadname=a路
#linkID=5177;roadnameflag=0;branch=0;dispclass=8;roadname=b路
#linkID=56310;roadnameflag=0;branch=0;dispclass=8;roadname=c路
#linkID=51771;roadnameflag=0;branch=0;dispclass=11;roadname=d路
#linkID=51678;roadnameflag=0;branch=0;dispclass=11;roadname=e路
#linkID=51770;roadnameflag=0;branch=0;dispclass=11;roadname=f路
#linkID=51676;roadnameflag=0;branch=0;dispclass=11;roadname=g·
#linkID=51677;roadnameflag=0;branch=0;dispclass=11;roadname=h·
#linkID=51769;roadnameflag=0;branch=0;dispclass=11;roadname=i·
#linkID=63538;roadnameflag=0;branch=7;dispclass=11;roadname=j·
#linkID=63539;roadnameflag=1;branch=3;dispclass=6;roadname=k·

#include<fstream>
#include<string>
#include<Windows.h>
#include<iostream>
#include<unordered_map>
#include<map>
#include<algorithm>
#include<iterator>
#include<search.h>
using namespace std;
//宏函数处理二进制数据
#define Length 99999 
static int sizecount = 0;//记录道路记录条数
int mark1 = 0;//标记是否读取过文件
int mark2 = 0;//标记是否完成过排序
class RoadRecord			//定义道路信息的类
{
public:
	short int InfoSize;		//信息尺寸2byte
	long int LinkID;		//4byte
	short NameSize;			//道路名字大小2byte
	/*NodeInfo : 4byte*/
	int DispClass;			// 分类番号0~3
	int Brunch;				// 分叉数量4~6
	int NameFlag;			// 有无名字的标志
	string RoadName;		// 道路名字8~31
	/*运算符> < = <= >=的重载*/
	int operator >(const RoadRecord& x)
	{
		if (LinkID > x.LinkID)
			return 1;
		else
			return 0;
	}
	int operator <(const RoadRecord& x)
	{
		if (LinkID < x.LinkID)
			return 1;
		else
			return 0;
	}
	int operator<=(const RoadRecord& x)
	{
		if (LinkID <= x.LinkID)
			return 1;
		else
			return 0;
	}
	int operator>=(const RoadRecord& x)
	{
		if (LinkID >= x.LinkID)
			return 1;
		else
			return 0;
	}
	/*赋值运算符重载,用于交换类对象成员数据*/
	RoadRecord &operator =(const RoadRecord& c)
	{
		InfoSize = c.InfoSize;
		LinkID = c.LinkID;
		NameSize = c.NameSize;
		DispClass = c.DispClass;
		Brunch = c.Brunch;
		NameFlag = c.NameFlag;
		RoadName = c.RoadName;
		return *this;
	}
	/*对象和整型数据的运算符重载*/
	bool operator==(const int x)const
	{
		if (this->LinkID == x)
			return true;
		else
			return false;
	}
	bool operator>(const int x)const
	{
		if (this->LinkID > x)
			return true;
		else
			return false;
	}
	bool operator<(const int x)const
	{
		if (this->LinkID < x)
			return true;
		else
			return false;
	}
	
	void disp()
	{
		std::cout << "#LinkID=" << LinkID << '\t';
		std::cout << "NameFlag=" << NameFlag << '\t';
		std::cout << "Brunch=" << Brunch << '\t';
		std::cout << "DispClass=" << DispClass << '\t';
		if (NameFlag == 1)
			std::cout << "RoadName=" << RoadName << '\t' << "#" << endl;
		else
			std::cout << "RoadName=" << "无   #" << endl;
	}
	operator long int()//变换构造函数获取LinkID
	{
		return LinkID;
	}

};
void disp(RoadRecord rr[])
{
	for (int i = 0; i < sizecount; i++)
	{
		std::cout << "#LinkID=" << rr[i].LinkID << '\t';
		std::cout << "NameFlag=" << rr[i].NameFlag << '\t';
		std::cout << "Brunch=" << rr[i].Brunch << '\t';
		std::cout << "DispClass=" << rr[i].DispClass << '\t';
		if (rr[i].NameFlag == 1)
			std::cout << "RoadName=" << rr[i].RoadName << '\t' << endl;
		else
			std::cout << "RoadName=" << "无" << endl;
	}

}
int linkid_to_int(string s)
{
	int m = s.find(";");
	int sum = 0;
	for (int i = 8; i < m; i++)
	{
		sum = sum * 10 + s[i] - '0';
	}
	return sum;
}
int nameflag_to_int(string s)

{
	int m = s.find(";b");
	int n = s.find("g=");
	n++;
	n++;
	int sum = 0;
	for (int i = n; i < m; i++)
	{
		sum = sum * 10 + s[i] - '0';
	}
	return sum;
}
int brunch_to_int(string s)
{
	int m = s.find(";d");
	int n = s.find("h=");
	n++;
	n++;
	int sum = 0;
	for (int i = n; i < m; i++)
	{
		sum = sum * 10 + s[i] - '0';
	}
	return sum;
}
int dispClass_to_int(string s)
{
	int m = s.find(";r");
	int n = s.find("s=");
	n++;
	n++;
	int sum = 0;
	for (int i = n; i < m; i++)
	{
		sum = sum * 10 + s[i] - '0';
	}
	return sum;
}
void Read_File_Data(RoadRecord rr[])
{
	//ifstream inFile("d:\\new_GTBL.dat", ios::in | ios::binary);//用于判断更新文件是否成功
	ifstream inFile("GTBL_打开.txt");
	ofstream outFile("GTBL_输出.txt", ios::trunc);
	std::cout << "正在打开文件GTBL_打开.txt并创建文件GTBL_输出.txt..." << endl;

	if (!inFile) {//检查GTBL.dat是否打开成功
		std::cout << "找不到文件GTBL_打开.txt!" << endl;
		return;
	}

	if (!outFile) {//检查GTBL.txt是否打开/创建成功
		std::cout << "找不到文件GTBL_输出.txt!" << endl;
		return;
	}
	string s;
	std::cout << "正在将地图信息写入GTBL_输出.txt..." << endl;
	int length = 0;
	while (std::getline(inFile, s))      //getline(inf,s)是逐行读取inf中的文件信息
	{
		rr[length].LinkID = linkid_to_int(s);
		rr[length].NameFlag = nameflag_to_int(s);
		rr[length].Brunch = brunch_to_int(s);
		rr[length].DispClass = dispClass_to_int(s);
		int m = s.find("e=");
		m++;
		m++;
		if (m == s.size())
		{
			rr[length].NameFlag = 0;
		}
		else
		{
			rr[length].NameFlag = 1;
			rr[length].NameSize = s.size() - m;
			string str = s.substr(m, s.size());
			rr[length].RoadName = str;
		}
		length++;
		sizecount++;
	}
	std::cout << "数据读取成功!" << endl;
	/*关闭文件*/
	mark1++;
	inFile.close();
	outFile.close();
	return;
}
struct BSNode
{
	//初始化 只赋予权值
	BSNode(RoadRecord t) :value(t), lchild(NULL), rchild(NULL) {}
	//BSNode() = default;

	RoadRecord value;            //节点的值
	BSNode* lchild;  //左孩子
	BSNode* rchild;  //右孩子
	BSNode* parent;  //节点的双亲
};
class BSTree
{
public:
	BSNode* root;//根节点
	//初始化为空树
	BSTree() :root(NULL) {}
	//外部接口
	BSNode* search__iterator(RoadRecord key) //迭代查找指定节点
	{
		BSNode* pnode = root;
		while (pnode != NULL)
		{
			if (pnode->value.LinkID == key.LinkID)
				return pnode;
			else if (pnode->value.LinkID > key.LinkID)
				pnode = pnode->lchild;
			else
				pnode = pnode->rchild;
		}
		return NULL;
	}

	void insert(RoadRecord key)    //插入指定结点
	{
		BSNode* pparent = NULL;  //要插入节点的父节点
		BSNode* pnode = root;
		/*先找到能插入的位置,即此节点的父节点*/
		while (pnode != NULL)
		{
			pparent = pnode;
			if (key.LinkID < pnode->value.LinkID)
				pnode = pnode->lchild;
			else if (key.LinkID > pnode->value.LinkID)
				pnode = pnode->rchild;
			else
				break;
		}
		/*以元素的值构建新节点*/
		pnode = new BSNode(key);

		/*空树,新节点即为根节点*/
		if (pparent == NULL)
		{
			root = pnode;
		}
		else //不是空树
		{
			if (key.LinkID < pparent->value.LinkID)
				pparent->lchild = pnode;  //新节点为左孩
			else
				pparent->rchild = pnode;
		}
		pnode->parent = pparent;          //指定新节点的父节点
	}
	RoadRecord search(BSNode*& p, int key, RoadRecord B)
	{
		if (p == NULL)
		{
			cout << "未查找到该数据" << endl;
			return B;
		}	
		if (key == p->value.LinkID)
		{
			B = p->value;
			B.disp();
			return B;
		}
		//在这打印 节点值,可查看查找顺序
		if (key < p->value.LinkID)
			return search(p->lchild, key, B);
		return search(p->rchild, key, B);
	}
};
void Reserve(RoadRecord rr[], int length)
{
	ofstream outFile("GTBL_输出.txt", ios::trunc);
	if (!outFile) {//检查GTBL.txt是否打开/创建成功
		std::cout << "找不到文件GTBL.txt!" << endl;
		return;
	}
	for (int i = 0; i < length; i++)
	{
		outFile << "#linkID=" << rr[i].LinkID
			<< ";roadnameflag=" << rr[i].NameFlag
			<< ";branch=" << rr[i].Brunch
			<< ";dispclass=" << rr[i].DispClass
			<< ";roadname=" << rr[i].RoadName << endl;
	}
	cout << "数据保存成功" << endl;
}
void Add_Record(RoadRecord rr[])
{
	char opt = 'Y';
	do {
		std::cout << "开始添加道路信息!" << endl;
		std::cout << "请依次输入LinkID/roadnameflag/branch/dispclass/roadname:" << endl;
		std::cin >> rr[sizecount - 1].LinkID >> rr[sizecount - 1].NameFlag >>
			rr[sizecount - 1].Brunch >> rr[sizecount - 1].DispClass;
		if (rr[sizecount - 1].NameFlag == 1)
		{
			cin >> rr[sizecount - 1].RoadName;
			rr[sizecount - 1].NameSize = rr[sizecount - 1].RoadName.size();
		}
		sizecount++;
		std::cout << "添加完成!" << endl;
		std::cout << "是否继续添加道路信息?(Y/N)" << endl;
		std::cin >> opt;
	} while (opt != 'N');
	std::cout << "返回功能菜单..." << endl;
	system("pause");
}
void Delete_LinkId(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int li = 0;
	cin >> li;
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].LinkID != li)
			A[j++] = A[i];
	if (j == sizecount)
		cout << "未查找到改数据" << endl;
	else
	{
		sizecount = j;
		cout << "删除成功!" << endl;
	}
}
void Delete_roadnameflag(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int nf = 0;
	cin >> nf;
	if (nf != 0 && nf != 1)
	{
		cout << "请输入正确的数据" << endl;
		return;
	}
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].NameFlag != nf)
			A[j++] = A[i];
	sizecount = j;

	cout << "删除成功!" << endl;

}
void Delete_Branch(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int bh = 0;
	cin >> bh;
	if (bh < 0 || bh > 7)
	{
		cout << "请输入正确的数据" << endl;
		return;
	}
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].Brunch != bh)
			A[j++] = A[i];
	sizecount = j;
	cout << "删除成功!" << endl;
}
void Delete_dispclass(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int dc = 0;
	cin >> dc;
	if (dc < 0 || dc > 15)
	{
		cout << "请输入正确的数据" << endl;
		return;
	}
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].DispClass != dc)
			A[j++] = A[i];
	sizecount = j;
	cout << "删除成功!" << endl;
}
void Delete_Roadname(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	string rn;
	cin >> rn;
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].RoadName != rn)
			A[j++] = A[i];
	sizecount = j;
	cout << "删除成功!" << endl;
}
void Delete_Data(RoadRecord A[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择删除方式:" << endl;
		std::cout << "       1.删除指定的LinkId" << endl;
		std::cout << "       2.删除指定的roadnameflag" << endl;
		std::cout << "       3.删除指定的branch" << endl;
		std::cout << "       4.删除指定的dispclass" << endl;
		std::cout << "       5.删除指定的roadname" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Delete_LinkId(A);
			break;
		case 2:
			Delete_roadnameflag(A);
			break;
		case 3:
			Delete_Branch(A);
			break;
		case 4:
			Delete_dispclass(A);
			break;
		case 5:
			Delete_Roadname(A);
			break;
		case 0:
			break;
		}
	}
}
void Bubble_Sort(RoadRecord A[], static int sizecount)
{
	int i, j;
	bool change;//记录是否还有交换操作,如果没有则排序结束
	RoadRecord temp;
	for (i = sizecount - 1, change = true; i >= 1 && change; --i)//外循环
	{
		change = false;
		for (j = 0; j < i; ++j)//内循环
			if (A[j] > A[j + 1])
			{
				temp = A[j];
				A[j] = A[j + 1];
				A[j + 1] = temp;
				change = true;
			}
	}
	std::cout << "冒泡排序完成!" << endl;
}
//直接插入排序
void Insertion_Sort(RoadRecord A[], static int sizecount)
{
	int i, j;
	RoadRecord temp;
	for (i = 1; i < sizecount; i++)
	{
		temp = A[i];
		for (j = i - 1; j >= 0 && temp < A[j]; j--)
		{
			if (A[j - 1] > temp)
				A[j + 1] = A[j];//比当前元素小的往后移动
		}
		A[j + 1] = temp;//将当前元素插入到合适的位置
	}
	std::cout << "插入排序完成!" << endl;
}
//希尔排序
void Shell_Sort(RoadRecord A[], int N)
{
	int i, j, Increment;
	RoadRecord temp;
	for (Increment = N / 2; Increment > 0; Increment /= 2)
		for (i = Increment; i < N; i++) {
			temp = A[i];
			for (j = i; j >= Increment; j -= Increment)
				if (temp < A[j - Increment])
					A[j] = A[j - Increment];
				else
					break;
			A[j] = temp;
		}
	std::cout << "希尔排序完成!" << endl;
}
//归并排序
void Merge(RoadRecord A[], RoadRecord temp[], int lpos, int rpos, int rightend)
{
	int i, leftend, num, tempPos;
	leftend = rpos - 1;
	tempPos = lpos;
	num = rightend - lpos + 1;
	while (lpos <= leftend && rpos <= rightend)
		if (A[lpos] <= A[rpos])
		{
			temp[tempPos] = A[lpos];
			tempPos++;
			rpos++;
		}
		else
		{
			temp[tempPos] = A[rpos];
			tempPos++;
			rpos++;
		}
			
	while (lpos <= leftend)
		temp[tempPos++] = A[lpos++];
	while (rpos <= rightend)
		temp[tempPos++] = A[rpos++];
	for (i = 0; i < num; i++, rightend--)
		A[rightend] = temp[rightend];
}
void MSort(RoadRecord A[], RoadRecord temp[], int left, int right)
{
	int center;
	if (left < right)
	{
		center = (left + right) / 2;
		MSort(A, temp, left, center);
		MSort(A, temp, center + 1, right);
		Merge(A, temp, left, center + 1, right);
	}
}
void Merge_Sort(RoadRecord A[], int N)
{
	RoadRecord* temp;
	temp = (RoadRecord*)malloc(N * sizeof(RoadRecord));
	if (temp != NULL)
	{
		MSort(A, temp, 0, N - 1);
		free(temp);
	}
	else
		std::cout << "No more Space" << endl;
	std::cout << "归并排序完成!" << endl;
}
//基数排序
void Base_Sort(RoadRecord A[], int N)
{
	//申请一个临时数组的内存
	RoadRecord* temp = (RoadRecord*)malloc(N * sizeof(RoadRecord));
	for (int i = 0; i < N; i++)
		if (A[i] > 80000)
			temp[0] = A[i];
		else
			temp[A[i]] = A[i];//这里要调用变换构造函数
	//将数据写回原来数组
	A[N - 1] = temp[0];//temp[0]是最大的数据妨到最后
	for (int i = 1; i < N; i++)
		A[i - 1] = temp[i];
	//程序调用结束将释放临时数组内存
	free(temp);
	std::cout << "基数排序完成!" << endl;
}
//快速排序
void Quick_Sort(RoadRecord A[], int low, int high)
{
	if (low < high) {
		int i = low, j = high;
		RoadRecord pivokey = A[low];
		while (i < j) {
			while (i < j && A[j] >= pivokey) j--;
			if (i < j)
				A[i++] = A[j];
			while (i < j && A[i] <= pivokey) i++;
			if (i < j)
				A[j--] = A[i];
		}
		A[i] = pivokey;
		Quick_Sort(A, low, i - 1);
		Quick_Sort(A, i + 1, high);
	}
	std::cout << "快速排序完成!" << endl;

}
void hash_search_LinkId(RoadRecord A[])
{
	int temp = 0;
	cout << "请输入您要查找的linkid" << endl;
	cin >> temp;
	map<int, RoadRecord> searching;
	int i;
	for (i = 0; i < sizecount; i++)
	{
		searching[A[i].LinkID] = A[i];
	}

	int k = 0;
	map<int, RoadRecord>::iterator iter;
	iter = searching.find(temp);
	if (iter == searching.end())
	{
		cout << "未查找到数据" << endl;
		return;
	}
	RoadRecord B = iter->second;
	cout << "查找成功,查找结果如下:" << endl;
	B.disp();
}
void Search_LinkId(RoadRecord A[])
{
	int temp = 0;
	cout << "请输入相应序号" << endl;
	cin >> temp;
	RoadRecord* B = new RoadRecord[Length];
	int j = 0;
	for (int i = 0; i < sizecount; i++)
	{
		if (A[i].LinkID == temp)
			B[j++] = A[i];
	}
	if (j >= 5)
		Reserve(B, j);
	else
		A->disp();
}
void Search_roadnameflag(RoadRecord A[])
{
	int temp = 0;
	cout << "请输入相应序号" << endl;
	cin >> temp;
	RoadRecord* B = new RoadRecord[Length];
	int j = 0;
	for (int i = 0; i < sizecount; i++)
	{
		if (A[i].NameFlag == temp)
			B[j++] = A[i];
	}
	if (j >= 5)
		Reserve(B, j);
	else
		A->disp();
}
void Search_Branch(RoadRecord A[])
{
	int temp = 0;
	cout << "请输入相应序号" << endl;
	cin >> temp;
	RoadRecord* B = new RoadRecord[Length];
	int j = 0;
	for (int i = 0; i < sizecount; i++)
	{
		if (A[i].Brunch == temp)
			B[j++] = A[i];
	}
	if (j >= 5)
		Reserve(B, j);
	else
		A->disp();
}
void Search_dispclass(RoadRecord A[])
{
	int temp = 0;
	cout << "请输入相应序号" << endl;
	cin >> temp;
	RoadRecord* B = new RoadRecord[Length];
	int j = 0;
	for (int i = 0; i < sizecount; i++)
	{
		if (A[i].DispClass == temp)
			B[j++] = A[i];
	}
	if (j >= 5)
		Reserve(B, j);
	else
		A->disp();
}
void Search_Roadname(RoadRecord A[])
{
	string temp = 0;
	cout << "请输入相应名称" << endl;
	cin >> temp;
	RoadRecord* B = new RoadRecord[Length];
	int j = 0;
	for (int i = 0; i < sizecount; i++)
	{
		if (A[i].RoadName == temp)
			B[j++] = A[i];
	}
	if (j >= 5)
		Reserve(B, j);
	else
		A->disp();
}
void shunxu_search(RoadRecord A[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择查询方式:" << endl;
		std::cout << "       1.查询指定的LinkId" << endl;
		std::cout << "       2.查询指定的roadnameflag" << endl;
		std::cout << "       3.查询指定的branch" << endl;
		std::cout << "       4.查询指定的dispclass" << endl;
		std::cout << "       5.查询指定的roadname" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Search_LinkId(A);
			break;
		case 2:
			Search_roadnameflag(A);
			break;
		case 3:
			Search_Branch(A);
			break;
		case 4:
			Search_dispclass(A);
			break;
		case 5:
			Search_Roadname(A);
			break;
		case 0:
			break;
		}
	}
}
RoadRecord preOrder(BSNode* pnode,int key, RoadRecord B)
{
	if (pnode != NULL)
	{
		if (pnode->value.LinkID == key)
		{
			B = pnode->value;
			B.disp();
			return B;
		}
		preOrder(pnode->lchild, key, B);
		preOrder(pnode->rchild, key, B);
	}
};
void chazhaoshu_sunxu(RoadRecord A[])
{
	BSTree tree;
	for (int i = 0; i < sizecount; i++)
	{
		tree.insert(A[i]);
	}

	BSNode* pnode = tree.root;
	cout << "请输入您要查找的linkid:" << endl;
	RoadRecord B;
	int temp;
	cin >> temp;
	preOrder(pnode, temp, B);
}
void chazhaoshu_erfen(RoadRecord A[])
{
	BSTree tree;
	for (int i = 0; i < sizecount; i++)
	{
		tree.insert(A[i]);
	}
	BSNode* pnode = tree.root;
	cout << "请输入您要查找的linkid:" << endl;
	RoadRecord B;
	int temp;
	cin >> temp;
	tree.search(pnode, temp, B);
}
void chazhaoshu_shunxu(RoadRecord A[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择查询方式:" << endl;
		std::cout << "       1.顺序查找" << endl;
		std::cout << "       2.二分查找" << endl;
		std::cout << "       3.插值查找" << endl;
		std::cout << "       4.哈希查找" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			chazhaoshu_shunxu(A);
			break;
		case 2:
			chazhaoshu_erfen(A);
			break;
		case 3:
			chazhaoshu_erfen(A);
			break;
		case 4:
			chazhaoshu_erfen(A);
			break;
		case 0:
			break;
		}
	}
}
void Search_Data(RoadRecord rr[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择查询方式:" << endl;
		std::cout << "       1.顺序查找" << endl;
		std::cout << "       2.哈希查找" << endl;
		std::cout << "       3.查找树查找" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			shunxu_search(rr);
			break;
		case 2:
			hash_search_LinkId(rr);
			break;
		case 3:
			chazhaoshu_shunxu(rr);
			break;
		case 0:
			break;
		}
	}
}
void Sort_Data(RoadRecord A[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择服务种类:" << endl;
		std::cout << "       1.冒泡排序" << endl;
		std::cout << "       2.直接插入排序" << endl;
		std::cout << "       3.希尔排序" << endl;
		std::cout << "       4.归并排序" << endl;
		std::cout << "       5.基数排序" << endl;
		std::cout << "       6.快速排序" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Bubble_Sort(A, sizecount);
			Reserve(A, sizecount);
			disp(A);
			break;
		case 2:
			Insertion_Sort(A, sizecount);
			Reserve(A, sizecount);
			disp(A);
			break;
		case 3:
			Shell_Sort(A, sizecount);
			Reserve(A, sizecount);
			disp(A);
			break;
		case 4:
			Shell_Sort(A, sizecount);
			Reserve(A, sizecount);
			disp(A);
			break;
		case 5:
			Shell_Sort(A, sizecount);
			Reserve(A, sizecount);
			disp(A);
			break;
		case 6:
			Shell_Sort(A, sizecount);
			Reserve(A, sizecount);
			disp(A);
			break;
		}
	}
}
void Space_Release(RoadRecord A[])
{
	sizecount = 0;
	printf("空间已释放");
}
void shunxu(RoadRecord A[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择服务种类:" << endl;
		std::cout << "       1.读取文件" << endl;
		std::cout << "       2.插入" << endl;
		std::cout << "       3.删除" << endl;
		std::cout << "       4.查找" << endl;
		std::cout << "       5.排序" << endl;
		std::cout << "       6.空间释放" << endl;
		std::cout << "       7.更新文件" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Read_File_Data(A);
			std::cout << "读取文件完成" << endl;
			break;
		case 2:
			Add_Record(A);
			break;
		case 3:
			Delete_Data(A);
			break;
		case 4:
			Search_Data(A);
			break;
		case 5:
			Sort_Data(A);
			break;
		case 6:
			Space_Release(A);
			break;
		case 7:
			Reserve(A, sizecount);
			printf("数据更新成功");
			break;
		case 0:
			break;
		}
	}
}
class node
{
public:
	RoadRecord data;
	node* next;
};
class linklist
{
public:
	linklist();
	linklist(RoadRecord a[], int n);
	linklist(int n, RoadRecord a[]);
	~linklist();
	int length();
	RoadRecord Get(int i);
	void Set(int i, RoadRecord x);
	int Locate(RoadRecord x);
	void Insert(RoadRecord x, int i);
	RoadRecord Delete(int i);
	void Printlinklist();
	node* GetFirst();
	void Reversekinklist();
private:
	node* first;
}list_rr;
linklist::linklist()
{
	node *first = new node;
	first->next = nullptr;
}
linklist::linklist(RoadRecord a[], int n)
//有序单链表构造函数
{
	first = new node;
	first->next = nullptr;
	node* p, * q, * s;
	for (int i = 0; i < n; i++)
	{
		q = first;
		p = first->next;
		s = new node;
		s->data = a[i];
		while (p && p->data <= a[i])
		{
			q = p;
			p = p->next;
		}
		s->next = q->next;
		q->next = s;
	}
}
linklist::linklist(int n, RoadRecord a[])
{
	first = new node;
	first->next = nullptr;
	node* s, * r = first;
	for (int i = 0; i < n; i++)
	{
		s = new node;
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = nullptr;
}
linklist::~linklist()
{
	node* q, * p = first;
	while (p)
	{
		q = p;
		p = p->next;
		delete q;
	}
}
int linklist::length()
{
	node* p = first->next;
	int j = 1;
	while (p)
	{
		j++;
		p = p->next;
	}
	return j;
}
RoadRecord linklist::Get(int i)
{
	node* p = first->next;
	int j = 1;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p)
		throw"位置error";
	else
		return p->data;
}
void linklist::Set(int i, RoadRecord x)
{
	node*p = first->next;
	int j = 1;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p)
		throw"位置error";
	else
		p->data = x;
}
int linklist::Locate(RoadRecord x)
{
	node* p = first->next;
	int j = 1;
	while (p && x != p->data)
	{
		p = p->next;
		j++;
	}
	if (!p)
		return -1;
	else
		return j;
	return 0;
}
void linklist::Insert(RoadRecord x, int i)
{
	node* p = first->next;
	int j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p)
		throw"位置错误";
	else
	{
		node* s = new node;
		s->data = x;
		s->next = p->next;
		p->next = s;
	}
}
RoadRecord linklist::Delete(int i)
{
	node* p = first;
	int j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || !p->next)
		throw"位置错误";
	else
	{
		node* q = p->next;
		RoadRecord x = q->data;
		p->next = q->next;
		delete q;
		return x;
	}
}
void linklist::Printlinklist()
{
	node* p = first->next;
	while (p)
	{
		cout << p->data << ' ';
		p = p->next;
	}
}
node* linklist::GetFirst()
{
	return first;
}
void linklist::Reversekinklist()
{
	node* p, * q;
	p = first->next;
	first->next = nullptr;
	while (p)
	{
		q = p;
		p = p->next;
		q->next = first->next;
		first->next = q;
	}
}
void Merge(linklist la, linklist lb, linklist & lc)
{
	node* pa, * pb, * s, * r;
	pa = la.GetFirst();
	pa = pa->next;
	pb = lb.GetFirst();
	pb = pb->next;
	r = lc.GetFirst();
	r->next = nullptr;
	while (pa && pb)
	{
		if (pa->data <= pb->data)
		{
			s = new node;
			s->data = pa->data;
			r->next = s;
			pa = pa->next;
		}
		else
		{
			s = new node;
			s->data = pb->data;
			r->next = s;
			pb = pb->next;
		}
		r = s;
	}
	while (pa)
	{
		s = new node;
		s->data = pa->data;
		r->next = s;
		pa = pa->next;
		r = s;
	}
	while (pb)
	{
		s = new node;
		s->data = pa->data;
		r->next = s;
		pb = pb->next;
		r = s;
	}
	r->next = 0;
}
void Read_File_Data_lianbiao(RoadRecord rr[])
{
	Read_File_Data(rr);
	for (int i = 0; i < sizecount; i++)
	{
		RoadRecord A = rr[i];
		list_rr.Insert(A, list_rr.length());
	}
}
void Add_Record_lianbiao(RoadRecord rr[])
{
	char opt = 'Y';
	do {
		std::cout << "开始添加道路信息!" << endl;
		std::cout << "请依次输入LinkID/roadnameflag/branch/dispclass/roadname:" << endl;
		std::cin >> rr[sizecount - 1].LinkID >> rr[sizecount - 1].NameFlag >>
			rr[sizecount - 1].Brunch >> rr[sizecount - 1].DispClass;
		if (rr[sizecount - 1].NameFlag == 1)
		{
			cin >> rr[sizecount - 1].RoadName;
			rr[sizecount - 1].NameSize = rr[sizecount - 1].RoadName.size();
		}
		sizecount++;
		std::cout << "添加完成!" << endl;
		std::cout << "是否继续添加道路信息?(Y/N)" << endl;
		std::cin >> opt;
	} while (opt != 'N');
	std::cout << "返回功能菜单..." << endl;
	RoadRecord A = rr[sizecount - 1];
	list_rr.Insert(A, list_rr.length());
	system("pause");
}
void Delete_LinkId_lianbiao(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int li = 0;
	cin >> li;
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].LinkID != li)
			A[j++] = A[i];
	if (j == sizecount)
		cout << "未查找到改数据" << endl;
	else
	{
		sizecount = j;
		cout << "删除成功!" << endl;
	}
	list_rr.~linklist();
	for (int i = 0; i < sizecount; i++)
	{
		RoadRecord rr = A[i];
		list_rr.Insert(rr, list_rr.length());
	}
}
void Delete_roadnameflag_lianbiao(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int nf = 0;
	cin >> nf;
	if (nf != 0 && nf != 1)
	{
		cout << "请输入正确的数据" << endl;
		return;
	}
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].NameFlag != nf)
			A[j++] = A[i];
	sizecount = j;
	cout << "删除成功!" << endl;
	list_rr.~linklist();
	for (int i = 0; i < sizecount; i++)
	{
		RoadRecord rr = A[i];
		list_rr.Insert(rr, list_rr.length());
	}

}
void Delete_Branch_lianbiao(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int bh = 0;
	cin >> bh;
	if (bh < 0 || bh > 7)
	{
		cout << "请输入正确的数据" << endl;
		return;
	}
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].Brunch != bh)
			A[j++] = A[i];
	sizecount = j;
	cout << "删除成功!" << endl;
	list_rr.~linklist();
	for (int i = 0; i < sizecount; i++)
	{
		RoadRecord rr = A[i];
		list_rr.Insert(rr, list_rr.length());
	}
}
void Delete_dispclass_lianbiao(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	int dc = 0;
	cin >> dc;
	if (dc < 0 || dc > 15)
	{
		cout << "请输入正确的数据" << endl;
		return;
	}
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].DispClass != dc)
			A[j++] = A[i];
	sizecount = j;
	cout << "删除成功!" << endl;
	list_rr.~linklist();
	for (int i = 0; i < sizecount; i++)
	{
		RoadRecord rr = A[i];
		list_rr.Insert(rr, list_rr.length());
	}
}
void Delete_Roadname_lianbiao(RoadRecord A[])
{
	cout << "请输入删除内容:" << endl;
	string rn;
	cin >> rn;
	int i, j = 0;
	for (i = 0; i < sizecount; i++)
		if (A[i].RoadName != rn)
			A[j++] = A[i];
	sizecount = j;
	cout << "删除成功!" << endl;
	list_rr.~linklist();
	for (int i = 0; i < sizecount; i++)
	{
		RoadRecord rr = A[i];
		list_rr.Insert(rr, list_rr.length());
	}
}
void Delete_Data_lianbiao(RoadRecord rr[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择删除方式:" << endl;
		std::cout << "       1.删除指定的LinkId" << endl;
		std::cout << "       2.删除指定的roadnameflag" << endl;
		std::cout << "       3.删除指定的branch" << endl;
		std::cout << "       4.删除指定的dispclass" << endl;
		std::cout << "       5.删除指定的roadname" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Delete_LinkId_lianbiao(rr);
			break;
		case 2:
			Delete_roadnameflag_lianbiao(rr);
			break;
		case 3:
			Delete_Branch_lianbiao(rr);
			break;
		case 4:
			Delete_dispclass_lianbiao(rr);
			break;
		case 5:
			Delete_Roadname_lianbiao (rr);
			break;
		case 0:
			break;
		}
	}
}
void Search_LinkId_listbiao(RoadRecord A[])
{
	int temp = 0;
	cout << "请输入相应序号" << endl;
	cin >> temp;
	RoadRecord* B = new RoadRecord[Length];
	node* p = list_rr.GetFirst();
	int j = 0;
	for (int i = 0; i < sizecount; i++)
	{
		if (list_rr.Get(i).LinkID == temp)
			B[j++] = list_rr.Get(i);
	}
	if (j >= 5)
		Reserve(B, j);
	else
		B->disp();
}
void shunxu_search_lianbiao(RoadRecord A[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择方式:" << endl;
		std::cout << "       1.查询指定的LinkId" << endl;
		std::cout << "       2.查询指定的roadnameflag" << endl;
		std::cout << "       3.查询指定的branch" << endl;
		std::cout << "       4.查询指定的dispclass" << endl;
		std::cout << "       5.查询指定的roadname" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Search_LinkId_listbiao(A);
			break;
		case 2:
			Search_roadnameflag(A);
			break;
		case 3:
			Search_Branch(A);
			break;
		case 4:
			Search_dispclass(A);
			break;
		case 5:
			Search_Roadname(A);
			break;
		case 0:
			break;
		}
	}
}
void Search_Data_lianbiao(RoadRecord rr[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择查询方式:" << endl;
		std::cout << "       1.顺序查找" << endl;
		std::cout << "       2.查找树查找" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			shunxu_search_lianbiao(rr);
			break;
		case 2:

			break;
		case 3:
			chazhaoshu_shunxu(rr);
			break;
		case 0:
			break;
		}
	}
}
void lianbiao(RoadRecord A[])
{
	int opt = 1;//选择变量
	while (opt != 0)
	{
		std::cout << "请选择服务种类:" << endl;
		std::cout << "       1.读取文件" << endl;
		std::cout << "       2.插入" << endl;
		std::cout << "       3.删除" << endl;
		std::cout << "       4.查找" << endl;
		std::cout << "       5.排序" << endl;
		std::cout << "       6.空间释放" << endl;
		std::cout << "       7.更新文件" << endl;
		std::cout << "       0.退出" << endl;
		std::cout << "请输入相应序号:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Read_File_Data_lianbiao(A);
			std::cout << "读取文件完成" << endl;
			break;
		case 2:
			Add_Record_lianbiao(A);
			break;
		case 3:
			Delete_Data_lianbiao(A);
			break;
		case 4:
			Search_Data_lianbiao(A);
			break;
		case 5:
			Sort_Data(A);
			break;
		case 6:
			Space_Release(A);
			break;
		case 7:
			Reserve(A, sizecount);
			printf("数据更新成功");
			break;
		case 0:
			break;
		}
	}
}
void Menu(RoadRecord rr[])
{
	int opt = 1;//选择变量
	while (opt != 0) {
		std::cout << "* * * * * * * * * * * * * * * * * * * * * * * * * *" << endl;
		std::cout << "*         -Welcome                                *" << endl;
		std::cout << "*                 -to                             *" << endl;
		std::cout << "*                    -电子地图管理系统-           *" << endl;
		std::cout << "*-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-*" << endl;
		std::cout << "*         1.读取文件                              *" << endl;
		std::cout << "*         2.顺序表                                *" << endl;
		std::cout << "*         3.链表                                  *" << endl;
		std::cout << "*         4.查找树                                *" << endl;
		std::cout << "*         0.退出系统                              *" << endl;
		std::cout << "* * * * * * * * * * * * * * * * * * * * * * * * * *" << endl;
		std::cout << "请选择:" << endl;
		std::cin >> opt;
		switch (opt)
		{
		case 1:
			Read_File_Data(rr);
			break;
		case 2:
			if (mark1 == 0) {
				std::cout << "请先读取文件!" << endl;
				break;
			}
			shunxu(rr);
			break;
		case 3:
			if (mark1 == 0) {
				std::cout << "请先读取文件!" << endl;
				break;
			}
			lianbiao(rr);
			break;
		case 4:
			if (mark1 == 0) {
				std::cout << "请先读取文件!" << endl;
				break;
			}
			//chazhaoshu(rr);
			break;
		case 0:
			break;
		}
	}
	system("cls");
	std::cout << "* * * * * * * * * * * * * * * * * * * * * * * * * *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "*                  已退出系统!                   *" << endl;
	std::cout << "*                 感谢您的使用!                  *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "*                                                 *" << endl;
	std::cout << "* * * * * * * * * * * * * * * * * * * * * * * * * *" << endl;
}
int main()
{
	RoadRecord* dd = new RoadRecord[Length];//动态创建对象数组以防止stack overflow
	/*设计打开系统的简单欢迎界面*/
	std::cout << "* * * * * * * * * * * * * * * * * * * * * * * * * *" << endl;
	for (int i = 0; i < 4; i++) {
		std::cout << "*                                                 *" << endl;
	}
	std::cout << "*                  系统加载中...                  *" << endl;
	std::cout << "*                  请稍等:)                      *" << endl;
	for (int i = 0; i < 4; i++) {
		std::cout << "*                                                 *" << endl;
	}
	std::cout << "* * * * * * * * * * * * * * * * * * * * * * * * * *" << endl;
	Menu(dd);
	delete[]dd;
	system("pause");
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值