有向图与无向图的邻接矩阵,邻接表 计算出度与入度

            有向图与无向图的邻接矩阵,邻接表 计算出度与入度

 

实例 有向图的邻接矩阵输出出度和入度

    说明 : 邻接矩阵的第i行的数组元素值为1的个数表示顶点i的出度,第i列的数组元素值为1表示顶点i的入度。

 示例代码1

//使用邻接矩阵计算顶点的出度和入度,不存在自身环和重环
//有向图

#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX 1000
int array [MAX][MAX];
using namespace std;
int main(int argc, char *argv[]) {
	
	int i,j;             //循环变量
	int verNum,edgeNum;  //顶点数和边数
	int verArray [1000][100];
	int on,in;           //出度和入度
	int start , end;     //起点,终点
	while(1){
		memset(array,0,sizeof(array));   //数组初始化  函数头文件   <memory.h> or <string.h>
		scanf("%d%d", &verNum, &edgeNum);
		if(verNum == 0 && edgeNum == 0){
			break ;
		}
		for(i = 0 ;i < edgeNum;i ++){
			scanf("%d%d", &start, &end);
            array[start - 1][end  - 1] = 1;
		}
		for(i =0 ; i < verNum; i++){
			on = 0;   //按行数,表示顶点的出度
			for(j = 0 ;j < verNum;j++){
				if(array[i][j] == 1){
					on++;
				}
			}
			if(i == 0){
				printf("%d",on);   //注意输出格式判断
			}else{
				printf(" %d",on);
			}
		}
		printf("\n");     //换行
		for(i = 0 ; i < verNum; i++){
			in = 0;   //按行数,表示顶点的出度
			for(j = 0 ;j < verNum;j++){
				if(array[j][i] == 1){
					in++;
				}
			}
			if(i ==0 ){
				printf("%d",in);
			}else{
				printf(" %d",in);   //没有初始化时,会输出48706等奇怪数字
			}	
		}
	}
	return 0;
}

实例代码二

有向图的邻接表输出出度和入度

有向图的邻接表输出出度和入度
using namespace s td;
#include <iostream>
#include <stdio.h>
#define MAXN 100
struct ArcNode{      //边节点
	int adjvex ;     //有向边的另一个节点的序号
	ArcNode *nextArc;
};

//顶点结构体
struct VNode{
	int data;   //顶点信息
	ArcNode *head ; //出边表的表头指针
	ArcNode *tail ; //入边表的表头指针 
};

//图的邻接表存储结构
struct LGraph{
	VNode vertexs[MAXN ];
	int verNum;    //顶点数目
	int arcNum;    //边(弧) 的数目
};
LGraph lg;

//创建邻接表
void createGraph(){
	int i ;   //循环变量
	int v1,v2;   //有向边的起点和终点
	ArcNode *p1;  //边结点
	//初始化
	for(i = 0;i < lg.verNum ; i++ ){
		lg.vertexs[i].head = lg.vertexs[i].tail = NULL;
	}
	//构造出边表,入边表,使用链表的头插法
	for(i =0 ;i < lg.arcNum ; i ++ ){
		scanf("%d%d",&v1,&v2);
		v1--,v2--;      //注意下标
		p1 = new ArcNode;
		p1->adjvex = v2;
		p1->nextArc = lg.vertexs[v1].head;
		lg.vertexs[v1].head = p1;
		
		p1 = new ArcNode;
		p1->adjvex = v1;
		p1->nextArc = lg.vertexs[v2].tail;
		lg.vertexs[v2].tail = p1;
	}
}

//删除邻接表,释放节点空间
void deleteGraph(){
	int i ;
	ArcNode *p1;
	for(i =0 ;i < lg.verNum ; i++){
		p1 = lg.vertexs[i].head;
		//释放第i个顶点的出边表的结点信息
		while(p1 != NULL){
			lg.vertexs[i].head = p1->nextArc;   
			delete p1;
			p1 = lg.vertexs[i].head;
		}
		p1 = lg.vertexs[i].tail;
		//释放第i个顶点的入边表的结点信息
		while(p1 != NULL){
			lg.vertexs[i].tail = p1->nextArc;   
			delete p1;
			p1 = lg.vertexs[i].tail;
		}
	}
}

int main(int argc, char *argv[]) {
	int i ;
	ArcNode *p;
	int od,id;  //有向边的出度,入度
	
	scanf("%d%d",&lg.verNum,&lg.arcNum);   //输入顶点的数目,边结点的数目
	createGraph();
	//出度
	for(i =0 ;i< lg.verNum;i++){
		od = 0;
		p = lg.vertexs[i].head; 
		while(p != NULL){
			od ++;
			p = p->nextArc;
		}
		if(i == 0){
			printf("%d",od);
		}else{
			printf(" %d",od);
		}
	}
	
	printf("\n");  //换行
	
	//入度
	for(i =0 ;i< lg.verNum;i++){
		id = 0;
		p = lg.vertexs[i].tail; 
		while(p != NULL){
			id ++;
			p = p->nextArc;
		}
		if(i == 0){
			printf("%d",id);
		}else{
			printf(" %d",id);
		}
	}
	deleteGraph();    //释放邻接表的存储空间
	return 0;
}

实例代码三

无向图的邻接表输出度数

//无向图的邻接表存储方式输出度数
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define  MAXN 1000
using namespace std;
//边结点结构体
struct ArcNode{
	int adjex;   
	ArcNode *nextArc;
};
//顶点信息
struct VNode{
	int  data;
	ArcNode *head;
};
//图的边链表
struct LGraph{
	VNode array[MAXN];
	int arcNum , verNum;   //边数和顶点数
};
LGraph lg;
void  createGraph(){
	int i;
	int v1,v2;   //无向图的起点,终点
	ArcNode *p1;
	for(i = 0;i < lg.verNum;i ++){
		lg.array[i].head = NULL;
	}
	for(i = 0 ;i < lg.arcNum;i ++){
		scanf("%d%d",&v1,&v2);
		v1 -- , v2 --;
		p1 = new ArcNode;
		p1->adjex = v2;
		p1->nextArc = lg.array[v1].head;
		lg.array[v1].head = p1;
		
		p1 = new ArcNode;
		p1->adjex = v1;
		p1->nextArc = lg.array[v2].head;
		lg.array[v2].head = p1;
	}
}
//删除邻接表,释放节点空间
void deleteGraph(){
	int i ;
	ArcNode *p1;
	for(i =0 ;i < lg.verNum ; i++){
		p1 = lg.array[i].head;
		//释放第i个顶点的出边表的结点信息
		while(p1 != NULL){
			lg.array[i].head = p1->nextArc;   
			delete p1;
			p1 = lg.array[i].head;
		}
	}
}

int main(int argc, char *argv[]) {
	int i ;
	int du;
	ArcNode *p;
	scanf("%d%d",&lg.verNum,&lg.arcNum);
	createGraph();
	for(i = 0;i < lg.verNum ; i ++ ){
		p = lg.array[i].head;   //每次循环定位头结点
		du = 0;
		while(p != NULL){
			du++;
			p = p->nextArc; 
		}
		if(i == 0){
			printf("%d",du);
		}else{
			printf("  %d",du);
		}
	}
	deleteGraph();
	return 0;
}

 从程序中体现出了,有向图的邻接表的出边表和入边表的出度与入度之和与无向图的度数相同。



  • 8
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值