封装 有向图(邻接矩阵) 遍历,删除,插入等

上图:

上码:

  1 #include <iostream>
  2 #include <queue>
  3 using namespace std;
  4 const int MAXSIZE = 10;                    //最大顶点数
  5
  6 template<class T>
  7 class MGraph
  8 {
  9 public:
 10     MGraph(){}
 11     MGraph(T a[], int n, int e);
 12     ~MGraph(){}
 13     T GetVex(int i);                    //取某序号下顶点的数据信息
 14     void PutVex(int i, T value);        //将序号为i的顶点的数据域置为value
 15     void InsertVex(T value);            //插入结点
 16     void DeleteVex(int i);                //删除某序号下结点
 17     void InsertArc(int i, int j);        //插入一条边,给出关联顶点序号
 18     void DeleteArc(int i, int j);        //删除一条边,给出关联顶点序号
 19     void DFSTraverse(int v);
 20     void BFSTraverse(int v);
 21 private:
 22     T vertex[MAXSIZE];                    //存放顶点数据的数组
 23     int arc[MAXSIZE][MAXSIZE];            //邻接矩阵
 24     int vertexNum, arcNum;                //顶点数,弧数
 25     int visited[MAXSIZE];
 26 };
 27
 28 int main()
 29 {
 30     char a[4] = { ‘a‘,‘b‘,‘c‘,‘d‘ };
 31     MGraph<char> mg(a, 4, 4);
 32     mg.DFSTraverse(0);
 33     system("pause");
 34     return 0;
 35 }
 36
 37 template<class T>
 38 MGraph<T>::MGraph(T a[], int n, int e)
 39 {
 40     vertexNum = n;
 41     arcNum = e;
 42     for (int i = 0; i < MAXSIZE; i++)
 43         for (int j = 0; j < MAXSIZE; j++)
 44             arc[i][j] = 0;
 45     for (int i = 0; i < MAXSIZE; i++)
 46         visited[i] = 0;
 47
 48     for (int i = 0; i < vertexNum; i++)
 49         vertex[i] = a[i];
 50     int c, b;
 51     for (int i = 0; i < arcNum; i++)
 52     {
 53         cin >> c >> b;
 54         arc[c][b] = 1;                    //有向图,对角线初始为0
 55     }
 56 }
 57
 58 template<class T>
 59 T MGraph<T>::GetVex(int i)
 60 {
 61     if (i < 0 || i >= vertexNum) {
 62         throw"结点不存在";
 63     }
 64     else
 65         return vertex[i];
 66 }
 67
 68 template<class T>
 69 void MGraph<T>::PutVex(int i, T value)
 70 {
 71     if (i < 0 || i >= vertexNum) {
 72         throw"结点不存在";
 73     }
 74     else
 75     {
 76         vertex[i] = value;
 77     }
 78 }
 79
 80 template<class T>
 81 void MGraph<T>::InsertVex(T value)
 82 {
 83     for (int i = 0; i < vertexNum; i++)
 84     {
 85         if (vertex[i] == value) {
 86             cout << "结点已存在" << endl;
 87             return;
 88         }
 89     }
 90     if (MAXSIZE == vertexNum) {
 91         cout << "数组已满,溢出" << endl;
 92         return;
 93     }
 94     vertex[vertexNum++] = value;
 95 }
 96
 97 template<class T>
 98 void MGraph<T>::DeleteVex(int i)
 99 {
100     if (i < 0 || i >= vertexNum) {
101         throw"结点不存在";
102     }
103     if (i == vertexNum - 1)
104     {
105         for (int j = 0; j < vertexNum; j++)
106         {
107             arc[j][i] = 0;
108             arc[i][j] = 0;
109         }
110         vertexNum--;
111         return;
112     }
113     for (int j = 0; j < vertexNum; j++)
114     {
115         arc[i][j] = arc[vertexNum - 1][j];
116         arc[j][i] = arc[j][vertexNum - 1];
117     }
118     vertexNum--;
119 }
120
121 template<class T>
122 void MGraph<T>::InsertArc(int i, int j)
123 {
124     if (i < 0 || i >= vertexNum&&j < 0 || j >= vertexNum)
125     {
126         cout << "结点不存在" << endl;
127         return;
128     }
129     if (arc[i][j]) {
130         cout << "弧已存在" << endl;
131         return;
132     }
133     else {
134         arc[i][j] = 1;
135         arcNum++;
136     }
137 }
138
139 template<class T>
140 void MGraph<T>::DeleteArc(int i, int j)
141 {
142     if (i < 0 || i >= vertexNum&&j < 0 || j >= vertexNum)
143     {
144         cout << "结点不存在" << endl;
145         return;
146     }
147     if (arc[i][j])
148     {
149         arc[i][j] = 0;
150         arcNum--;
151     }
152     else {
153         cout << "弧不存在" << endl;
154     }
155 }
156
157 template<class T>
158 void MGraph<T>::DFSTraverse(int v)
159 {
160     if (v >= 0 && v < vertexNum)
161     {
162         cout << vertex[v] << ‘\t‘;
163         visited[v] = 1;
164         for (int i = 0; i < vertexNum; i++) {
165             if (arc[v][i] && !visited[i]) {
166                 DFSTraverse(i);
167             }
168         }
169     }
170 }
171
172 template<class T>
173 void MGraph<T>::BFSTraverse(int v)
174 {
175     if (v < 0 || v >= vertexNum)
176         return;
177
178     queue<int> Qu;
179     int visited[MAXSIZE];
180     for (int i = 0; i < MAXSIZE; i++)
181         visited[i] = 0;
182
183     cout << vertex[v] << ‘\t‘;
184     Qu.push(v);
185     visited[v] = 1;
186     while (!Qu.empty()) {
187         int r = Qu.front();
188         Qu.pop();
189         for(int i=0; i<vertexNum; i++)
190             if (arc[r][i] && !visited[i]) {
191                 cout << vertex[i] << ‘\t‘;
192                 Qu.push(i);
193                 visited[i] = 1;
194             }
195     }
196 }

不足之处:

删除某结点可能导致结点序号改变;函数入口应传递结点信息而非序号

原文地址:https://www.cnblogs.com/guoyujiang/p/12050566.html

时间: 2024-11-08 07:54:41

封装 有向图(邻接矩阵) 遍历,删除,插入等的相关文章

数组练习:各种数组方法的使用&amp;&amp;事件练习:封装兼容性添加、删除事件的函数&amp;&amp;星级评分系统

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

STL容器的遍历删除

STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的表项(当然这个函数是应该运行在另起一个线程上的),但是在按照下面的方法对hash_map(用迭代器)遍历删除时,当找到第一个满足删除条件的元素并将其删除后,程序将提示非法: for(list<int>::iterator iter = m_map.begin(); iter != m_map.en

NSMutableString,可变字符串,拼接,删除,插入,替换

<span style="font-size:18px;"> NSMutableString *str = [NSMutableString stringWithFormat:@"lanouhenan"]; //对于可变字符串的增删改方法, 都是在原字符串基础上进行修改, 所以修改之后的原字符串的内容发生变化, 所以无需返回值 //1 在原字符串基础上拼接Frank [str appendFormat:@"Frank"]; NSLog

STL——遍历 删除 set 元素

==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明作者和出处,并保证文章(包括本声明)的完整性. 未经作者授权请勿修改(包括本声明),保留法律追究的权利. 未经作者授权请勿用于学术性引用. 未经作者授权请勿用于商业出版.商业印刷.商业引用以及其他商业用途. 本文不定期修正完善,为保证内容正确,建议移步原文处阅读. 本文链接:http://www.c

STL中用erase()方法遍历删除元素?.xml

pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9;font-style:italic;font-weight:bold;} .selfFuc{color:#f1f9be;} .bool{color:#69305e;} .condition{color:#628698;font-weight:bold;} .key{color:#e336b6;} .

spring -mvc 将对象封装json返回时删除掉对象中的属性注解方式

spring -mvc 将对象封装json返回时删除掉对象中的属性注解方式 在类名,接口头上注解使用在 @JsonIgnoreProperties(value={"comid"}) //希望动态过滤掉的属性 例 @JsonIgnoreProperties(value={"comid"}) public interface 接口名称{ } @JsonIgnoreProperties(value={"comid"}) public class 类名{

如何正确遍历删除List中的元素

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合条件的一个元素 3.通过普通的for删除删除符合条件的多个元素 4.通过Iterator进行遍历删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException */ public

map/vector遍历删除

map遍历删除 1 map<int, vector<int>>::iterator it = g_map.begin(); 2 for (; it != g_map.end(); /*it++*/) 3 { 4 g_map.erase(it++); 5 } vector遍历删除 1 vector<int>::iterator iter = vec.begin(); 2 while (iter != vec.end()) 3 { 4 if(*iter == 1) 5 {

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT is SELECT ID,UNAME from g_users where utype=2 and STATUS>-1; begin for c in TABLE_DEPT loop INSERT INTO G_KNOWDOCRIGHT(RID,DIRID,DOCID,USERID) VALUES(SYS