//graph.h
#include
#include
#include"queue.h"
#include
using namespace std;
const int maxValue = 99;
const int size = 10;


struct Sight{
string name;
int id;
string brief;
};


class Graph{
private:
int info[size][size];//存放边的信息
Sight sight[size*size];//存放景点信息,名称、代号
int vexnum;//顶点个数
int arcnum;//边或弧数
bool visited[size*size];
public:
Graph();
void createGraph();
void Tranverse();
void search(string name);
void addEdge(int start, int end, int len);
void removeEdge(int start, int end);
int  getVexnum();
int  getArcnum();
void DFSTraverse();//深度优先遍历广度优先遍立
void DFS(int v); //遍历函数
void visitfun(int v);//访问函数
int FirstAdjVex(int v);
int NextAdjVex(int v, int w);
void BFSTraverse();//广度优先遍立
void BFS(int v);
int Next(int u, int w);
};

void Graph::BFSTraverse()
{
for (int v = 0; v
for ( v = 0; v < vexnum; ++v)
if (!visited[v])  BFS(v);
}

void Graph::BFS(int v)
{
int u=-1;
Queue Q; Q.EnQueue(v); visited[v] = true;
while (!Q.isEmpty())
{
Q.DeQueue(u); visitfun(u);
for (int w = FirstAdjVex(u); w; w = Next(u, w))
if (!visited[w])
{
Q.EnQueue(w); visited[w] = true;
}
}
}


void Graph::DFSTraverse()//深度优先遍历
{
int v;
for (v = 0; v
visited[v] = false;
for (v = 0; v < vexnum; ++v)
if (!visited[v]) DFS(v);
}

void Graph::DFS(int v)
{
visited[v] = true;  visitfun(v);
for (int w = FirstAdjVex(v); w; w = NextAdjVex(v, w))
if (!visited[w])  DFS(w);
}

void Graph::visitfun(int v)
{
cout << "景点信息:" << endl;
cout << "名称:" << sight[v].name << endl;
cout << "编号:" << sight[v].id << endl;
cout << "简介:" << sight[v].brief << endl;
cout << "********************************" << endl;
}

int Graph::FirstAdjVex(int v)
{
for (int i = 0; i
if (info[v][i] != maxValue)
{
if (visited[i] != true) return i;
}


return 0;//返回-1表示该结点没有邻接结点
}

int Graph::Next(int v, int w)//广度优先遍历寻找顶点的下一个邻接点
{
for (int i = 0; i
if (info[v][i] != maxValue)
{
if (visited[i] != true) return i;
}
return 0;
}

int Graph::NextAdjVex(int v, int w)
{
for (int j = 0; j
if (info[w][j] != maxValue)
{
if (visited[j] != true) return j;
}
for (int i = 0; i
if (info[v][i] != maxValue)
{
if (visited[i] != true) return i;
}
return 0;
}

Graph::Graph()
{
vexnum = 0;
arcnum = 0;
for (int i = 0; i
for (int j = 0; j
info[i][j] = maxValue;
}

int Graph::getVexnum()
{
return vexnum;
}

int Graph::getArcnum()
{
return arcnum;
}

void Graph::search(string name)
{

for (int k = 0; k
if (name == sight[k].name)
{
cout << "名称:" << sight[k].name << endl;
cout << "编号:" << sight[k].id << endl;
cout << "简介:" << sight[k].brief << endl;
}
}

void Graph::addEdge(int start, int end, int len){ //在两个指定下标的节点之间添加一条边
if (start>size || end > size)return;
info[start][end] = len;
info[end][start] = len;
arcnum++;
}

void Graph::removeEdge(int start, int end){    //删除两个指定下标顶点之间的边
if (info[start][end] == maxValue || info[end][start] == maxValue)return;
//cout << "顶点" << start << "与" << "顶点" << end << "之间不存在边!" << endl;
info[start][end] = maxValue;
info[end][start] = maxValue;
arcnum--;
}

void Graph::createGraph()
{

cout << "请输入景点数目:";
cin >> vexnum;
for (int i = 0; i
{
cout << "请输入第" << i + 1 << "个景点的信息" << endl;
cout << "名称:";
cin >> sight[i].name;
cout << "编号:";
cin >> sight[i].id;
cout << "简介:";
cin >> sight[i].brief;
}
}

void Graph::Tranverse()
{
for (int k = 0; k
{
cout << "名称:" << sight[k].name << endl;
cout << "编号:" << sight[k].id << endl;
cout << "简介:" << sight[k].brief << endl;
}

cout << "***************************************" << endl;
for (int i = 0; i
{
for (int j = 0; j
{
cout <<setiosflags(ios::left)<<info[i][j] << "   ";
}
cout << endl;
}
}


//queue.h
typedef int ElemType;
const int Max_Size = 100;

class Queue{
private:
int rear;
int front;
bool flag;
ElemType elem[Max_Size];
public:
Queue();
bool EnQueue(ElemType e);
bool DeQueue(ElemType &e);
bool setEmpty();
bool isEmpty();//是否为空,为空返回true否则返回false
bool isFull();//队列满返回true否则返回false
void get(int index, ElemType &e);
int getLength();
void Tranverse();
};

Queue::Queue()
{
flag = true;//初始化为空队列
rear = 0;
front = 0;
}

int Queue::getLength()
{
return (rear + Max_Size - front) % Max_Size;
}


void Queue::get(int index, ElemType &e)
{
if (isEmpty())exit(1);

e = elem[index];
}


bool Queue::isFull()
{
if (flag == false)//false是非空,队列满的前提
return rear == front ? true : false;
else return false;//队列不满返回false

}

bool Queue::isEmpty()
{
if (flag)//flag为true
return rear == front ? true : false;
else return false;
}


bool Queue::EnQueue(ElemType e)
{
if (isFull()) return false;
elem[rear] = e;
rear = (rear + 1) % Max_Size;
return true;
}

bool Queue::DeQueue(ElemType &e)
{
if (isEmpty()) return false;
e = elem[front];
front = (front + 1) % Max_Size;
return true;
}


//main.cpp
#include
#include"graph.h"
using namespace std;


void order()
{
cout << "1.创建图(景点)" << endl;
cout << "2.查看图(景点)的信息" << endl;
cout << "3.查找景点" << endl;
cout << "4.删除两个顶点之间的边" << endl;
cout << "5.深度优先遍历" << endl;
cout << "6.广度优先遍历" << endl;
cout << "7.退出" << endl;
cout << "请输入指令:" << endl;
}

void operation()
{
Graph g1;
int s, e, l, edgeNum;
int index;
order();
while (cin >> index)
{
switch (index)
{
case 1:{
  g1.createGraph();
  cout << "请输入边的数目:";
  cin >> edgeNum;
  for (int i = 0; i
  {
  cout << "请输入第" << i + 1 << "条边的信息:";
  cin >> s >> e >> l;
  g1.addEdge(s, e, l);
  }
  order();
}; break;
case 2:{g1.Tranverse(); order(); }break;
case 3:{
  string name;
  cout << "请输入要查找的名称:";
  cin >> name;
  g1.search(name);
  order();
}; break;
case 4:{
  cout << "请输入两个顶点:";
  cin >> s >> e;
  g1.removeEdge(s, e);
  order();
}; break;
case 5:{g1.DFSTraverse(); order(); }; break;
case 6:{g1.BFSTraverse(); order(); }; break;
case 7:exit(1); break;
default: cout << "错误的指令!"; break;
}
}
}

int main()
{
operation();
system("pause");
return 0;
}