邻接表 :由顺序存储的顶点表和链接存储的边链表构成的图存储结构。
#include<iostream>
using namespace std;
#define MAXVEX 100 /* 最大顶点数 */
typedef char VertexType; /* 顶点类型 */
typedef int EdgeType; /* 边上的权值类型 */
typedef struct EdgeNode /* 边链表 */
{
int adjvex; /* 邻接点域,存储该顶点对应的下标 */
EdgeType weight; /* 用于存储权值,对于非网图可以不需要 */
struct EdgeNode *next; /* 链域,指向下一个邻接点 */
} EdgeNode;
typedef struct VextexNode /* 顶点表 */
{
VertexType data; /* 顶点域,存储顶点信息 */
EdgeNode *firstedge; /* 边表头指针 */
} VextexNode, AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numNodes, numEdges; /* 图中当前顶点数和边数 */
} GraphAdjList;
void CreateALGraph(GraphAdjList *Gp)
{
int i, j, k;
EdgeNode *pe;
cout << "输入顶点数和边数(空格分隔):" << endl;
cin >> Gp->numNodes >> Gp->numEdges;
for (i = 0 ; i < Gp->numNodes; i++)
{
cout << "输入顶点信息:" << endl;
cin >> Gp->adjList[i].data;
Gp->adjList[i].firstedge = NULL; /* 将边表置为空表 */
}
for (k = 0; k < Gp->numEdges; k++) /* 建立边表 */
{
cout << "输入边(vi,vj)的顶点序号i,j(空格分隔):" << endl;
cin >> i >> j;
pe = (EdgeNode *)malloc( sizeof(EdgeNode));
pe->adjvex = j; /* 邻接序号为j */
/* 将pe的指针指向当前顶点上指向的结点 */
pe->next = Gp->adjList[i].firstedge;
Gp->adjList[i].firstedge = pe; /* 将当前顶点的指针指向pe */
pe = (EdgeNode *)malloc( sizeof(EdgeNode));
pe->adjvex = i;
pe->next = Gp->adjList[j].firstedge;
Gp->adjList[j].firstedge = pe;
}
}
void Print(GraphAdjList *Gp){
for(int i=0;i<Gp->numNodes;i++){
cout<<Gp->adjList[i].data;
for(EdgeNode *p=Gp->adjList[i].firstedge;p!=NULL;p=p->next)
printf("->%d",p->adjvex);
cout<<endl;
}
}
int main( void)
{
GraphAdjList GL;
CreateALGraph(&GL);
Print(&GL);
return 0;
}
链式前向星
静态数组实现邻接表
head[x]:指向以x为头结点的最后一条边的编号
to[x]:第x条边对应的尾结点
next[x]:指向以x为头结点的上一条边的编号
int head[10005], nex[10005], to[10005], tot = 0;
void add(int x, int y)
{
to[++tot] = y;
nex[tot] = head[x];
head[x] = tot;
}
#include <iostream>
//邻接表的数组实现;
//输出为倒序
int main() {
int m,n,i;
int u[6],v[6],w[6];
int first[5] ;//下标为头结点;数组值为编号
int next[5];//下标为编号,数组值为下一条相同头结点的编号
scanf("%d %d",&n,&m);// n个点,m条边
for(int i=0;i<n;i++) first[i]=-1;//初始化
//建立邻接表
for(int i=0;i<m;i++){//i是边的编号
scanf("%d %d %d",&u[i],&v[i],&w[i]);
//第i条边的下一条边是 前i-1条边中的最后一条以u[i]为首的结点
next[i]=first[u[i]];
//让第i条边成为以u[i]为头结点的第一条边;
first[u[i]]=i;
}
//遍历以1为头结点的所有边
int k=first[1];//k为编号
while(k!=-1){
printf("%d %d %d\n",u[k],v[k],w[k]);
k=next[k];//下一个以1为头结点的边的编号
}
}