#include<iostream>
using namespace std;
#define len 100
class Graph{
// 内部类
private:
// 邻接表中表对应的链表的顶点
class ENode{
public:
int vex; // 顶点
ENode *nextEdge; // 指向下一条弧
};
// 邻接表中表的顶点
class VNode{
public:
char data; // 顶点信息
ENode *firstEdge; // 指向第一条依付该顶点的弧
};
// 私有成员
private:
int n; // 节点个数
int e; // 边的个数
VNode mVexs[len];
public:
Graph(){
ENode *node;
n = 7;
e = 9;
// 设置节点为默认数值
string nodes = "ABCDEFG";
// 输入节点
for(int i=0; i < n; i++){
mVexs[i].data = nodes[i];
mVexs[i].firstEdge = NULL;
}
// 设置边为默认值
char edges[][2] = {
{'A', 'B'},
{'B', 'C'},
{'B', 'E'},
{'B', 'F'},
{'C', 'E'},
{'D', 'C'},
{'E', 'B'},
{'E', 'D'},
{'F', 'G'}
};
// 初始化邻接表的边
for(int i=0; i < e; i++){
int start = get_Node_Index(edges[i][0]);
int end = get_Node_Index(edges[i][1]);
// 初始化 node1
node = new ENode();
node->vex = end;
node->nextEdge = NULL;
// 将 node 添加到 srart 所在链表的末尾
if(mVexs[start].firstEdge == NULL){
mVexs[start].firstEdge = node;
}
else{
linkLast(mVexs[start].firstEdge, node);
}
}
}
void linkLast(ENode*p1, ENode*p2){
ENode*p = p1;
while(p->nextEdge){
p = p->nextEdge;
}
p->nextEdge = p2;
}
// 返回顶点下标
int get_Node_Index(char number){
for(int i=0; i < n; i++){
if(number == mVexs[i].data){
return i;
}
}
return -1; //这句话永远不会执行的
}
// 输出邻接表
void print(){
for(int i=0; i < n; i ++){
cout<<mVexs[i].data;
ENode *temp = mVexs[i].firstEdge;
while(temp){
cout<<" -> "<<temp->vex;
temp = temp->nextEdge;
}
cout<<endl;
}
cout<<endl;
}
};
int main(){
Graph g;
g.print();
return 0;
}
#include<iostream>
using namespace std;
#define len 100
class Graph{
// 内部类
private:
// 邻接表中表对应的链表的顶点
class ENode{
public:
int vex; // 顶点
ENode *nextEdge; // 指向下一条弧
};
// 邻接表中表的顶点
class VNode{
public:
char data; // 顶点信息
ENode *firstEdge; // 指向第一条依付该顶点的弧
};
// 私有成员
private:
int n; // 节点个数
int e; // 边的个数
VNode mVexs[len];
public:
Graph(){
ENode *node;
// 输入节点个数
cout<<"输入节点数目: ";
cin>>n;
// 输入边的个数
cout<<"输入边的数目: ";
cin>>e;
// 输入节点
for(int i=0 ; i < n; i++){
cout<<"请输入第 "<<i+1<<" 个节点: ";
cin>>mVexs[i].data;
mVexs[i].firstEdge = NULL;
}
// 初始化邻接表的边
char t1, t2;
for(int i=0; i < e; i++){
cout<<"请输入第 "<<i+1<<" 条边起点: ";
cin>>t1;
cout<<"请输入第 "<<i+1<<" 条边终点: ";
cin>>t2;
int start = get_Node_Index(t1);
int end = get_Node_Index(t2);
// 初始化 node1
node = new ENode();
node->vex = end;
node->nextEdge = NULL;
// 将 node 添加到 srart 所在链表的末尾
if(mVexs[start].firstEdge == NULL){
mVexs[start].firstEdge = node;
}
else{
linkLast(mVexs[start].firstEdge, node);
}
}
}
void linkLast(ENode*p1, ENode*p2){
ENode*p = p1;
while(p->nextEdge){
p = p->nextEdge;
}
p->nextEdge = p2;
}
// 返回顶点下标
int get_Node_Index(char number){
for(int i=0; i < n; i++){
if(number == mVexs[i].data){
return i;
}
}
return -1; //这句话永远不会执行的
}
// 输出邻接表
void print(){
for(int i=0; i < n; i ++){
cout<<mVexs[i].data;
ENode *temp = mVexs[i].firstEdge;
while(temp){
cout<<" -> "<<temp->vex;
temp = temp->nextEdge;
}
cout<<endl;
}
cout<<endl;
}
};
int main(){
Graph g;
g.print();
return 0;
}
参考资料