假设图的数据元素类型为字符,采用邻接表存储。请编程实现下列操作:
(1) 创建图。用户可以选择创建图的类型,根据类型输入有关信息;
(2)插入顶点
(3)删除顶点
(4)插入边
(5)删除边
(6)深度遍历
欢迎评论!
(1) 创建图。用户可以选择创建图的类型,根据类型输入有关信息;
(2)插入顶点
(3)删除顶点
(4)插入边
(5)删除边
(6)深度遍历
(7)广度遍历
#include <iostream>
#include <string>
#include <math.h>
#include <stdio.h>
#include <queue>
using namespace std;
struct linkNode//存储邻接点信息
{
int loc;
int weight;
linkNode *next;
linkNode(int location,int cost):loc(location),weight(cost),next(NULL) { }
};
struct VNode//存储元素
{
char vertex;
linkNode *next;
};
class Graph
{
private:
int type;
VNode *table;
int VNum;
int ENum;
int maxV;
public:
void setType(int i)
{
type = i;
}
int getType()
{
return type;
}
Graph(int sz=10)//构造函数
{
table = new VNode[sz];
if(table==NULL) cout<<"分配出错"<<endl;
for(int i = 0; i<sz; i++) table[i].next =NULL;
VNum = 0;
ENum = 0;
maxV = sz;
}
~Graph()//析构函数
{
for(int i = 0; i < VNum; i++)
{
linkNode *p =table[i].next;
while(p != NULL)
{
table[i].next = p->next;
delete p;
p = table[i].next;
}
}
delete [ ]table; //删除顶点表数组
}
int getVPos(char v)//得到点的位置
{
for(int i=0; i<VNum; i++)
{
if(table[i].vertex==v)return i;
}
return -1;
}
char getVlue(int i)//由位置得到点
{
if(i<VNum)return table[i].vertex;
else return '\0';
}
char getFirstNeighbor(char v)//得到第一个邻居
{
int pos = getVPos(v);
if(pos==-1)return '\0';
else
{
if(table[pos].next!=NULL)return getVlue(table[pos].next->loc);
else return '\0';
}
}
char getNextNeighbor (char v, char w)//得到w后的邻居
{
int pos1 = getVPos(v);
int pos2 = getVPos(w);
if(pos1 !=-1 && pos2 !=-2)
{
linkNode *temp = table[pos1].next;
while(temp!=NULL)
{
if(temp->loc==pos2)
{
if(temp->next==NULL) return '\0';
return getVlue(temp->next->loc);
}
else temp = temp->next;
}
}
return '\0';
}
bool insertV(char v)//插入顶点
{
if(VNum<maxV)
{
table[VNum].vertex = v;
VNum++;
return true;
}
return false;
}
bool deleteV(char v)//删除顶点
{
int i = getVPos(v);
if(v==-1)return false;
else
{
linkNode *temp = table[i].next;
while(temp!=NULL)
{
table[i].next = temp->next;
delete temp;
temp = table[i].next;
}
for(int j = i; j<VNum-1; j++) table[j] = table[j+1];
VNum--;
return true;
}
}
bool insertEdge(char v1,char v2,int cost)//插入边
{
int p1 = getVPos(v1);
int p2 = getVPos(v2);
if(p1 !=-1 && p2!=-1)
{
if(table[p1].next==NULL)
{
table[p1].next=new linkNode(p2,cost);
}
else
{
linkNode *temp = table[p1].next;
while(temp->next!=NULL)
{
temp = temp->next;
}
temp->next = new linkNode(p2,cost);
}
return true;
}
else return false;
}
bool deleteEdge(char v1,char v2)//删除边
{
int i = getVPos(v1);
int j = getVPos(v2);
if(table[i].next!=NULL)
{
if(table[i].next->loc==j)
{
linkNode *temp = table[i].next;
table[i].next = temp->next;
delete temp;
return true;
}
else
{
linkNode *node = table[i].next;
linkNode *temp = table[i].next->next;
while(temp!=NULL)
{
if(temp->loc==j)
{
node->next = temp->next;
delete temp;
return true;
}
else
{
node = temp;
temp = temp->next;
}
}
return false;
}
}
return false;
}
void DFS(char v, bool visited[])//以某一顶点开始的深度遍历
{
cout<<"->"<<v;
int i = getVPos(v);
visited[i] = true;
char w = getFirstNeighbor(v);
int j = getVPos(w);
while(j!=-1)
{
if(!visited[j])DFS(w,visited);
w = getNextNeighbor(v,w);
j = getVPos(w);
}
}
void DFS_Graph()//深度遍历
{
bool *visited = new bool[VNum];
for(int i = 0; i<VNum; i++) visited[i] = false;
for(int i=0; i<VNum; i++)
{
if(!visited[i])DFS(table[i].vertex,visited);
}
delete [] visited;
cout<<endl;
}
void BFS ()//广度遍历
{
if(VNum==0) return ;
char v = table[0].vertex;
bool *visited = new bool[VNum];
for(int i = 0; i<VNum; i++) visited[i] = false;
cout<<"->"<<v;
int j = 0;
visited[j] = true;
queue<char> q;
q.push(v);
char w;
while(!q.empty())
{
v = q.front();
q.pop();
w = getFirstNeighbor(v);
j = getVPos(w);
while(j!=-1)
{
if(!visited[j])
{
cout<<"->"<<w;
visited[j]=true;
q.push(w);
}
w = getNextNeighbor(v,w);
j = getVPos(w);
}
}
cout<<endl;
}
};
void show(Graph &g)
{
cout<<"*****************"<<endl;
cout<<"[1]插入顶点"<<endl;
cout<<"[2]插入边"<<endl;
cout<<"[3]删除顶点"<<endl;
cout<<"[4]删除边"<<endl;
cout<<"[5]以顶点V1开始的广度遍历"<<endl;
cout<<"[6]深度遍历"<<endl;
cout<<"*****************"<<endl;
int i;
cin>>i;
getchar();
char c,c1,c2;
switch(i)
{
case 1:
cout<<"请输入定点的值,字符型变量"<<endl;
cin>>c;
g.insertV(c);
break;
case 2:
cout<<"请输入两个顶点上的值,字符型变量"<<endl;
cin>>c1>>c2;
if(g.getType()) g.insertEdge(c1,c2,1);
else
{
g.insertEdge(c1,c2,1);
g.insertEdge(c2,c1,1);
}
break;
case 3:
cout<<"请输入定点的值,字符型变量"<<endl;
cin>>c;
g.deleteV(c);
break;
case 4:
cout<<"请输入两个顶点上的值,字符型变量"<<endl;
cin>>c1>>c2;
if(g.getType()) g.deleteEdge(c1,c2);
else
{
g.deleteEdge(c1,c2);
g.deleteEdge(c2,c1);
}
break;
case 5:
g.BFS();
break;
case 6:
g.DFS_Graph();
break;
default:
break;
}
}
int main()
{
int n;
cout<<"请输入顶点个数的最大值"<<endl;
cin>>n;
Graph g(n);
cout<<"请输入1或0,1表示有向图,0表示无向图"<<endl;
int i;
cin>>i;
if(i==1 || i==0)g.setType(i);
else
{
cout<<"输入有误";
return 0;
}
for(;;)
{
show(g);
}
return 0;
}
欢迎评论!