图结构的简单测试(假设无向、非加权图的数据元素为字符,采用邻接表存储结构。图的创建、存储结构输出等大部分操作的实现代码操作已经给出,请分别补充写出操作插入边、删除边的实现函数代码。)

从学校数据结构结课复习扒拉下来的题目,练手一下,题目描述如下:
假设无向、非加权图的数据元素为字符,采用邻接表存储结构。图的创建、存储结构输出等大部分操作的实现代码操作已经给出,请分别补充写出操作插入边、删除边的实现函数代码。

有关说明:

  (1)插入边,  int Insert_Edge(g,vi,vj)
 输入:图g,要插入边的两个顶点元素vi,vj;
输出:返回插入的状态(成功、错误:边顶点不存在、错误:边重复),根据不同的状态会输出:
     Error:Vertex does not exist!  或
	 Error:Edge repetition!     或
    Edge insertion succeeded!

注:为了统一,邻接点链入链表时,链入在前面(表头位置)

(2)删除边,  int Delete_Edge(g,vi,vj)
  输入:图g,要删除边的两个顶点元素vi,vj;
输出:返回删除的状态(成功、错误:边顶点不存在、错误:边不存在),根据不同的状态会输出:
 Error:Vertex does not exist!
 Error:Edge does not exist!
 Edge deletion succeeded!

(3)主函数中操作的控制: 1—创建图 2—输出图的存储结构 3—插入边 4—删除边 0—退出

创建图时,需要输入顶点个数、各个顶点元素、各条边,具体见样例;

输出存储结构时,输出格式见样例;

插入或删除边时,需要输入边的两个顶点元素;

例如:

1 //创建图操作
5 //图顶点的个数
abcde //顶点元素
** //输入边,**表示边输入结束
2 //输出图结构操作
3 //插入边操作
ab //边顶点
3
bc
4 //删除边操作
de
2
0
输出如下:
Adjacency List is:
a:
b:
c:
d:
e:
Edge insertion succeeded!
Edge insertion succeeded!
Error:Edge does not exist!
Adjacency List is:
a:–>b
b:–>c–>a
c:–>b
d:
e:

给出的代码如下: (请注意要求补充的函数的注释说明)


#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define   Max_VertexNum 50     //允许图的顶点个数的最大值
typedef   char  VertexType;  //定义数据元素(顶点)类型为char
//********************************************************************************

//邻接表存储结构

struct  EdgeNode   //定义边存储结点

{
	int adjvex;        //邻接点的存储位置

	EdgeNode  *next;   //指向下邻接点

};

struct VertexNode   //定义顶点存储结点

{
	VertexType vertex;       //数据元素

	struct EdgeNode *link;   //第一个邻接点

};

typedef struct Graph   //定义邻接表图结构

{
	int VexNum;        //图的顶点个数

	VertexNode Nodetable[Max_VertexNum];   //一维数组-邻接表

}  Graphlnk;      //定义邻接表存储的图类型

//**********************************************************************************

// 基于邻接表存储的 无向、非加权图的各种操作的实现

//** 创建图

void create_graph(Graphlnk &g)

{
	VertexType v1, v2;

	int i, j;

	struct  EdgeNode *p, *q;

	cin >> g.VexNum;  //读入图的顶点个数

	while (g.VexNum < 0)

		cin >> g.VexNum;

	for (i = 0; i < g.VexNum; i++)

	{
		cin >> g.Nodetable[i].vertex;    //输入顶点元素

		g.Nodetable[i].link = NULL;      //邻接表初始化

	}

	cin >> v1 >> v2;     //输入边的两个顶点

	while (v1 != '*'&&v2 != '*')

	{
		for (i = 0; i < g.VexNum; i++)

			if (g.Nodetable[i].vertex == v1) break;

		for (j = 0; j < g.VexNum; j++)

			if (g.Nodetable[j].vertex == v2) break;

		if (i >= g.VexNum || j >= g.VexNum)  cin >> v1 >> v2;    //边顶点不正确,重新读

		else      //链入邻接点

		{
			p = (struct  EdgeNode *)malloc(sizeof(struct  EdgeNode));

			p->adjvex = j;

			p->next = g.Nodetable[i].link;

			g.Nodetable[i].link = p;

			q = (struct  EdgeNode *)malloc(sizeof(struct  EdgeNode));

			q->adjvex = i;

			q->next = g.Nodetable[j].link;

			g.Nodetable[j].link = q;

			cin >> v1 >> v2;

		}

	}

}

void print_graph(Graphlnk  g)

{
	int i;

	struct  EdgeNode *p;

	cout << "Adjacency List is:" << endl;

	for (i = 0; i < g.VexNum; i++)

	{
		cout << g.Nodetable[i].vertex << ":";

		p = g.Nodetable[i].link;

		while (p != NULL)

		{
			cout << "-->" << g.Nodetable[p->adjvex].vertex;

			p = p->next;

		}

		cout << endl;

	}

}

//**********************************************************************


/*输入函数代码*/

//**********************************************************************

int main()

{
	Graphlnk g;

	int ic;

	VertexType vi, vj;

	int k;

	while (1)

	{
		//请输入要执行的操作:";

		cin >> ic;

		while (ic < 0 || ic>4)

			cin >> ic;

		if (ic == 1)  create_graph(g);    //创建图

		if (ic == 2)  print_graph(g);       //输出图结构

		if (ic == 3)     //插入边

		{
			cin >> vi >> vj;

			k = Insert_Edge(g, vi, vj);

			if (k == -1) cout << "Error:Vertex does not exist!" << endl;

			if(k==0) cout << "Error:Edge repetition!" << endl;

			if(k==1) cout << "Edge insertion succeeded!" << endl;

		}

		if (ic == 4)     //删除边

		{
			cin >> vi >> vj;

			k = Delete_Edge(g, vi, vj);

			if (k == -1) cout << "Error:Vertex does not exist!." << endl;

			if (k == 0) cout << "Error:Edge does not exist!" << endl;

			if (k == 1) cout << "Edge deletion succeeded!" << endl;

		}

		if (ic == 0)  break;

	}

	return 0;

}


添入代码:
int getNum(Graphlnk g, VertexType vi) {
//为方便操作额外加一个,得到vi的数组下标
	for (int i = 0; i < g.VexNum; i++)
		if (g.Nodetable[i].vertex == vi) return i;
	return -1;
}

int Insert_Edge(Graphlnk &g, VertexType vi, VertexType vj) {
	int v1 = getNum(g,vi);
	int v2 = getNum(g,vj);
	if(v1<0 || v2 < 0) return -1;
	EdgeNode *p = g.Nodetable[v1].link;
	while(p) {
		if (p->adjvex == v2) return 0;
		p = p->next;
	}
	p = new EdgeNode;
	p->adjvex = v2;
	p->next = g.Nodetable[v1].link;
	g.Nodetable[v1].link = p;
//	cout<<g.Nodetable[v1].link->adjvex;
	if(v1 == v2) return 1;//如果输入的是两个一样的点 aa 环
	p = new EdgeNode;
	p->adjvex = v1;
	p->next = g.Nodetable[v2].link;
	g.Nodetable[v2].link = p;
//	cout<<g.Nodetable[v2].link->adjvex;
	return 1;
}

int  Delete_Edge(Graphlnk &g, VertexType vi, VertexType vj) {
	int v1 = getNum(g,vi);
	int v2 = getNum(g,vj);
	if(v1<0 || v2 < 0) return -1;
	EdgeNode *p = g.Nodetable[v1].link;
	if(p && p->adjvex == v2) {
		g.Nodetable[v1].link = p->next;
		if(v1 == v2) return 1;
	}
	while(p) {
		EdgeNode *pnext = p->next;
		if(pnext && pnext->adjvex == v2 ) {
			p->next = pnext->next;
			delete pnext;
			if(v1 == v2) return 1;
			break;
		}
		p = p->next;

	}
	p = g.Nodetable[v2].link;
	if(p && p->adjvex == v1) {
		g.Nodetable[v2].link = p->next;
		return 1;
	}
	while(p) {
		EdgeNode *pnext = p->next;
		if(pnext && pnext->adjvex == v1 ) {
			p->next = pnext->next;
			delete pnext;
			return 1;
		}
		p = p->next;
	}
	return 0;
}


测试用例:
1     
5     
abcde     
**    
2    
3    
ab      
3   
bc
4    
de
3
aa
2
4
aa
2
4
bb
3
bc
4
ka
3
pa
3
bc
3
ac
2
4
ba
4
ca
2
0


测试输出

Adjacency List is:
a:
b:
c:
d:
e:
Edge insertion succeeded!
Edge insertion succeeded!
Error:Edge does not exist!
Edge insertion succeeded!
Adjacency List is:
a:-->a-->b
b:-->c-->a
c:-->b
d:
e:
Edge deletion succeeded!
Adjacency List is:
a:-->b
b:-->c-->a
c:-->b
d:
e:
Error:Edge does not exist!
Error:Edge repetition!
Error:Vertex does not exist!.
Error:Vertex does not exist!
Error:Edge repetition!
Edge insertion succeeded!
Adjacency List is:
a:-->c-->b
b:-->c-->a
c:-->a-->b
d:
e:
Edge deletion succeeded!
Edge deletion succeeded!
Adjacency List is:
a:
b:-->c
c:-->b
d:
e:
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HuangDXian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值