用头插法和尾插法建立图的邻接表并输出
1、头插法代码
#include <iostream>
#include<malloc.h>
using namespace std;
typedef struct EdgeNode
{
int adjvex;
int weight;
struct EdgeNode *next;
}EdgeNode;
typedef struct VertexNode
{
char data;
EdgeNode *firstedge;
}VertexNode,AdjList[100];
typedef struct GraphAdjList
{
AdjList adjlist;
int Vnum,Enum;
}GraphAdjList;
void CreateAdjList(GraphAdjList *G)
{
int dis,FPS,SPS;
char FP,SP;
EdgeNode *e;
cout<<"请输入顶点数和边数:"<<endl;
cin>>G->Vnum;
cin>>G->Enum;
cin.get();
cout<<"请输入顶点字符:"<<endl;
for(int i=0;i<G->Vnum;i++)
{
cin>>G->adjlist[i].data;
G->adjlist[i].firstedge = NULL;
}
cin.get();
cout<<"请输入各条边的前后顶点及边的权值:"<<endl;
for(int i=0;i<G->Enum;i++)
{
cin>>FP>>SP;
cin>>dis;
for(int j=0;j<G->Vnum;j++)
{
if(FP==G->adjlist[j].data)
{
FPS = j;
}
}
for(int k=0;k<G->Vnum;k++)
{
if(SP==G->adjlist[k].data)
{
SPS = k;
}
}
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = SPS;
e->weight = dis;
e->next = G->adjlist[FPS].firstedge;
G->adjlist[FPS].firstedge = e;
}
}
void DisplayAdjList(GraphAdjList G)
{
EdgeNode *e;
cout<<"共有"<<G.Vnum<<"个顶点"<<endl;
for(int i=0;i<G.Vnum;i++)
{
cout<<G.adjlist[i].data<<" ";
}
cout<<endl;
cout<<"共有"<<G.Enum<<"条边"<<endl;
for(int i=0;i<G.Vnum;i++)
{
e = G.adjlist[i].firstedge;
while(e!=NULL)
{
cout<<"["<<G.adjlist[i].data<<"->"<<G.adjlist[e->adjvex].data<<" "<<e->weight<<"]";
e = e->next;
}
cout<<endl;
}
}
int main()
{
GraphAdjList G;
CreateAdjList(&G);
DisplayAdjList(G);
return 0;
}

2、尾插法代码
#include <iostream>
#include<malloc.h>
using namespace std;
typedef struct EdgeNode
{
int adjvex;
int weight;
struct EdgeNode *next;
}EdgeNode;
typedef struct VertexNode
{
char data;
EdgeNode *firstedge;
}VertexNode,AdjList[100];
typedef struct GraphAdjList
{
AdjList adjlist;
int Vnum,Enum;
}GraphAdjList;
void CreateAdjList(GraphAdjList *G)
{
int dis,FPS,SPS;
char FP,SP;
EdgeNode *p;
cout<<"请输入顶点数和边数:"<<endl;
cin>>G->Vnum;
cin>>G->Enum;
cin.get();
cout<<"请输入顶点字符:"<<endl;
for(int i=0;i<G->Vnum;i++)
{
cin>>G->adjlist[i].data;
G->adjlist[i].firstedge = NULL;
}
cin.get();
cout<<"请输入各条边的前后顶点及边的权值:"<<endl;
for(int i=0;i<G->Enum;i++)
{
cin>>FP>>SP;
cin>>dis;
for(int j=0;j<G->Vnum;j++)
{
if(FP==G->adjlist[j].data)
{
FPS = j;
}
}
for(int k=0;k<G->Vnum;k++)
{
if(SP==G->adjlist[k].data)
{
SPS = k;
}
}
EdgeNode *e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = SPS;
e->weight = dis;
e->next = NULL;
p = G->adjlist[FPS].firstedge;
if(p == NULL)
{
G->adjlist[FPS].firstedge = e;
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
p->next=e;
}
}
}
void DisplayAdjList(GraphAdjList G)
{
EdgeNode *e;
cout<<"共有"<<G.Vnum<<"个顶点"<<endl;
for(int i=0;i<G.Vnum;i++)
{
cout<<G.adjlist[i].data<<" ";
}
cout<<endl;
cout<<"共有"<<G.Enum<<"条边"<<endl;
for(int i=0;i<G.Vnum;i++)
{
e = G.adjlist[i].firstedge;
while(e!=NULL)
{
cout<<"["<<G.adjlist[i].data<<"->"<<G.adjlist[e->adjvex].data<<" "<<e->weight<<"]";
e = e->next;
}
cout<<endl;
}
}
int main()
{
GraphAdjList G;
CreateAdjList(&G);
DisplayAdjList(G);
return 0;
}
