#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct EdgeNode//边表节点
{
int adjvex;//存储该顶点对应的下标
struct EdgeNode* next;//指向该顶点的下一个邻接点
}EdgeNode;
typedef struct VertexNode//顶点表结点
{
char data;//顶点
EdgeNode* firstedge;//边表头指针
}VertexNode;
typedef struct//图的邻接表存储结构
{
VertexNode adjList[4];//有4个VertexNode这种类型的顶点,定义一个数组adjList[4],每个元素是VertexNode类型
int numVertexes, numEdges;//图中顶点数和边数,这里是4,5
}GraphAdjList;
GraphAdjList* CreateALGraph(GraphAdjList* Gp)//无向图的邻接表创建
{
Gp = (GraphAdjList*)malloc(sizeof(GraphAdjList));
//申请一片GraphAdjList大小的类型很重要,否则Gp指向NULL(GL传的值是NULL),程序就运行崩溃了
EdgeNode* pe;//定义边表指针类型pe
cout << "输入点数、边数" << endl;
cin >> Gp->numVertexes >> Gp->numEdges;//输入4 5
for (int k = 0; k < Gp->numVertexes; k++)
{
cout << "输入各个顶点(一次只输入一个)" << endl;
cin >> Gp->adjList[k].data;//输入A B C D
Gp->adjList[k].firstedge = NULL;//将边表头指针指向NULL,即置为0
}
for (int k = 0; k < Gp->numEdges; k++)//建立边表
{
int i, j;
cout << "输入相连的两边:" << endl;
cin >> i >> j;//每次循环依次输入0 1,0 2,0 3,1 2,2 3
pe = (EdgeNode*)malloc(sizeof(EdgeNode));
pe->adjvex = j;// 邻接序号为j
pe->next = Gp->adjList[i].firstedge;//将pe的指针指向当前顶点指向的结点
Gp->adjList[i].firstedge = pe;//将当前顶点的指针指向pe
pe = (EdgeNode*)malloc(sizeof(EdgeNode));
pe->adjvex = i;
pe->next = Gp->adjList[j].firstedge;
Gp->adjList[j].firstedge = pe;//无序图重复上面步骤
}
return Gp;
}
int main(void)
{
GraphAdjList* GL = NULL;
GL = CreateALGraph(GL);
//以下是验证图的创建是否正确
cout << GL->adjList[0].data<<" ";
cout << GL->adjList[0].firstedge->adjvex << "->";//输出3,A的第一个指向是D
cout << GL->adjList[0].firstedge->next->adjvex << "->";//输出2,A第二个指向是C
cout << GL->adjList[0].firstedge->next->next->adjvex << endl;//输出1,A的第三个指向是B
cout << GL->adjList[1].data<<" ";
cout << GL->adjList[1].firstedge->adjvex << "->";//输出2,B的第一个指向是C
cout << GL->adjList[1].firstedge->next->adjvex << endl;//输出0,B第二个指向是A
cout << GL->adjList[2].data << " ";
cout << GL->adjList[2].firstedge->adjvex << "->";//输出3,C的第一个指向是D
cout << GL->adjList[2].firstedge->next->adjvex << "->";//输出1,C第二个指向是B
cout << GL->adjList[2].firstedge->next->next->adjvex << endl;//输出0,C的第三个指向是A
cout << GL->adjList[3].data << " ";
cout << GL->adjList[3].firstedge->adjvex << "->";//输出2,D的第一个指向是C
cout << GL->adjList[3].firstedge->next->adjvex << endl;//输出0,D第二个指向是A
return 0;
}