数据结构经典算法汇总___图的邻接表实现
2010-07-31 14:19
561 查看
图的邻接表实现:
Graph2.h
文件
#include<iostream.h>///////////////
邻接表实现图
const Maxvertexes=4;
template<class VertexType,class ArcType>struct ArcNode{
//
弧节点
int adjex;
//
相关连的接点箭头头部节点的序号
ArcType weight;
ArcNode<VertexType,ArcType> *nextarc;//
下条弧指针
};
template<class VertexType,class ArcType>struct VertexNode{//
顶点接点
VertexType data;
ArcNode<VertexType,ArcType> *firstarc;
};
template<class VertexType,class ArcType>class Graph{
private:
VertexNode<VertexType,ArcType>* vertextable;
int currentnumarc;
//
当前边数目
int currentnumvertex; //
当前顶点数
public:
Graph(VertexType v[],int num=Maxvertexes);
~Graph();
int InsertVertex(VertexType v){
if (currentnumvertex<=Maxvertexes){
vertextable[currentnumvertex].data=v;
vertextable[currentnumvertex].firstarc=NULL;
currentnumvertex++;
return 1;
}
cout<<"Insert unsuccessful ,the num vertex is full"<<endl;
return 0;
}
int InsertArc(int tail,int head,ArcType weight){
//////////////////@@@@@@@@@@@@@@@@@@@@@@@@@
注意这里的
tali head
是序列号是,数组的下标
晕死了
!!
if(tail>currentnumvertex-1){
cout<<"the vertex(tail) not exist"<<endl; return 0;}
if(head>currentnumvertex-1){
cout<<"the vertex(head) not exist"<<endl; return 0;}
ArcNode<VertexType,ArcType> *p=vertextable[tail].firstarc;
if(p==NULL){//p
插入的要为第一个边
ArcNode<VertexType,ArcType> *temp=new ArcNode<VertexType,ArcType>;
temp->weight=weight;
temp->nextarc=NULL;
temp->adjex=head;
//cout<<head<<" ";
vertextable[tail].firstarc=temp;
currentnumarc++;
return 1;
}
while(p->nextarc!=NULL) p=p->nextarc;
ArcNode<VertexType,ArcType> *temp=new ArcNode<VertexType,ArcType>;
temp->weight=weight;
temp->nextarc=NULL;
temp->adjex=head;
// cout<<head<<" ";
p->nextarc=temp;
currentnumarc++;
return 1;
}
int Getpos(VertexType v){
for(int i=0;i<currentnumvertex;i++){
if(vertextable[i].data==v){
//cout<<"
等于
"<<endl;
return
i;
}
}
return -1;
}
void printvertex(){
for(int i=0;i<currentnumvertex;i++)
cout<<vertextable[i].data;
}
int Getcurrentvertex()
{ return currentnumvertex;}
int Getcurrentnumarc()
{ return currentnumarc;}
void visite(int i){
cout<<vertextable[i].data<<" ";
}
void DFTraverse();
//
深度优先遍历图
void DFS(const int v,int visited[]);
int Getnextneighbor(int v);//
取下标
V
的第一个邻接点下标的下标
int Getnextneighbor(int v,int w);//
取下标
V
的位于下标
W
后的邻接点的下标
void print1(){
ArcNode<VertexType,ArcType> *p;
for(int i=0;i<currentnumvertex;i++){
cout<<vertextable[i].data<<":";
p=vertextable[i].firstarc;
while(p!=NULL)
{
cout<<"->["<<p->adjex<<"]"<<vertextable[p->adjex].data;
p=p->nextarc;
}
cout<<endl;
}
}
};
template<class VertexType,class ArcType>Graph<VertexType,ArcType>:: Graph(VertexType v[],int num=Maxvertexes)
:currentnumarc(0),currentnumvertex(0)
{ int e,t,h;
VertexType tail,head;
ArcType w;
vertextable=new VertexNode<VertexType,ArcType>[Maxvertexes];
for(int i=0;i<Maxvertexes;i++)
InsertVertex(v[i]);
cout<<"please input the num of arc:";
cin>>e;
for(i=0;i<e;i++){
cin>>tail>>head>>w;
//
逐条输入边和权值
tail
为开始接点,
head
为结束点
if((t=Getpos(tail))==-1){
cout<<"the vertex(tail) not exist"<<endl;return ;}
else if((h=Getpos(head))==-1){
cout<<"the vertex(head) not exist"<<endl;return ;}
else InsertArc(t,h,w);
//insert border from t ---->h
the
weight is w
}
}
template<class VertexType,class ArcType>Graph<VertexType,ArcType>:: ~Graph()
{ ArcNode<VertexType,ArcType> *p1,*p2;
for(int i=0;i<currentnumvertex;i++){
p1=vertextable[i].firstarc;
if(p1!=NULL){
if(p1->nextarc==NULL){
delete p1;
return ;
}
p2=p1->nextarc;
delete p1;
p1=p2;
p2=p2->nextarc;
}
}
}
template<class VertexType,class ArcType>void Graph<VertexType,ArcType>::DFTraverse(){
int i,n=currentnumvertex;
int *visited=new int
;
for(i=0;i<n;i++)
visited[i]=0;
for(i=0;i<n;i++){
if(visited[i]==0)
DFS(i,visited);
}
delete []visited;
}
template<class VertexType,class ArcType>void Graph<VertexType,ArcType>::DFS(const int v,int visited[]){
visite(v);
visited[v]=1;
int w;
w=Getnextneighbor(v);// get first next vertex
while(w!=-1){
if(visited[w]==0)
DFS(w,visited);
w=Getnextneighbor(v,w);
//
取
v
的排在
w
后的下一个邻接点
,now the w is visited and muset
回溯
}
}
template<class VertexType,class ArcType>int Graph<VertexType,ArcType>::Getnextneighbor(int v){
if(vertextable[v].firstarc!=NULL)
return (vertextable[v].firstarc->adjex);
else return -1;
}
template<class VertexType,class ArcType>int Graph<VertexType,ArcType>::Getnextneighbor(int v,int w){
ArcNode<VertexType,ArcType> *p=vertextable[v].firstarc;
while(p!=NULL){
if(p->adjex==w){
if(p->nextarc!=NULL)
return p->nextarc->adjex;
else return -1;
}
p=p->nextarc;
}
return -1;
}
主测试函数
main.cpp
#include<iostream.h>
//#include"heap.h"
//#include"heap2.h"
//#include"graph.h"
#include"graph2.h"
//#include"huffmantree.h"
int main()
{/////////////////////////////////////////////test Graph<>
有向图邻接表实现
+
图的两种遍历算法
char v[4];
for(int i=0;i<4;i++)
cin>>v[i];
Graph<char,int> graph(v);
graph.printvertex(); cout<<endl;
cout<<"num of arc:"<<graph.Getcurrentnumarc()<<endl;
cout<<"num of vertex:"<<graph.Getcurrentvertex()<<endl;
cout<<"DFT is(
深度优先便历
):";graph.DFTraverse();
cout<<endl;
cout<<"Vertextable:(
邻接表
)"<<endl;
graph.print1();
//cout<<endl;
//cout<<graph.Getnextneighbor(0,1)<<endl;
return 0;
}
Graph2.h
文件
#include<iostream.h>///////////////
邻接表实现图
const Maxvertexes=4;
template<class VertexType,class ArcType>struct ArcNode{
//
弧节点
int adjex;
//
相关连的接点箭头头部节点的序号
ArcType weight;
ArcNode<VertexType,ArcType> *nextarc;//
下条弧指针
};
template<class VertexType,class ArcType>struct VertexNode{//
顶点接点
VertexType data;
ArcNode<VertexType,ArcType> *firstarc;
};
template<class VertexType,class ArcType>class Graph{
private:
VertexNode<VertexType,ArcType>* vertextable;
int currentnumarc;
//
当前边数目
int currentnumvertex; //
当前顶点数
public:
Graph(VertexType v[],int num=Maxvertexes);
~Graph();
int InsertVertex(VertexType v){
if (currentnumvertex<=Maxvertexes){
vertextable[currentnumvertex].data=v;
vertextable[currentnumvertex].firstarc=NULL;
currentnumvertex++;
return 1;
}
cout<<"Insert unsuccessful ,the num vertex is full"<<endl;
return 0;
}
int InsertArc(int tail,int head,ArcType weight){
//////////////////@@@@@@@@@@@@@@@@@@@@@@@@@
注意这里的
tali head
是序列号是,数组的下标
晕死了
!!
if(tail>currentnumvertex-1){
cout<<"the vertex(tail) not exist"<<endl; return 0;}
if(head>currentnumvertex-1){
cout<<"the vertex(head) not exist"<<endl; return 0;}
ArcNode<VertexType,ArcType> *p=vertextable[tail].firstarc;
if(p==NULL){//p
插入的要为第一个边
ArcNode<VertexType,ArcType> *temp=new ArcNode<VertexType,ArcType>;
temp->weight=weight;
temp->nextarc=NULL;
temp->adjex=head;
//cout<<head<<" ";
vertextable[tail].firstarc=temp;
currentnumarc++;
return 1;
}
while(p->nextarc!=NULL) p=p->nextarc;
ArcNode<VertexType,ArcType> *temp=new ArcNode<VertexType,ArcType>;
temp->weight=weight;
temp->nextarc=NULL;
temp->adjex=head;
// cout<<head<<" ";
p->nextarc=temp;
currentnumarc++;
return 1;
}
int Getpos(VertexType v){
for(int i=0;i<currentnumvertex;i++){
if(vertextable[i].data==v){
//cout<<"
等于
"<<endl;
return
i;
}
}
return -1;
}
void printvertex(){
for(int i=0;i<currentnumvertex;i++)
cout<<vertextable[i].data;
}
int Getcurrentvertex()
{ return currentnumvertex;}
int Getcurrentnumarc()
{ return currentnumarc;}
void visite(int i){
cout<<vertextable[i].data<<" ";
}
void DFTraverse();
//
深度优先遍历图
void DFS(const int v,int visited[]);
int Getnextneighbor(int v);//
取下标
V
的第一个邻接点下标的下标
int Getnextneighbor(int v,int w);//
取下标
V
的位于下标
W
后的邻接点的下标
void print1(){
ArcNode<VertexType,ArcType> *p;
for(int i=0;i<currentnumvertex;i++){
cout<<vertextable[i].data<<":";
p=vertextable[i].firstarc;
while(p!=NULL)
{
cout<<"->["<<p->adjex<<"]"<<vertextable[p->adjex].data;
p=p->nextarc;
}
cout<<endl;
}
}
};
template<class VertexType,class ArcType>Graph<VertexType,ArcType>:: Graph(VertexType v[],int num=Maxvertexes)
:currentnumarc(0),currentnumvertex(0)
{ int e,t,h;
VertexType tail,head;
ArcType w;
vertextable=new VertexNode<VertexType,ArcType>[Maxvertexes];
for(int i=0;i<Maxvertexes;i++)
InsertVertex(v[i]);
cout<<"please input the num of arc:";
cin>>e;
for(i=0;i<e;i++){
cin>>tail>>head>>w;
//
逐条输入边和权值
tail
为开始接点,
head
为结束点
if((t=Getpos(tail))==-1){
cout<<"the vertex(tail) not exist"<<endl;return ;}
else if((h=Getpos(head))==-1){
cout<<"the vertex(head) not exist"<<endl;return ;}
else InsertArc(t,h,w);
//insert border from t ---->h
the
weight is w
}
}
template<class VertexType,class ArcType>Graph<VertexType,ArcType>:: ~Graph()
{ ArcNode<VertexType,ArcType> *p1,*p2;
for(int i=0;i<currentnumvertex;i++){
p1=vertextable[i].firstarc;
if(p1!=NULL){
if(p1->nextarc==NULL){
delete p1;
return ;
}
p2=p1->nextarc;
delete p1;
p1=p2;
p2=p2->nextarc;
}
}
}
template<class VertexType,class ArcType>void Graph<VertexType,ArcType>::DFTraverse(){
int i,n=currentnumvertex;
int *visited=new int
;
for(i=0;i<n;i++)
visited[i]=0;
for(i=0;i<n;i++){
if(visited[i]==0)
DFS(i,visited);
}
delete []visited;
}
template<class VertexType,class ArcType>void Graph<VertexType,ArcType>::DFS(const int v,int visited[]){
visite(v);
visited[v]=1;
int w;
w=Getnextneighbor(v);// get first next vertex
while(w!=-1){
if(visited[w]==0)
DFS(w,visited);
w=Getnextneighbor(v,w);
//
取
v
的排在
w
后的下一个邻接点
,now the w is visited and muset
回溯
}
}
template<class VertexType,class ArcType>int Graph<VertexType,ArcType>::Getnextneighbor(int v){
if(vertextable[v].firstarc!=NULL)
return (vertextable[v].firstarc->adjex);
else return -1;
}
template<class VertexType,class ArcType>int Graph<VertexType,ArcType>::Getnextneighbor(int v,int w){
ArcNode<VertexType,ArcType> *p=vertextable[v].firstarc;
while(p!=NULL){
if(p->adjex==w){
if(p->nextarc!=NULL)
return p->nextarc->adjex;
else return -1;
}
p=p->nextarc;
}
return -1;
}
主测试函数
main.cpp
#include<iostream.h>
//#include"heap.h"
//#include"heap2.h"
//#include"graph.h"
#include"graph2.h"
//#include"huffmantree.h"
int main()
{/////////////////////////////////////////////test Graph<>
有向图邻接表实现
+
图的两种遍历算法
char v[4];
for(int i=0;i<4;i++)
cin>>v[i];
Graph<char,int> graph(v);
graph.printvertex(); cout<<endl;
cout<<"num of arc:"<<graph.Getcurrentnumarc()<<endl;
cout<<"num of vertex:"<<graph.Getcurrentvertex()<<endl;
cout<<"DFT is(
深度优先便历
):";graph.DFTraverse();
cout<<endl;
cout<<"Vertextable:(
邻接表
)"<<endl;
graph.print1();
//cout<<endl;
//cout<<graph.Getnextneighbor(0,1)<<endl;
return 0;
}
相关文章推荐
- 数据结构经典算法汇总___图的邻接矩阵实现
- 经典算法与数据结构的c++实现——插入排序
- C/C++经典算法精华整理(3)-实现栈的数据结构
- 【数据结构--经典算法】PHP实现各种经典算法
- 数据结构经典算法汇总___循环队列:
- 经典算法与数据结构的c++实现——带头结点的单链表
- 经典算法与数据结构的c++实现——冒泡排序
- 【面试经典题之字符串】实现一个算法,确定一个字符串的所有字符是否全都不同。假设不允许使用额外的数据结构
- 经典算法与数据结构的c++实现——直接选择排序
- 几道经典的数据结构算法代码实现(1)
- 几道经典的数据结构算法代码实现(2)
- 数据结构和算法经典文章汇总
- 经典算法与数据结构的c++实现——shell排序算法
- 算法与数据结构 其二 数组和链表 的实现
- 算法与数据结构 其三 栈的实现
- LRU经典算法的原理与实现
- Java经典算法汇总之选择排序(SelectionSort)
- 算法与数据结构【二】简单链表的实现
- 【LeetCode-面试算法经典-Java实现】【089-Gray Code(格雷码)】
- 白话经典算法系列之中的一个 冒泡排序的三种实现