/************************************************************************
边(弧)结点
--------------------------
|adjvex | info | nextarc |
--------------------------
adjvex:邻接点域,该点在图中的位置
info :相关信息,比如可以保存从某顶点到该点的权值
nextac:指向下一个与该点有相同邻接点的顶点
顶点结点
------------------
|data | firstarc |
------------------
data :该顶点的数据
firstarc:第一个与该顶点邻接的顶点
e.g.
顶点1,2,3,4
--------- -------- ---------
0 | 1 | |--->| 2 | |--->| 1 | ^ |
---------
1 | 2 | ^ |
--------- ---------
2 | 3 | |--->| 3 | ^ |
--------- ---------
3 | 4 | |--->| 0 | ^ |
--------- ---------
PS:画上面这个图 容易么我
************************************************************************/
//最大顶点个数
const int MAX_VERTEX = 100;
//最大值
const int MAX_VALUE = (1 << 31) - 1;
//边(弧)结点
typedef struct _tagArcNode
{
int adjvex; //该边(弧)所指向的顶点在图中的位置
struct _tagArcNode* nextarc; //下一个与该顶点有相同邻接点的边(弧)结点
char info; //相关信息,比如可以保存该边(弧)的权值
}ArcNode;
//顶点节点
typedef struct _tagVNode
{
char data; //顶点信息
ArcNode* firstArc; //该顶点的第一条边(弧)所指向的顶点
}VNode, AdjList[MAX_VERTEX];
typedef struct _tagGraph
{
AdjList vertices; //该图的所有顶点
int vexnum; //顶点个数
int arcnum; //边(弧)的条数
}Graph;
定位顶点在图中的位置,其位置也就是在一维数组中的下标
int Locate(Graph& graph, char ch)
{
for (int i = 0; i < graph.vexnum; ++ i)
{
if (ch == graph.vertices[i].data) return i;
}
return -1;
}
构造图
void CreateGraph(Graph& graph)
{
int num = 0;
cout << "请输入图的顶点个数:";
cin >> num;
graph.vexnum = num;
cout << "请输入图的边(弧)的条数:";
cin >> num;
graph.arcnum = num;
cout<<endl<<endl;
cout<<"开始输入每个顶点"<<endl;
for (int i = 0; i < graph.vexnum; ++ i)
{
cout << "请输入顶点:";
char ch = 0;
cin >> ch;
graph.vertices[i].data = ch;
graph.vertices[i].firstArc = NULL;
}
cout<<endl<<"结束输入顶点"<<endl<<endl;
cout<<"开始构造邻接表"<<endl;
for (int i = 0; i < graph.vexnum; ++ i)
{
int nCount = 1;
while(1)
{
cout << "请输入顶点 "<<graph.vertices[i].data<<" 的第 " << nCount++<<" 个邻接点, 输入#结束:";
char ch = 0;
cin >> ch;
if (ch == ‘#‘) break;
ArcNode* pArcNode = new ArcNode();
pArcNode->adjvex = Locate(graph, ch);
pArcNode->nextarc = NULL;
//如果该顶点还没有设置第一条边(弧),则将该输入顶点确定的边(弧)
//作为该顶点的第一条边(弧)
if (NULL == graph.vertices[i].firstArc)
{
graph.vertices[i].firstArc = pArcNode;
}
//否则,遍历该顶点所在链表,找到最后一个节点,将其nextarc指针域
//设置为由当前输入的顶点确定的边(弧)
else
{
ArcNode* pTemp = graph.vertices[i].firstArc;
//直到找到顶点所在链表的最后一个边(弧)结点为止
while(pTemp->nextarc != NULL) pTemp = pTemp->nextarc;
//找到最后一个边(弧)结点后,将其nextarc指针域设置为当前输入的顶点所确定的边(弧)
pTemp->nextarc = pArcNode;
}
} //while(1)
} //for
cout << endl<<"结束构造邻接表"<<endl<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Graph graph;
CreateGraph(graph);
return 0;
}
【算法与数据结构】图 -- 邻接表,布布扣,bubuko.com
原文:http://www.cnblogs.com/cuish/p/3760047.html