数据结构之图的邻接表元素的删除

上节内容讲解了图的邻接表的创建,链接地址为数据结构之图的邻接表存储方法。那么如果想要删除图的一个顶点,并且删除依附于该顶点的所有边,这种情况该如何处理呢?

首先来回顾一下邻接表是如何存储的。邻接表包含了一个长度为n的数组(n为图的顶点数),该数组中的每个元素都是一个链表的头结点,头结点后面“链”着与该头结点相关的边结点信息。图以及图的邻接表如下图所示。



我们以删除上图中位置为2(也就是顶点编号为3)的顶点为例,并删除与该点相关的边信息。

第一步:删除编号为3的顶点链接的边信息,即删除边信息为1,4和3,9的两条边,结果变为


第二步:删除编号为3的顶点信息,并将编号为4的顶点放在顶点数组下标为2的位置,将编号为5的顶点放在顶点数组下标为3的位置,结果为


第三步:遍历各个顶点链接的边信息,将与编号为3(即下标为2)的边结点信息删除,并将大于2的边结点下标减一。结果为


此时便得到了删除编号为3的顶点以及相关边的邻接表。

删除顶点的实现代码如下:

//函数表示在长度为n的顶点数组G中删除顶点数据信息为vertex的顶点
void deleteAdjacencyListElement(VLink *G, int n, int vertex) {
	int position = -1; //表示删除顶点在顶点数组中的位置
	ELink *p, *q, *r;
	//遍历顶点数组,并删除顶点数组中的被删顶点
	for(int i=0; i<n; i++) {
		if(G[i].vertex == vertex) {
			position = i;
			p = G[i].link;
			for(int j=i+1; j<n; j++) {
				G[j-1].vertex = G[j].vertex;
				G[j-1].link = G[j].link;
			}
			n--;
			break;
		}
	}
	if(position == -1) {
		cout << "不存在数据信息为" << vertex << "的顶点" << endl;
	}
	else {
		//删除被删顶点链接的边信息
		while(p) {
			q = p->next;
			delete p;
			p = q;
		}
		//删除其它顶点中与position相关的边结点
		for(int i=0; i<n; i++) {
			p = G[i].link;
			while(p) {
				if (p->adjvex == position) {
					if(p == G[i].link) {
						G[i].link = p->next;
					}
					else {
						r->next = p->next;
					}
					q = p;
					p = p->next;
					delete q;
				}
				else {
					if(p->adjvex > position) {
						p->adjvex--;
					}
					r = p;
					p = p->next;
				}
			}
		}
	}
}

运行代码后执行结果如下图,此结果与我们分析的结果一致,表示我们的删除算法是正确的。


  • 14
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 使用 C++ 邻接表存储的方法如下: 1. 定义一个结构体,表示每个结点的信息,如结点编号,数据等。 2. 定义一个结构体或类,表示的信息,如中结点的数量,边的数量等。 3. 定义一个邻接表,存储每个结点的邻接结点信息。 4. 实现的读入和输出功能。 5. 实现其他的算法,如深度优先搜索,广度优先搜索等。 以下是简单的代码示例: ```c++ #include <iostream> #include <vector> using namespace std; // 定义结点结构体 struct Node { int id; // 结点编号 int data; // 结点数据 }; // 定义邻接表 vector<vector<int>> adjList; int main() { // 初始化邻接表 int n = 5; // 结点数量 adjList.resize(n); // 加边 for (int i = 0; i < n; i++) { int u, v; cin >> u >> v; adjList[u].push_back(v); adjList[v].push_back(u); } // 显示邻接表 for (int i = 0; i < n; i++) { cout << "结点 " << i << " 的邻接结点有:"; for (int j = 0; j < adjList[i].size(); j++) { cout << adjList[i][j] << " "; } cout << endl; } return 0; } ``` 这是一个简单的邻接表存储的示例代码,其中 ### 回答2: 邻接表是一种常用的存储数据结构,它通过建立一个顶点数组和一个链表数组来表示。下面我将用300字来回答于使用C++的邻接表存储的问题。 首先,我们需要定义一个结构体来表示的顶点,该结构体包括顶点的编号、顶点的属性以及存储与该顶点相邻的其他顶点的链表。 接着,我们需要定义一个数组来存储顶点,并根据实际情况来确定数组的大小。 然后,我们需要定义一个链表结构体,该结构体包括一个指向相邻顶点的指针以及一个指向下一个节点的指针。 接下来,我们需要根据输入的边的信息来构建。我们可以使用一个循环来遍历输入的边,然后在邻接表中为每个顶点添加相邻的顶点。 最后,我们可以根据需求实现其他操作,例如查找一个顶点的相邻顶点、判断两个顶点是否相邻等。 使用C++的邻接表存储有以下优点: 1. 内存效率高:邻接表只存储了顶点之间的系,不需要存储所有可能的边,因此节省了内存空间。 2. 插入和删除边的操作效率高:邻接表只需要修改链表结构,不需要移动其他元素。 3. 可以灵活地表示带有属性的顶点和边:我们可以在顶点和边的结构中添加属性,以满足不同的需求。 总的来说,使用C++的邻接表存储是一种高效、灵活的方法,适用于的遍历、搜索、最短路径等常见操作。 ### 回答3: C++中使用邻接表来存储是一种常见的方法。邻接表是一种基于链表的数据结构,可以有效地表示中的顶点和边。 邻接表由一个顶点数组和一个边链表数组组成。顶点数组中的每个元素表示一个顶点,而边链表数组中的每个元素表示与该顶点相邻的边的集合。顶点数组中的每个元素都指向一个边链表,边链表中的每个元素都存储了与该顶点相邻的另一个顶点的信息。 使用邻接表可以方便地进行的遍历和查找操作。例如,可以通过遍历顶点数组中的元素来获取中的所有顶点,而通过遍历边链表数组中的元素可以获取某个顶点的所有相邻顶点。 在使用邻接表进行的操作时,可以使用动态内存分配来动态地创建和修改的结构。因为邻接表使用链表来表示边,所以在增加和删除边的操作上更加高效。此外,邻接表还占用较少的内存空间,适用于存储大型的稀疏。 总结来说,使用C++中的邻接表存储是一种高效、灵活且节省内存的方法。它可以方便地进行的遍历和查找操作,适用于存储大型的稀疏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值