图的邻接表存储方式的建立
图的邻接表存储方式,主要由表节点与头结点组成。
头结点中主要包含两个域:
1)存放顶点信息
2)存放与顶点相连的第一个表节点的指针
表节点中主要包含两个域:
1)存放相连的节点的序号
2)指向下一个节点的指针
#define MAXNUM 100 //表节点 typedef struct ArcNode{ int adjvex;//邻接顶点编号 struct ArcNode *next;//下一邻接顶点 }ArcNode; //头结点 typedef struct AdjList{ char vdata;//头结点数据信息 ArcNode *firstarc; //指向邻接表的第一个表节点 }AdjList; //图 typedef struct Digraph{ int n,e;//表示图中节点数和边数 AdjList Head[MAXNUM];//用数组存储头结点 }Digraph; //创建无向图的邻接表标示法 void CreatALJGraph(Digraph *G) { int i,j,k; char a; ArcNode *s; cout<<"输入节点数和边数: "<<endl;//有向图与无向图的边数不同 cin>>i>>j; G->e=j; G->n=i; cout<<"输入节点信息:"<<endl; //建立头结点 for(int k=0;k<G->n;k++) { cin>>a; G->Head[k].vdata=a; G->Head[k].firstarc=NULL; } //建立表节点 for(int t=0;t<G->e;t++) { cin>>i>>j;//读入边(vi,vj)的顶点对序号 s=(ArcNode*)malloc(sizeof(ArcNode)); s->adjvex=j; s->next=G->Head[i].firstarc; G->Head[i].firstarc=s; //无向图需要两个顶点都连接,而有向图则只需连接一次即可。 //等同于头插法建立链表 s=(ArcNode*)malloc(sizeof(ArcNode)); s->adjvex=i; s->next=G->Head[j].firstarc; G->Head[j].firstarc=s; } }