用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

数据结构与算法----4.3 用邻接表储存图1、求一个顶点的入度2、求一个顶点的

2019-07-21 作者: Ryan2019举报

[c++]代码库

#include<iostream>
using namespace std;
const int MVN = 21;
typedef char VexType;//顶点元素类型
typedef struct ArcNode
{
	int adjvex;//弧指向的顶点位置
	int adj;//权
	ArcNode *nextarc;//指向下一条弧的顶点
}*ArcPtr;
struct VexNode
{
	VexType data;//顶点数据
	ArcPtr firstarc;//指向第一条依附于该顶点的弧
	bool visited;//是否被访问过
};
struct ALGraph
{
	VexNode vexs[MVN];
	int kind, vexnum, arcnum;//类型,顶点数,弧数
};
int LocateVex(ALGraph &G, VexType v);//查找顶点
bool InsertArc(ALGraph &G, VexType u, VexType v, int w = 1);//插入弧
void CreateGraph(ALGraph &G, int Kind, char v[]);
void GraphPrint(ALGraph &G);
int Outdegree(ALGraph &G, VexType u);//求一个顶点的出度
int Indegree(ALGraph &G, VexType u);//求一个顶点的入度
int* degree(ALGraph &G);//求全部顶点的入度

int main()
{
	char g[] = "sbcd#sbscsdbcbdcd#";
	cout << "序列为 "<< endl<<g<< endl;
	int Kind = 1;
	ALGraph G;
	CreateGraph(G, Kind, g);
	GraphPrint(G);
	VexType u = 's';
	int n = Outdegree(G, u);
	cout << "顶点"<<u<<"的出度为" << n << endl;
	VexType v = 'c';
	int m = Indegree(G, v);
	cout << "顶点"<<v<<"的入度为" << m << endl;
	int *a = degree(G);
	cout << "各个顶点的入度依次为:";
	for (int j = 1; j <= G.vexnum; j++)
	{
		cout << a[j] << "  ";
	}
	cout << endl;

	return 0;
}
int LocateVex(ALGraph &G, VexType v)
{
	int i;
	for (i = G.vexnum; i>0 && G.vexs[i].data != v; i--);
	return i;
}
bool InsertArc(ALGraph &G, VexType u, VexType v, int w )
{
	ArcPtr p;
	int i, j;
	bool found;
	i = LocateVex(G, u);
	if (i == 0)
	{
		return false;
	}
	j = LocateVex(G, v);
	if (j == 0 || j == i)
	{
		return false;
	}
	for (found = false, p = G.vexs[i].firstarc; p && !found; p = p->nextarc)
	{
		if (p->adjvex == j)
		{
			found = true;
		}
	}
	if (found)
	{
		return false;
	}
	G.arcnum++;
	p = new ArcNode;
	p->adjvex = j;
	p->adj = w;
	p->nextarc = G.vexs[i].firstarc;
	G.vexs[i].firstarc = p;
	if (G.kind <= 2)
	{
		return true;
	}
	G.arcnum++;
	p = new ArcNode;
	p->adjvex = i;
	p->adj = w;
	p->nextarc = G.vexs[j].firstarc;
	G.vexs[j].firstarc = p;
	return true;
}
void CreateGraph(ALGraph &G, int Kind, char v[])
{
	int i, w;
	G.kind = Kind;
	G.arcnum = 0;
	i = 0;
	while (true)
	{
		if (v[i] == '#')
		{
			break;
		}
		i++;
		G.vexs[i].data = v[i - 1];
		G.vexs[i].firstarc = NULL;
	}
	G.vexnum = i;
	i++;
	while (true)
	{
		if (v[i] == '#')
		{
			break;
		}
		if (G.kind == 1 || G.kind == 3)
		{
			w = 1;
		}
		else
		{
			w = v[i + 2] - 48;
		}
		InsertArc(G, v[i], v[i + 1], w);
		i = i + 2;
		if (w == 2 || w == 4)
		{
			i++;
		}
	}

}
void GraphPrint(ALGraph &G)
{
	ArcPtr p;
	cout << "邻接表" << endl;
	for (int i = 1; i <= G.vexnum; i++)
	{
		cout << G.vexs[i].data;
		for (p = G.vexs[i].firstarc; p; p = p->nextarc)
		{
			cout << "->" << p->adjvex;
		}
		cout << endl;
	}
}
int Outdegree(ALGraph &G, VexType u)
{
	int i = LocateVex(G, u);
	int n = 0;
	ArcPtr p;
	for (p = G.vexs[i].firstarc; p; p = p->nextarc)
	{
		n++;
	}
	return n;
}
int Indegree(ALGraph &G, VexType u)
{
	int i = LocateVex(G, u);
	int n = 0;
	ArcPtr p;
	for (int j = 1; j <= G.vexnum; j++)
	{
		if (j == i)
		{
			continue;
		}
		for (p = G.vexs[j].firstarc; p; p = p->nextarc)
		{
			if (p->adjvex == i)
			{
				n++;
				break;
			}

		}
	}
	return n;
}
int* degree(ALGraph &G)
{
	int *a;
	a = new int[G.vexnum + 1];
	for (int i = 1; i <= G.vexnum; i++)
	{
		a[i] = 0;
	}
	ArcPtr p;
	for (int j = 1; j <= G.vexnum; j++)
	{
		for (p = G.vexs[j].firstarc; p; p = p->nextarc)
		{
			a[p->adjvex]++;
		}
	}
	return a;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...