#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define INFINITY 65535
typedef char VertexType; /*顶点类型char*/
typedef int Arc;/*边的类型int*/
//邻接表的节点
typedef struct AdjListNode_
{
int end; //关联顶点
int weight; //边权重
struct AdjListNode_ *next;
}AdjListNode;
typedef AdjListNode* adjListNodePtr; //结点的指针
typedef struct MGraph
{
VertexType Vexs[MAXSIZE]; /*顶点元素*/
int VexsNum;
adjListNodePtr *headNodeArray; //链表头结点数组
}MGraph;
/*创建无向网图*/
int CreateMGraph(MGraph *G)
{
int i = 0, j = 0, k = 0, weight = 0;
char ch;
printf("请输入顶点数\n");
scanf("%d", &G->VexsNum);
ch = getchar(); //吸收enter
G->headNodeArray = new adjListNodePtr[G->VexsNum]; //初始化头结点数组
for (i=0;i<G->VexsNum;i++)
{
G->headNodeArray[i] = nullptr;
}
/*用户输入,生成顶点数组*/
printf("请输入顶点信息(char类型)\n");
for (i = 0; i < G->VexsNum; i++)
{
scanf("%c", &G->Vexs[i]);
ch = getchar();
}
char cha = 'p';
while (cha != 'q') //回车
{
printf("请输入(vi,vj)边的下标i,j和权值w: ");
scanf("%d%d%d%c", &i, &j, &weight, &cha);
cha = getchar();
ch = getchar();
//创建结点并从头结点插入
AdjListNode *node = new AdjListNode;
node->end = j;
node->next = G->headNodeArray[i];
node->weight = weight;
G->headNodeArray[i] = node;
}
return 0;
}
/*显示邻接表*/
int DisplayMGraph(MGraph *G)
{
int i = 0;
printf("G含有%d个顶点\n", G->VexsNum);
printf("打印顶点表信息\n");
for (i = 0; i < G->VexsNum; i++)
{
printf("%c ", G->Vexs[i]);
}
printf("各节点连接情况\n");
for (i = 0; i < G->VexsNum; i++)
{
printf("[%d]\t", i);
AdjListNode *node = G->headNodeArray[i];
while (node != nullptr)
{
printf("(%d,%d)、", node->end, node->weight); //连接结点及权值
node = node->next;
}
printf("\n");
}
return 0;
}
int main(void)
{
MGraph G;
CreateMGraph(&G);
DisplayMGraph(&G);
system("pause");
return 0;
}
图的邻接表存储实现c语言
最新推荐文章于 2025-06-30 19:47:43 发布