简述:
邻接表相比临界矩阵,临界表的空间复杂度较低,适用于稀疏图。临界表用顺序存储加链式存储的方式实现,每个节点包含数据域和指向第一条边或第一条弧的指针。对于带权图,可以在相关顶点中加入全值信息。
常量的定义:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */
结构体的定义:
(1)顶点表的建立:
typedef struct VertexNode{//定义顶点节点
VertexType data;//定义顶点数据
EdgeNode *firstedge; //边表头指针指向第一个边
}VertexNode,AdjList[MAXVEX];
(2)边链表的建立:
typedef struct EdgeNode{//定义边节点
int adjvex;//储存该节点对应的下标值
EdgeType info;//边的权值(可以没有)
EdgeNode *next;//指向下一条边
}EdgeNode;
(3)图的建立:
typedef struct{
AdjList adjList;//定义顶点数组
int numNodes,numEgdes;//定义顶点数,边数
}GraphAdjList;
(4)对所定义的图进行初始化:
void CreateALGraph(GraphAdjList *G)
{
int i,j,k;
EdgeNode *e;
printf("输入顶点数和边数:\n");
scanf("%d,%d",&G->numNodes,&G->numEdges);//输入顶点数和边数
//初始化顶点表
for(i = 0;i < G->numNodes;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)上的顶点序号 */
//对于无向图来说,输入一条边就要建立两个边界点分别插入i,j的链表头
//下述利用头插法为链表中插入节点
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; /* 邻接序号为i */
e->next=G->adjList[j].firstedge; /* 将e的指针指向当前顶点上指向的结点 */
G->adjList[j].firstedge=e; /* 将当前顶点的指针指向e */
}
}