const int DefaultVertices = 30;
template<class T,class E>
struct Edge{
int dest; //边结点定义
Edge<T,E> *link; //下一条边链指针
Edge(){}
Edge(int num,E weight):dest(num),link(NULL) {}
bool operator!=(Edge<T,E>& R)const{
return (dest!= R.deat)? true :false;
}
};
template<class T,class E>
struct Vertex{
T data; //顶点名字
Edge<T,E> *adj; //边链表的头指针
};
template <class T,class E>
class Graphlnk //注意这里没用继承
{ public:
Graphlnk(int sz=DefaultVertices);
~Graphlnk();
T getValue(int i) { return (i>=0 &&i<numVertices)?NodeTable[i].data : 0; }
int getVnum() { return numVertices; }
int getEnum() { return numEdges; }
bool insertVertex (const T& vertex);
bool insertEdge (int v1, int v2);
int getFirstNeighbor (int v);
int getNextNeighbor (int v, int w);
void input();
void output();
int getVertexPos (T& vertex) //给出顶点vertex在图中的位置
{ for (int i=0; i <numVertices; i++)
if (NodeTable[i].data == vertex) return i;
return -1;
}
private:
int maxVertices,numVertices,numEdges; //必须加上这3个数据成员,分别为当前最大顶点数,当前顶点数,当前边数
Vertex<T, E> *NodeTable; //顶点表 (各边链表的头结点)
};
template <class T, class E>
void Graphlnk<T, E>::input()
{ int i,j,k,vn,en; //vn表示顶点数,en表示边数
T v1,v2;
cout<<"输入顶点数和边数:\n";
cin>>vn>>en;
for(i=0;i<vn;i++)
{ cin>>v1;
insertVertex(v1); }
i=0;
while(i<en)
{ cout<<"输入边的两个顶点:";
cin>>v1>>v2;
j=getVertexPos(v1);
k=getVertexPos(v2);
if(j==-1 || k==-1)
cout<<"重新输入边的两个顶点信息!"<<endl;
else
{ insertEdge(j,k);
i++;
}
}
}
template <class T, class E>
void Graphlnk<T, E>::output()
{ int i,vn,en;
Edge<T,E> *p;
vn=numVertices; en=numEdges;
cout<<endl<<"图的顶点数="<<vn<<"边数="<<en<<endl<<endl;
for(i=0;i<vn;i++)
{ cout<<i<<": "<<NodeTable[i].data;
p=NodeTable[i].adj;
while(p!=NULL)
{ cout<<"-->"<<p->dest; p=p->link; }
cout<<endl;
}
}
template<class T,class E>
Graphlnk<T,E>::Graphlnk(int sz){
maxVertices = sz;
numVertices = 0;
numEdges = 0;
NodeTable = new Vertex<T,E>[maxVertices]; //创建顶点表数组
if(NodeTable == NULL){
cout << "存储分配错误!" << endl;exit(1);
}
for(int i = 0;i < maxVertices;i++)NodeTable[i].adj = NULL;
}
template<class T,class E>
Graphlnk<T,E>::~Graphlnk(){
for(int i =0;i<numVertices;i++){
Edge<T,E> *p = NodeTable[i].adj;
while(p != NULL){
NodeTable[i].adj = p->link;
delete p ;
p = NodeTable[i].adj;
}
}
delete[] NodeTable; // 删除顶点表数组
}
template<class T,class E>
int Graphlnk<T,E>::getFirstNeighbor(int v){
if(v != -1){
Edge<T,E> *p = NodeTable[v].adj;
if(p!=NULL)return p->dest;
}
return -1;
}
template<class T,class E>
int Graphlnk<T,E>::getNextNeighbor(int v,int w){
if(v!=-1){
Edge<T,E> *p=NodeTable[v].adj;
while(p!=NULL&&p->dest!=w)
p = p->link;
if(p!=NULL&&p->link!=NULL)
return p->link->dest;
}
return -1;
}
template<class T,class E>
bool Graphlnk<T,E>::insertVertex(const T& Vertex){
if(numVertices == maxVertices)return false;
NodeTable[numVertices].data = Vertex;
numVertices++;
return true;
}
template<class T,class E>
bool Graphlnk<T,E>::insertEdge(int v1,int v2){
if(v1 >=0 && v1 < numVertices && v2>=0 && v2 < numVertices){
Edge<T,E> *q, *p = NodeTable[v1].adj;
while(p!=NULL&& p->dest!=2)
p = p->link;
if(p!=NULL) return false;
p = new Edge<T,E>; q = new Edge<T,E>;
p->dest = v2;
p->link = NodeTable[v1].adj;
NodeTable[v1].adj = p;
q->dest = v1;
q->link = NodeTable[v2].adj;
NodeTable[v2].adj = q;
numEdges++;
return true;
}
}
template <class T, class E>
/*void BFS(Graphlnk<T,E>& G,T& v)
{
int i,w,n=G.getVnum(); //此处需修改,类中没定义该函数
bool *visited=new bool[n];
LinkedQueue<int> Q;
printf("\n广度优先搜索顺序为:\n");
for(i=0; i<n; i++)
visited[i]=false;
int loc = G.getVertexPos(v);
cout << G.getValue(loc) << " " ;
visited[loc] = true;
Q.EnQueue(loc);
while(!Q.IsEmpty()){
Q.DeQueue(loc);
w = G.getFirstNeighbor(loc);
while(w != -1){
if(visited[w]==false){
cout << G.getValue(w)<< " ";
visited[w] = true;
Q.EnQueue(w);
}
w = G.getNextNeighbor(loc,w);
}
}
}*/