邻接矩阵和邻接表的区别
1.结点结构定义
typedef struct ArcNode{
int index;
int num;
struct ArcNode*nextArc;
}ArcNode;
typedef struct vNode{
Elemtype data;
ArcNode*firstArc;
}VNode,Alist[MAX_SIZE];
typedef struct{
Alist Datas;
int VexNum;
int ArcNum;
}Graph;
2.确定顶点对应的数组下标
int LocateVex(Graph G,Elemtype t)
{
for(int i=0;i<G.VexNum;i++)
{
if(t==G.Datas[i].data)
{
return i;
}
}
return -1;
}
3.采用邻接表表示法创建无向网
void CreatGraph(Graph &G)
{
cout<<"请依次输入顶点数和总边数:"<<endl;
cin>>G.VexNum>>G.ArcNum;
cout<<"输入各顶点的数据:"<<endl;
for(int i=0;i<G.VexNum;i++)
{
cin>>G.Datas[i].data;
G.Datas[i].firstArc=NULL;
}
cout<<"输入两个顶点并构造链接:"<<endl ;
for(int k=0;k<G.ArcNum;k++)
{
Elemtype v1,v2;
cin>>v1>>v2;
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
ArcNode *p1=new ArcNode;
p1->index=j;
p1->nextArc=G.Datas[i].firstArc;
G.Datas[i].firstArc=p1;
ArcNode* p2=new ArcNode;
p2->index=i;
p2->nextArc=G.Datas[j].firstArc;
G.Datas[j].firstArc=p2;
}
}
4.创建无向表
#include<iostream>
using namespace std;
#define MAX_SIZE 100
typedef char Elemtype;
typedef struct ArcNode{
int index;
int num;
struct ArcNode*nextArc;
}ArcNode;
typedef struct vNode{
Elemtype data;
ArcNode*firstArc;
}VNode,Alist[MAX_SIZE];
typedef struct{
Alist Datas;
int VexNum;
int ArcNum;
}Graph;
int LocateVex(Graph G,Elemtype t)
{
for(int i=0;i<G.VexNum;i++)
{
if(t==G.Datas[i].data)
{
return i;
}
}
return -1;
}
void CreatGraph(Graph &G)
{
cout<<"请依次输入顶点数和总边数:"<<endl;
cin>>G.VexNum>>G.ArcNum;
cout<<"输入各顶点的数据:"<<endl;
for(int i=0;i<G.VexNum;i++)
{
cin>>G.Datas[i].data;
G.Datas[i].firstArc=NULL;
}
cout<<"输入两个顶点并构造链接:"<<endl ;
for(int k=0;k<G.ArcNum;k++)
{
Elemtype v1,v2;
cin>>v1>>v2;
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
ArcNode *p1=new ArcNode;
p1->index=j;
p1->nextArc=G.Datas[i].firstArc;
G.Datas[i].firstArc=p1;
ArcNode* p2=new ArcNode;
p2->index=i;
p2->nextArc=G.Datas[j].firstArc;
G.Datas[j].firstArc=p2;
}
}
int main()
{
Graph G;
CreatGraph(G);
}
5.创建有向表(出度)
#include<iostream>
using namespace std;
#define MAX_SIZE 100
typedef char Elemtype;
typedef struct ArcNode{
int index;
int num;
struct ArcNode*nextArc;
}ArcNode;
typedef struct vNode{
Elemtype data;
ArcNode*firstArc;
}VNode,Alist[MAX_SIZE];
typedef struct{
Alist Datas;
int VexNum;
int ArcNum;
}Graph;
int LocateVex(Graph G,Elemtype t)
{
for(int i=0;i<G.VexNum;i++)
{
if(t==G.Datas[i].data)
{
return i;
}
}
return -1;
}
void CreatGraph(Graph &G)
{
cout<<"请依次输入顶点数和总边数:"<<endl;
cin>>G.VexNum>>G.ArcNum;
cout<<"输入各顶点的数据:"<<endl;
for(int i=0;i<G.VexNum;i++)
{
cin>>G.Datas[i].data;
G.Datas[i].firstArc=NULL;
}
cout<<"输入两个顶点并构造链接:"<<endl ;
for(int k=0;k<G.ArcNum;k++)
{
Elemtype v1,v2;
cin>>v1>>v2;
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
ArcNode *p1=new ArcNode;
p1->index=j;
p1->nextArc=G.Datas[i].firstArc;
G.Datas[i].firstArc=p1;
}
}
int main()
{
Graph G;
CreatGraph(G);
}
6.创建有向表(入度)
#include<iostream>
using namespace std;
#define MAX_SIZE 100
typedef char Elemtype;
typedef struct ArcNode{
int index;
int num;
struct ArcNode*nextArc;
}ArcNode;
typedef struct vNode{
Elemtype data;
ArcNode*firstArc;
}VNode,Alist[MAX_SIZE];
typedef struct{
Alist Datas;
int VexNum;
int ArcNum;
}Graph;
int LocateVex(Graph G,Elemtype t)
{
for(int i=0;i<G.VexNum;i++)
{
if(t==G.Datas[i].data)
{
return i;
}
}
return -1;
}
void CreatGraph(Graph &G)
{
cout<<"请依次输入顶点数和总边数:"<<endl;
cin>>G.VexNum>>G.ArcNum;
cout<<"输入各顶点的数据:"<<endl;
for(int i=0;i<G.VexNum;i++)
{
cin>>G.Datas[i].data;
G.Datas[i].firstArc=NULL;
}
cout<<"输入两个顶点并构造链接:"<<endl ;
for(int k=0;k<G.ArcNum;k++)
{
Elemtype v1,v2;
cin>>v1>>v2;
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
第二次头插法。入度边
ArcNode* p2=new ArcNode;
p2->index=i;
p2->nextArc=G.Datas[j].firstArc;
G.Datas[j].firstArc=p2;
}
}
int main()
{
Graph G;
CreatGraph(G);
}