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;
}