邻接表【C数据结构】

题目描述:

已知一个有向图g已经建立,求从该图的某个顶点出发,经过两条边所能到达的顶点的集合。例如从顶点M出发,经过一条边到达顶点N,再经过一条边到达顶点T,则顶点T属于该集合,而顶点N不属于该集合。(该图的存储方式可以是邻接矩阵或邻接表,可以根据需要任意选用。)

#include "stdio.h"    
#include "stdlib.h"    
#include "math.h"  
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */
typedef int Status;	
typedef char VertexType; 
typedef int InfoType;

int m;
int res[MAXVEX],dist[MAXVEX],num;
int vis[MAXVEX];

typedef struct ArcNode /* 边表结点  */
{
	int adjvex;    /* 邻接点域,存储该顶点对应的下标 */
	InfoType info;		/* 用于存储权值,对于非网图可以不需要 */
	struct ArcNode *next; /* 链域,指向下一个邻接点 */
}ArcNode;

typedef struct VexNode /* 顶点表结点 */
{
	VertexType data; /* 顶点域,存储顶点信息 */
	ArcNode *firstedge;/* 边表头指针 */
}VexNode, AdjList[MAXVEX];

typedef struct
{
	AdjList adjList; 
	int vexnum,arcnum; /* 图中当前顶点数和边数 */
}ALGraph;

ALGraph G;

/* 建立图的邻接表结构 */
void  CreateALGraph(ALGraph *G)
{
	int i,j,k;
	ArcNode *e;
	printf("输入顶点数和边数:\n");
	scanf("%d %d",&G->vexnum,&G->arcnum); /* 输入顶点数和边数 */
	for(i = 0;i < G->vexnum;i++) /* 建立顶点表 */
	{
		// scanf(&G->adjList[i].data); 	
		G->adjList[i].data=i;
		G->adjList[i].firstedge=NULL; 	/* 将边表置为空表 */
	}
	
	printf("输入边(vi,vj)上的顶点序号:\n");
	for(k = 0;k < G->arcnum;k++)/* 建立边表 */
	{
		scanf("%d %d",&i,&j); /* 输入边(vi vj)上的顶点序号 */
		e=(ArcNode *)malloc(sizeof(ArcNode)); /* 向内存申请空间,生成边表结点 */
		e->adjvex=j;					/* 邻接序号为j */                         
		e->next=G->adjList[i].firstedge;	/* 将e的指针指向当前顶点上指向的结点 */
		G->adjList[i].firstedge=e;		/* 将当前顶点的指针指向e */                            
	}
}

void check()
{
	scanf("%d",&m); /* 输入索要查询的顶点M */
	m--;
	ArcNode *t;
	for(t=G.adjList[m].firstedge;t!=NULL;t=t->next)
	{
		int tmp=t->adjvex;
		ArcNode *p;
		for(p=G.adjList[tmp].firstedge;p!=NULL;p=p->next)
		{
			int k=p->adjvex;
			if(vis[k]==0)
			{
				res[num++]=k;
				vis[k]=1;
			}
		}
	}
}

int main()
{
	CreateALGraph(&G);
	check();
	for(int i=0;i<num;i++)
		printf("%d ",res[i]);
	return 0;
}
/*
5 7
1 2
2 3
3 5
3 4
1 3
2 4
4 5

2
4 5 3
*/
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接表是一种常用的表示图的数据结构。在C语言中,可以使用结构体和链表来实现邻接表。 首先,我们定义一个结构体来表示图的顶点: ```c typedef struct Vertex { int data; // 顶点的数据 struct Edge* next; // 指向第一条与该顶点相连的边 } Vertex; ``` 然后,我们定义一个结构体来表示图的边: ```c typedef struct Edge { int dest; // 边的目标顶点 struct Edge* next; // 指向下一条与同一个起始顶点相连的边 } Edge; ``` 接下来,我们可以使用一个数组来存储图的所有顶点,每个顶点都是一个链表的头节点: ```c #define MAX_VERTICES 100 Vertex vertices[MAX_VERTICES]; int numVertices = 0; ``` 接下来,我们可以实现一些操作来增加和访问图的顶点和边。以下是一些常见的操作: 1. 添加顶点: ```c void addVertex(int data) { Vertex newVertex; newVertex.data = data; newVertex.next = NULL; vertices[numVertices++] = newVertex; } ``` 2. 添加边: ```c void addEdge(int src, int dest) { Edge* newEdge = (Edge*)malloc(sizeof(Edge)); newEdge->dest = dest; newEdge->next = vertices[src].next; vertices[src].next = newEdge; } ``` 3. 打印邻接表: ```c void printGraph() { for (int i = 0; i < numVertices; i++) { printf("Vertex %d:", vertices[i].data); Edge* currEdge = vertices[i].next; while (currEdge != NULL) { printf(" -> %d", currEdge->dest); currEdge = currEdge->next; } printf("\n"); } } ``` 这样,我们就可以使用上述代码来实现邻接表数据结构和一些操作。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值