图的基本操作(邻接矩阵,邻接表)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值