1.邻接矩阵的操作
1.1数据结构描述
#include<stdio.h>
#include<stdlib.h>
#define VERTEX_NUM 64
#define char VexType
#define int AdjType
typedef struct
{
VexType VertexArray[VERTEX_NUM]; //顶点数组
int AdjMatrix[VERTEX_NUM][VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //顶点数,边数
}AM_Graph; //定义图名为AM_GRAPH
1.2建立无向图邻接矩阵
void creat_AdjMatrix(AM_Graph *gPtr) { //传入一个具有顶点数组,邻接矩阵,顶点数和边数的结构体
int i,j,k;
getchar(); //从缓存中获取字符
printf("请输入%d个顶点:",gPtr->vexnum); //记录顶点个数 ,用户输入
for(i = 0;i < gPtr->vexnum;i++){ //根据用户输入的顶点个数,给顶点数组赋值
sacnf("%c",&gPtr->VertexArray[i]); //赋值的数据是顶点数组的索引编号
}
for(i = 0;i < gPtr->vexnum;i++){ //对邻接矩阵用两个for循环进行初始化
for(j = 0;j < gPtr->vexnum;j++){
gPtr->AdjMatrix[i][j] = 0;
}
}
printf("请输入邻接的两个顶点下标:\n"); //对邻接矩阵建立边的关系,用户输入临界点下标
for(k = 0;k < gPtr->arcnum;k++){ //对于在边数范围内的个数
scanf("%d%d",&i,&j); //把用户输入的临界点下标赋值给邻接矩阵
gPtr->AdjMatrix[i][j] = 1;
gPtr->AdjMatrix[j][i] = 1;
}
}
1.3 输出无向图邻接矩阵
void print_AdjMatrix(AM_Graph *gPtr){
int i,j;
printf("建立好后的无向图的邻接矩阵为:\n"); //输出建立好的无向图的邻接矩阵
for(i = 0;i < gPtr->vexnum;i++){ //先输出这是原来的第几行,通过顶点数组访问
printf("%c ",gPtr->VertexArray[i]); //输出该顶点的数据
for(j = 0;j < gPtr->vexnum;j++){ //遍历邻接矩阵,输出矩阵的数值,相当于遍历每一列
printf("%d",gPtr->AdjMatrix[i][j]); //输出
}
printf("\n"); //遍历完每行之后进行换行
}
}
2.邻接表的操作
2.1邻接表的数据结构描述
#include<stdio.h>
#include<stdlib.h>
#define VERTEX_NUM 6 //当前顶点数
#define VERTEX_MAX_NUM 10 //最大顶点数量
#define EDGE_MAX_NUM 20 //最大边数
typedef char VexType //定义顶点类型为char类型
typedef int InfoType //定义与该弧(边)相关信息类型
typedef struct AdjNode{ //定义临界点结构体
int AdjNode; //整形的数据域
struct AdjNode *next; //指向临界点结构体的指针
}AL_AdjNode; //重命名为AL_AdjNode
typedef struct VexNode{ //定义顶点结构体
VexType vexnode; //节点类型的数据域
AL_AdjNode *link; //指向临界点结构体的指针
}AL_VexNode; //重命名为AL_VexNode
typedef struct{ //定义整体的邻接表
AL_VexNode vexlist[VERTEX_MAX_NUM]; //定义长度为顶点最大个数的顶点数组
int vexnum,arcnum; //声明顶点个数,边个数
}AL_Graph; //重命名为AL_Graph
2.2建立有向的邻接表
AL_Graph * creat_AdjList(){
int n,e,i,v1,v2;
AL_AdjNode *AdjPtr,*currentPtr;
AL_Graph *alPtr;
alPtr = (AL_Graph *)malloc(sizeof(AL_Graph));
printf("请输入图的顶点数:\n"); //记录顶点个数
scanf("%d",&n);
for(i = 0;i <= n;i++){ //给顶点数组进行赋值
alPtr->vexlist[i].vexnode = i;
alPtr->vexlist[i].link = NULL;
}
printf("请输入图的边数:\n"); //记录图的边数
sacnf("%d",&e);
printf("请输入弧的信息:\n"); //记录图的边的信息
for(i = 0;i < e;i++){
printf("请输入弧的两个端点,第一个为弧尾,第二个为弧头\n"); //把每条边的两个顶点记录下来
scanf("%c%c",&v1,&v2);
AdjPtr = (AL_AdjNode*)malloc(sizeof(AL_AdjNode)); //把顶点数组的单链表链与新的节点连接
AdjPtr->adjNode = v1;
AdjPtr->next = NULL;
if(alPtr->vexlist[i].link == NULL){
alPtr->vexlist[i].link = AdjPtr;
currentPtr= AdjPtr;
}
else{
currentPtr->next = AdjPtr;
currentPtr = AdjPtr;
}
}
alPtr->vexnum = n; //给指向邻接表的图的指针的节点赋值
alPtr->arcnum = e; //给指向邻接表的图的指针的边赋值
return alPtr; //返回邻接表的指针
}
2.3输出邻接表
void Print_AdjList(AL_Graph *algPtr){
int i;
AL_AdjNode *AdjPtr;
printf("图的邻接表\n");
for(i = 0;i < algPtr->vexnum;i++){
//输出定点表中第i个顶点的值
printf("%d-",algPtr->VexList[i].vexnode)
AdjPtr = algPtr->vexlist[i].link; //取第i个顶点往后的链表地址
while(AdjPtr != NULL){ //如果节点的指针域指向的位置不为空,即后面都有节点,就把他输出,并且指针后移。
printf("%d-",AdjPtr->AdjNode);
AdjPtr = AdjPtr->next;
}
printf("--\n");
}
}
2.4邻接表主程序(创建并输出)
int main(){
AL_Graph *gPtr;
gPtr = Creat_AdjList(); //创建表
Print_AdjList(gPtr); //输出表
return 0;
}