#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxVertexNum 100 //最大顶点数为100
typedef int WeightType; //假设边的权值为 int 类型
typedef char DataType; // 假设顶点存储类型为 char 类型
//边的定义
struct Edge{
int V1, V2; // 俩个顶点的下标,用下标表示顶点
WeightType Weight;
};
//邻接点的定义
struct AdjVNode{
int AdjV; //顶点下标
WeightType Weight;
AdjVNode *next;
};
//顶点表头结点的定义
typedef struct Vnode{
AdjVNode *next;
DataType Data;
}AdjList[MaxVertexNum];
//图结点定义
struct GNode{
int Nv; //顶点数
int Ne; //边数
AdjList G;
};
//初始化图(就是赋值)
GNode* CreateGraph(int VertexNum){
int V;
GNode *Graph;
Graph=(GNode*)malloc(sizeof(GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;
for(V=0;V<Graph->Nv;V++)
Graph->G[V].next=NULL;
return Graph;
}
//插入边的数据
void InsertEdge(GNode *Graph, Edge* E){
AdjVNode *NewNode;
NewNode=(AdjVNode*)malloc(sizeof(AdjVNode));
NewNode->AdjV=E->V2;
NewNode->Weight=E->Weight;
NewNode->next=Graph->G[E->V1].next;
Graph->G[E->V1].next=NewNode;
}
//打印输出图的 俩个顶点 和 权值
void show(GNode*Graph){
printf("起点 终点 权值\n");
int i,j;
AdjVNode*p;
char ch;
for(i=0; i<Graph->Nv; i++){
p=Graph->G[i].next;
while(1){
if(p==NULL)break;
printf("%c ", Graph->G[i].Data);
//for循环找到下标所对应的顶点字符
for(j=0;j<Graph->Nv; j++) if(j==p->AdjV) {printf("%c ", Graph->G[j].Data);break;}
printf("%d \n",p->Weight);
p=p->next;
}
printf("\n");
}
}
//建立邻接表
void BulidGraph(){
GNode *Graph;
Edge *E;
int V; // 顶点的下标,用下标表示顶点
int Nv,i,j;
char c1,c2;
printf("请输入顶点数:");
scanf("%d", &Nv);
Graph=CreateGraph(Nv);
//插入顶点数据
printf("请输入顶点数据(注意:字符之间不能有空格):");
getchar();
for(V=0; V<Graph->Nv; V++){
scanf("%c", &(Graph->G[V].Data));
}
printf("请输入边数:");
scanf("%d", &(Graph->Ne));
if(Graph->Ne!=0){
E=(Edge*)malloc(sizeof(Edge));
//输入数据
for(i=0; i<Graph->Ne; i++){getchar();
printf("\n请输入起点v1:");
c1=getchar();
printf("\n请输入终点v2:");
getchar();
c2=getchar();
printf("\n权值weight:");
scanf("%d",&E->Weight);
//俩个for分别找到顶点字符对应的下标,再调用InsertEdge(Graph, E)函数把边的值存进去
for(j=0;j<Nv; j++) if(Graph->G[j].Data==c1) {E->V1=j;break;}
for(j=0;j<Nv; j++) if(Graph->G[j].Data==c2) {E->V2=j;break;}
InsertEdge(Graph, E);
}
}
//打印图
show(Graph);
}
int main(){
BulidGraph();
}
有向图的邻接表(用c++编译运行)
于 2024-04-13 11:44:14 首次发布