【算法与数据结构】图 -- 邻接表
/************************************************************************
边(弧)结点
--------------------------
|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;
}
**********************技术交流请 email:cuihao0532#163.com 欢迎转载,转载请注明出处!***************************** 如果对本文满意请扫描文章左侧【二维码添加微信】获取更多好玩、有趣、有益、有营养的料,
你我共同成长!Y(^_^)Y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗