This repository has been archived on 2024-01-06. You can view files and clone it, but cannot push or open issues or pull requests.
justhomework/ex11/graph.hpp

156 lines
2.8 KiB
C++
Raw Normal View History

2021-12-09 14:58:46 +00:00
#ifndef _graph_hpp_
#define _graph_hpp_
#include "vector.hpp"
#include <iostream>
#include <string>
// #define gNodeArray(T) binNode<T> *
template <class Te>
class Edge
{
public:
Te data;
int weight;
Edge()
{
weight = 0;
}
Edge(int w)
{
weight = w;
}
Edge(Te d, int w)
{
data = d;
weight = w;
}
};
template <class Tv>
class Vertex
{
public:
Tv data;
int inDegree;
int outDegree;
Vertex()
{
// data = NULL;
inDegree = 0;
outDegree = 0;
}
Vertex(Tv d)
{
data = d;
inDegree = 0;
outDegree = 0;
}
};
template <class Te, class Tv>
class graphVertex
{
private:
Vector<Vertex<Tv> *> V;
Vector<Vector<Edge<Te> *>> E;
int v;
int e;
public:
graphVertex()
{
v = 0;
e = 0;
}
~graphVertex()
{
int n = v;
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
delete E[j][k];
for (int j = 0; j < n; j++)
delete V[j];
}
2021-12-09 15:04:48 +00:00
virtual Tv vertex(int i)
2021-12-09 14:58:46 +00:00
{
return V[i]->data;
}
virtual int inDegree(int i)
{
return V[i]->inDegree;
}
virtual int outDegree(int i)
{
return V[i]->outDegree;
}
virtual int insect(int id, Tv value)
{
if (V[id] == NULL)
{
2021-12-09 15:04:48 +00:00
Vertex<Tv>* temp= new Vertex<Tv>(value);
V.put(id, temp);
2021-12-09 14:58:46 +00:00
// E[id] = new Vector<Edge<Te>>;
}
else
V[id]->data = value;
v++;
return id;
}
virtual int remove(int id)
{
for (int j = 0; j < v; j++)
{
if (E[id][j] != NULL)
{
delete E[id][j];
2021-12-09 15:04:48 +00:00
E[id].put(j,NULL);
2021-12-09 14:58:46 +00:00
V[j]->inDegree--;
}
}
v--;
2021-12-09 15:04:48 +00:00
Tv temp = vertex(id);
2021-12-09 14:58:46 +00:00
delete V[id];
2021-12-09 15:04:48 +00:00
V.put(id, NULL);
2021-12-09 14:58:46 +00:00
}
// id1->id2 进行连接
// return
// -1 顶点不存在
// -2 边已存在
// 0 成功
virtual int link(int id1, int id2, int w)
{
if (V[id1] == NULL || V[id2] == NULL)
return -1;
if (E[id1][id2] != NULL)
return -2;
V[id1]->outDegree++;
V[id2]->inDegree++;
2021-12-09 15:04:48 +00:00
Edge<Te>* temp=new Edge<Te>(w);
E[id1].put(id2, temp);
2021-12-09 14:58:46 +00:00
return 0;
}
// 解除 id1->id2 连接
// return
// -1 顶点不存在
// -2 边不存在
// 0 成功
virtual int unlink(int id1, int id2, int w)
{
if (V[id1] == NULL || V[id2] == NULL)
return -1;
if (E[id1][id2] != NULL)
return -2;
V[id1]->outDegree--;
V[id2]->inDegree--;
delete E[id1][id2];
return 0;
}
};
#endif