创建图的邻接表

#define MAXVEX 100
typedef char VertexType;	/*顶点类型由用户定义*/
typedef int EdgeType;	/*边上的权值类型应由用户定义*/

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

typedef struct VertexNode
{
	VertexType data;	/*邻接点域*/
	EdgeNode *firstedge;	/*边表头指针*/
}VertexNode,AdjList[MAXVEX];

typedef struct GraphAdjList
{
	AdjList adjlist;
	int numVertexes, numEdges;	/*图中当前顶点数和边数*/
}GraphAdjList;


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

		e = (EdgeNode *)malloc(sizeof(EdgeNode));/*向内存中申请空间*/
		e->adjvex = i;	/*邻接序号为j*/
		e->next = G->adjlist[j].firstedge;	/*将e指针指向当前顶点指向的结点*/
		G->adjlist[j].firstedge = e;	/*将当前顶点的指针指向e*/

	}
}

 

### 使用邻接表创建 邻接表是一种用于表示的数据结构,它对于稀疏尤其有效。该方法通过链表的方式存储每个顶点所关联的边的信息。 #### 定义必要的结构体 为了构建基于邻接表,需先定义两个主要结构体:`ArcNode` 和 `VertexNode`。前者代表边表节点,后者则对应于顶点表节点[^2]。 ```c typedef struct ArcNode { int adjvex; struct ArcNode* nextarc; } ArcNode; typedef struct VertexNode { char data; ArcNode* firstarc; } VertexNode, AdjList[MAXVEX]; typedef struct { AdjList vertices; int vexnum, arcnum; GraphKind kind; } ALGraph; ``` 上述代码片段展示了如何声明这些基本单元。这里假设字符型变量 `data` 存储的是顶点上的信息;而整数类型的成员 `adjvex` 则用来记录与当前顶点相连的目标顶点索引位置。 #### 构建函数 接下来是具体的创建过程,在此过程中会涉及到读取用户输入并动态建立相应的链接关系: ```c void CreateGraph(ALGraph*& G) { printf("请输入顶点数目和弧的数量:"); scanf("%d %d", &(G->vexnum), &(G->arcnum)); // 初始化顶点列表 for(int i = 0; i < G->vexnum; ++i){ getchar(); printf("请输入第%d个顶点的信息:", i); scanf("%c", &(G->vertices[i].data)); G->vertices[i].firstarc = NULL; } // 插入每条边 for(int k = 0; k < G->arcnum; ++k){ int v1, v2; printf("请输入一条边依附的两个顶点的位置(起始 结束):"); scanf("%d %d", &v1, &v2); // 对应无向的情况处理 ArcNode* p1 = (ArcNode*)malloc(sizeof(ArcNode)); p1->adjvex = v2; p1->nextarc = G->vertices[v1].firstarc; G->vertices[v1].firstarc = p1; ArcNode* p2 = (ArcNode*)malloc(sizeof(ArcNode)); p2->adjvex = v1; p2->nextarc = G->vertices[v2].firstarc; G->vertices[v2].firstarc = p2; } } ``` 这段程序首先获取了关于新的一些基本信息(比如有多少个顶点以及它们之间的连接情况),之后逐一对各个顶点进行了初始化操作,并按照指定的关系建立了彼此间的联系[^4]。 #### 打印形化展示 最后可以编写一个简单的打印功能来验证刚刚构造出来的是否正确无误: ```c void PrintGraph(ALGraph* G){ for(int i=0;i<G->vexnum;++i){ printf("\nvertex[%d]=%c -> ", i,G->vertices[i].data); ArcNode *p=G->vertices[i].firstarc; while(p!=NULL){ printf("(%d)",p->adjvex); if((p=p->nextarc)!=NULL) printf("-->"); } } } ``` 这将有助于直观理解整个的具体形态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值