创建无向邻接图

/*
邻接表特点:
顶点 vi 的出度为第 i 个单链表中的结点个数
顶点 vi 的入度为整个单链表中邻接点域值为 i-1 的结点个数

逆邻接表特点:
顶点 vi 的入度为第 i 个单链表中的结点个数
顶点 vi 的出度为整个单链表中邻接点域值为 i-1 的结点的个数
*/

#include<iostream>
using namespace std;
#define MAX 25

typedef char Vertype;
typedef int Edgetype;
typedef int Status;

typedef struct EdgeNode//边表结点  存放每个顶点的邻接点
{
	int adjvex;//边表下标
	Edgetype weight;//边表权重  若边不存在时即无NULL
	struct EdgeNode* next;//指向下一个邻接点
}EdgeNode;

typedef struct VerNode//顶点表   存放顶点
{
	Vertype data;//顶点元素
	EdgeNode* firstedge;
}VerNode, AdjList[MAX];//邻接表的 顶点元素 和指向邻点的指针

typedef struct
{
	AdjList adjList;//邻接表
	int numVer, numEdge;//顶点数目和边的数目
}GraphAdjList;

Status CreatGraph(GraphAdjList& G)
{
	int i, j, k;
	Edgetype w;
	EdgeNode* e;
	cout << "点的数量 :" << endl;
	cin >> G.numVer;
	cout << "边的数量 :" << endl;
	cin >> G.numEdge;

	cout << "所有的点 :" << endl;
	for (i = 0; i < G.numVer; i++)
	{
		cin >> G.adjList[i].data;//输入顶点元素
		G.adjList[i].firstedge = NULL;//初始化邻边表为NULL;
	}

	for (k = 0; k < G.numEdge; k++)
	{
		cout << "先输入有链接的两个点" << endl;
		cin >> i;
		cin >> j;

		cout << "这两个点之间的权重" << i << "-" << j << endl;
		cin >> w;
		e = new EdgeNode;//将两个顶点相结即可。
		e->adjvex = j;// 邻接序号为j
		e->next = G.adjList[i].firstedge;//i的第一个邻接指针 为e的指针
		e->weight = w;
		G.adjList[i].firstedge = e;


		//有向图则只有生成一次即可
		e = new EdgeNode;
		e->adjvex = i;//无向图 重复一遍
		e->next = G.adjList[j].firstedge;
		G.adjList[j].firstedge = e;
		e->weight = w;
	}
	cout << "无向图创建完成" << endl;
	return 0;
}

//输出无向图
Status DispGraph(GraphAdjList& G)
{
	int i, j, k;
	cout << "打印所有点" << endl;
	for (i = 0; i < G.numVer; i++)
	{
		cout << G.adjList[i].data << '\t';
	}

	cout << "权重为:" << endl;
	for (k = 0; k < G.numVer; k++)
	{
		EdgeNode* p = G.adjList[k].firstedge;//中间指针
		cout << "下标为:" << "   "<<k <<"    " << "点" << "    " << G.adjList[k].data << "结点:" << endl;
		while (p != NULL)
		{
			cout << G.adjList[k].data << "->" << p->adjvex << '\t' << p->weight << '\t' << endl;
			p = p->next;
		}
	}
	/*
	for (k = 0; k < G.numEdge; k++)
	{
		//cout << G.adjList[k].firstedge->adjvex << '\t' << G.adjList[k].firstedge->weight << '\t'<<G.adjList[k].firstedge->next->adjvex<<endl;
		cout << G.adjList[k].firstedge->weight << '\t';
	}
	*/
	return 0;
}
//返回一个顶点的位置 和其邻接表内容
Status OutGraph_x(GraphAdjList& G)
{
	cout << "输入一个点来查找" << endl;
	Vertype x;
	cin >> x;
	for (int i = 0; i < G.numVer; i++)
	{
		if (G.adjList[i].data == x)
		{
			cout << "该元素在图中的位置为: " << i << "  相关邻接表为" << endl;
			EdgeNode* p = G.adjList[i].firstedge;
			while (p != NULL)
			{
				cout << p->adjvex << '\t' << p->weight << '\t' << endl;
				p = p->next;
			}
		}
	}
	return 0;
}
//新增一个顶点和对应边
Status AddGraph_x(GraphAdjList& G)
{
	Vertype x;
	Edgetype edg_num;
	int w;
	int i;
	EdgeNode* p;
	if (G.numVer >= MAX)
	{
		cout << "对不起,表满了" << endl;
		return NULL;
	}
	else
	{
		cout << "新结点叫啥: " << endl;
		cin >> x;
		G.numVer++;
		G.adjList[G.numVer - 1].data = x;//顶点内容赋值
		G.adjList[G.numVer - 1].firstedge = NULL;//顶点指针NULL初始化

		cout << "要新增几条边" << endl;//新增边的数目
		//如果不成边呢
		cin >> edg_num;
		G.numEdge = G.numEdge + edg_num;
		p = new EdgeNode;
		for (int j = 0; j < edg_num; j++)
		{
			cout << "输入跟这个新增点相连的点" << endl;
			cin >> i;
			cout << "请输入权重" << endl;
			cin >> w;

			/*while (p != NULL)
			{
			p = p->next;//找到最后一个结点为空时
			}*/
			//p = new EdgeNode;
			p->adjvex = G.numVer - 1;
			p->next = G.adjList[i].firstedge;
			G.adjList[i].firstedge = p;
			p->weight = w;

			//p = new EdgeNode;
			p->adjvex = i;
			p->next = G.adjList[G.numVer - 1].firstedge;
			G.adjList[G.numVer - 1].firstedge = p;
			p->weight = w;
		}
	}

	return 0;
}
//删除一个顶点  
Status DelGraph_x(GraphAdjList& G)
{
	Vertype x;
	cout << "请输入需要删除的顶点:" << endl;
	cin >> x;
	for (int i = 0; i < G.numVer; i++)
	{
		if (G.adjList[i].data == x)
		{
			G.adjList[i].data = NULL;//因为是数组类型 其结构必定存在 所以将其置为空
			//free((void *)G.adjList[i].data); //释放顶点
			G.adjList[i].firstedge = NULL;
		}
	}
	return 0;
}
/*------------------------------------无向图--------------------------------*/



/*------------------------------------有向图---------------------------------*/

void Index()
{
	GraphAdjList G;
	int choice = 0;
	cout << "请选择:\n1、创建无向图\n2、打印无向图\n3、查询某个结点\n4、加边\n6、删边\n";
	while (cin >> choice && choice != 0)
	{
		switch (choice)
		{
		case 1:CreatGraph(G); break;
		case 2:DispGraph(G); break;
		case 3:OutGraph_x(G); break;
		case 4:AddGraph_x(G); break;
		case 5:DelGraph_x(G); break;
		default:cout << "输错啦,请重新输入..." << endl;
		}
	}
}

int main()
{
	Index();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值