//网图(带权值)的邻接矩阵
#include<iostream>
#include<cstring>
#include<istream>
using namespace std;
const int INFINIT = 0x3f3f3f3f;
const int MAXVAX = 100;
template<class T>
class MGraph {
private:
T * vertex; //数组,用来存放顶点信息
int ** arc; //二维数组,用来存放邻接矩阵
int vertexNum, arcNum; //顶点数量 边数
public:
MGraph(T v[], int n, int e);
~MGraph();
void display();
void DFS(int i,int * visited);
void DFSTraverse(int * visited);
};
template<class T>
void MGraph<T>::DFS(int i,int * visited){
cout<<vertex[i]<<" ";
visited[i] = 1;
for(int j=0;j<vertexNum;j++){
if(visited[j] == 0&&arc[i][j] != 0 &&arc[i][j] != INFINIT){
DFS(j,visited);
}
}
}
template<class T>
void MGraph<T>::DFSTraverse(int * visited){
for(int i=0;i<vertexNum;i++){
visited[i] = 0;
}
for(int i=0;i<vertexNum;i++){
if(!visited[i]){
DFS(i,visited);
}
}
}
template<class T>
MGraph<T>::MGraph(T v[], int n, int e) {
vertexNum = n;
arcNum = e;
vertex = new T[vertexNum];
//新建一个名为vertex的数组,该数组的元素个数为vertexNum,元素类型为T,用来存放顶点信息
arc = new int *[vertexNum]; //建立邻接矩阵
//新建一个名为arc的数组,该数组的元素个数为vertexNum,元素类型为int *,用来存放邻接矩阵
//其实就是二维数组
for (int i = 0; i < vertexNum; i++)
arc[i] = new int[vertexNum];
for (int i = 0; i < vertexNum; i++) {
//初始化顶点信息
vertex[i] = v[i];
}
for (int i = 0; i < vertexNum; i++) {
//初始化邻接矩阵
for (int j = 0; j < vertexNum; j++) {
if (i == j) {
arc[i][j] = 0;
} else arc[i][j] = INFINIT;
}
}
int vi, vj, w;
for (int i = 0; i < arcNum; i++) {
cout << "请输入边的两个顶点和这条边的权值" << endl;
cin >> vi >> vj >> w; //输入边依附的两个顶点的编号和权值
arc[vi][vj] = w;
}
}
template<class T>
void MGraph<T>::display() {
for (int i = 0; i < vertexNum; i++) {
cout << vertex[i] << "\t";
}
cout << endl;
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < vertexNum; j++) {
if (arc[i][j] == INFINIT)
cout << "∞" << "\t";
else cout << arc[i][j] << "\t";
}
cout << endl;
}
cout << endl;
}
template <class T>
MGraph<T>::~MGraph() {
delete[] vertex;
for (int i = 0; i < vertexNum; i++) {
delete[] arc[i];
}
delete[] arc;
cout<<"删除节点数组和邻接矩阵成功!"<<endl;
}
int main() {
static int visited[MAXVAX] = {0};
int num,num1;
cout << "请输入节点的数量:" << endl;
cin >> num;
cout << "请输入边的数量:" << endl;
cin >> num1;
cin.get();
char *v[num] ;
memset(v, 0 ,sizeof(v));
cout << "请输入节点的信息:" << endl;
int i = num;
while(i--)
{
v[i]=new char[3];
gets(v[i]);
}
cin.sync();
cin.clear();
MGraph<char*> mgraph1(v, num, num1);
mgraph1.display();
cout<<"v数组的大小为:"<<sizeof(v)<<endl;
mgraph1.DFSTraverse(visited);
for(int j= 0;j< num;j++)
{
delete[] v[j];
}
// delete[] v;
//数组v是静态分配的,无需delete
cout<<"删除输入数组v成功!"<<endl;
return 0;
}
//int main() {
// static int visited[MAXVAX];
// char * v[5] = {(char*)"v0",(char*)"v1",(char*)"v2",(char*)"v3",(char*)"v4"};
// // char* v[5] = {"v0", "v1", "v2", "v3", "v4"};
//
// MGraph<char*> mgraph1(v, 5, 6);
// //之所以元素类型是char*,是因为输入的是“v0”字符串
// //由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素地址是连续的
//
// mgraph1.display();
//
// cout<<"v数组的大小为:"<<sizeof(v)<<endl;
// //v[5]是一个有5个元素的数组,元素的类型(指向char类型变量的)指针
// //一个指针占8个字节,所有v[5]占40个字节
//
// mgraph1.DFSTraverse(visited);
//
// return 0;
//}
09-09
528
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交