邻接表模版c+

#include<stdio.h>
#include<string.h>
int h[602],b;
struct st
{
	int next,v,s;
}st[100000];
void init()
{
	b=1;
	memset(h,0,sizeof(h));
}
void add(int ne,int v,int s)
{
	st[b].v=v;
	st[b].s=s;
	st[b].next=h[ne];
	h[ne]=b++;
	/*st[b].v=ne;
	st[b].s=0;
	st[b].next=h[v];
	h[ne]=b++;*/
}
void cx(int x)
{
	int i;
	printf("%d\n",h[x]);
	for(i=h[x];i!=0;i=st[i].next)
	{
		printf("%d %d %d\n",x,st[i].v,st[i].s);
	      
	}
}
int main()
{
	int a;
	scanf("%d",&a);
	init();
	while(a--)
	{
		
		int m,n,z;
		scanf("%d%d%d",&m,&n,&z);
		add(m,n,z);
	
	}
	cx(1);
	return 0;
}

主要是查找从一个点出发到所有点的有路的点。。所以要把前点相同的边连在一起。。。




                
### 邻接表存储图结构的实现 邻接表是一种常见的用于存储图结构的方法,其核心思想是通过数组与链表相结合的方式表示图中的顶点和边的关系。以下是关于如何用邻接表存储图结构的具体说明。 #### 1. 邻接表的基本概念 邻接表可以看作是由数组和链表组成的复合数据结构。其中,一维数组用来存储图中每个顶点的信息,而每个顶点对应的链表则记录该顶点所连接的所有其他顶点[^2]。 例如,在C语言中可以通过如下方式定义邻接表: ```c #define MAXVEX 20 /* 最大顶点数 */ typedef struct ENode { int adjvex; // 表示弧头顶点的位置 struct ENode *next; // 指向下一条弧的指针 } ENode; typedef struct VNode { char data; // 顶点信息 ENode *firstArc; // 指向第一条依附于该顶点的弧 } VNode, AdjList[MAXVEX]; typedef struct { AdjList vertices; int vexNum, arcNum; // 图的当前顶点数和弧数 int kind; // 图的种类标志 } ALGraph; ``` 上述代码展示了邻接表的核心组成部分:`ENode`代表每条边(或称为弧),`VNode`则是每个顶点的描述,最后通过`ALGraph`将整个图封装起来[^4]。 #### 2. 构建邻接表的过程 构建邻接表通常涉及以下几个方面: - 初始化顶点数组; - 插入新的边到对应顶点的链表中; 下面是一个简单的例子展示如何创建一个无向图并打印它的邻接表形式: ```c #include <stdio.h> #include <stdlib.h> // 定义节点结构体 struct EdgeNode { int adjvex; // 边的目标顶点索引 struct EdgeNode* next;// 下一条边 }; // 定义顶点结构体 struct VertexNode { char vertexData; // 顶点数据 struct EdgeNode* firstEdge; // 第一条关联边 }; // 定义图的整体结构 struct GraphAdjList { struct VertexNode listVertexes[20]; int vertexNum, edgeNum; }; void CreateALGraph(struct GraphAdjList* graph) { printf("请输入顶点数目和边的数量:"); scanf("%d %d", &graph->vertexNum, &graph->edgeNum); // 输入各顶点的数据 for (int i = 0; i < graph->vertexNum; ++i){ printf("第%d个顶点:", i); getchar(); // 清除缓冲区字符 scanf("%c", &(graph->listVertexes[i].vertexData)); graph->listVertexes[i].firstEdge = NULL; } // 添加边 for(int k=0;k<graph->edgeNum;++k){ int start,end; printf("输入边(%d): ",k); scanf("%d,%d",&start,&end); // 创建新边加入起点的链表 struct EdgeNode* newEdge=(struct EdgeNode*)malloc(sizeof(struct EdgeNode)); newEdge->adjvex=end; newEdge->next=graph->listVertexes[start].firstEdge; graph->listVertexes[start].firstEdge=newEdge; // 如果是有向图,则不需要这一步操作 // 对应终点也需建立反向链接(仅适用于无向图) struct EdgeNode* reverseEdge=(struct EdgeNode*)malloc(sizeof(struct EdgeNode)); reverseEdge->adjvex=start; reverseEdge->next=graph->listVertexes[end].firstEdge; graph->listVertexes[end].firstEdge=reverseEdge; } } void PrintGraph(struct GraphAdjList* graph){ for(int v=0;v<graph->vertexNum;v++){ printf("\n顶点%c: ",graph->listVertexes[v].vertexData); struct EdgeNode* tempEdge=graph->listVertexes[v].firstEdge; while(tempEdge!=NULL){ printf("-->%d ",tempEdge->adjvex); tempEdge=tempEdge->next; } } } ``` 此程序实现了读取用户输入来动态生成一张图,并将其以邻接表的形式输出显示出来。 #### §相关问题§ 1. 如何利用Python实现基于字典的邻接表? 2. 在实际应用中,什么情况下更适合采用邻接矩阵而非邻接表? 3. C++标准模板库(STL)能否简化邻接表的操作?如果能的话具体方法是什么? 4. 当处理大规模稀疏网络时,为什么推荐使用邻接表而不是邻接矩阵? 5. 假设要在一个已有的邻接列表上执行广度优先搜索(BFS),应该怎样设计算法流程?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值