实现代码
// ConsoleApplication18.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdlib.h"
typedef struct arcNode
{
int data;
struct arcNode * nextArc; //指向同一个依附弧尾顶点的边的指针
}ArcNode,*PArcNode;
typedef struct vertexNode{
char data;
int otherdata;
ArcNode * firstArc;//指向第一条依附该顶点的边的指针
}VerTex;
typedef struct Graph //定义图的数据结构
{
VerTex vTexList [20];//定一个顶点数组,每个单元存放该顶点的结构体
int arcNums,VTexNums;
}Graph,*PGraph;
int Location(PGraph G,char data)
{
for (int i = 0; i < G->VTexNums; i++)
{
if(G->vTexList[i].data==data)
{
return i;
}
}
return 0;
}
void Create_Graph(PGraph G)
{
printf("输入顶点数和边数\n");
int arcnums,vertextnums;
scanf_s("%d %d",&vertextnums,&arcnums);
char temt = getchar();
G->arcNums = arcnums;G->VTexNums = vertextnums;
char info;
for (int i = 0; i < G->VTexNums; i++)
{
printf("输入第 %d 个顶点的值\n",i+1);
scanf_s("%c",&info);
char temp = getchar();
G->vTexList[i].data = info;
G->vTexList[i].firstArc = NULL;
}
for (int i = 0; i < G->arcNums; i++) //对每个边的依附顶点输入并查找他们所在顶点表的位置
{
printf("输入两个顶点的的值");
char v1,v2;
scanf_s("%c",&v1);
char temp1 = getchar();
scanf_s("%c",&v2);
char temp2 = getchar();
//设置函数从顶点表中找到该顶点所在的索引值
int v1Index = 0,v2Index=0;
v1Index = Location(G,v1);
v2Index = Location(G,v2);
//find successfully
//create ArcNode
PArcNode p1 = new ArcNode;
p1->data = v2Index;
p1->nextArc = G->vTexList[v1Index].firstArc; //前插法将p边节点插入到顶点v1后。
G->vTexList[v1Index].firstArc = p1;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Graph G;
Create_Graph(&G);
for (int i = 0; i < G.VTexNums; i++)
{
printf("%c",G.vTexList[i].data);
PArcNode p = G.vTexList[i].firstArc;
while (p)
{
printf("->%d",p->data);
p = p->nextArc;
}
printf("\n");
}
}
因为无向图在邻接矩阵中呈对称矩阵关系,所以在邻接表中设置了依附v1节点所在的边节点后
需要对边节点也要设置同样依附该节点的边节点。
只需要在该部分进行改动即可