提醒:邻接矩阵比邻接表好实现和理解,我写邻接表的时候一直在出现千奇百怪的错误,然后看csdn上其他很厉害的博主都很少用c语言写,有点看不懂。主要是需要注意回车会被输入,scanf的时候需要避免回车的错误输入!!这个真的很重要呜!希望大家可以看懂,虽然代码很多冗余,但是简单好懂才是我的目的。谢谢啦~
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXSIZE 100
#define MaxInt 32767
//图的邻接矩阵 定义
typedef struct{
char vexs[MAXSIZE];//顶点表
int arcs[MAXSIZE][MAXSIZE];//邻接矩阵
int vexnum,arcnum;//输入当前的点数和边数
}AMGraph;
//图的邻接表 需要定义三个结构体
//"边/弧"
typedef struct ArcNode{
int adjvex; //指向哪一个结点
struct ArcNode *next;//指向下一条弧的指针
}ArcNode;
//"顶点"
typedef struct VNode{
char data; //顶点的信息
ArcNode *first; //第一条边
}VNode,AdjList[MAXSIZE];
//"图"
typedef struct{
AdjList vertices;//顶点的数组
int vexnum,arcnum;//顶点的个数和弧的个数
}ALGraph;
int LocateVexAMG(AMGraph G,char v){
for(int i=0;i<G.vexnum;i++){
if(v==G.vexs[i]){
return i;
}
}
return -1;//-1表示没有找到
}
//采用邻接矩阵表示法创建无向图
bool CreateUDM(AMGraph &G){
printf("\n请输入顶点的个数:");
scanf("%d",&G.vexnum);
printf("\n请输入边的个数:");
scanf("%d",&G.arcnum);
printf("\n请输入顶点的名称:");
for(int i=0;i<G.vexnum;i++){
scanf(" %c",&G.vexs[i]);
}
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
G.arcs[i][j]=MaxInt;//初始化邻接矩阵为无穷大
}
}
printf("\n请输入边的顶点和权重:");
for(int k=0;k<G.arcnum;k++){
char v1,v2;
int weight;
scanf(" %c %c",&v1,&v2);
scanf("%d",&weight);
int i=LocateVexAMG(G,v1);
int j=LocateVexAMG(G,v2);
if(i==-1||j==-1){
return false;
}
G.arcs[i][j]=weight;
G.arcs[j][i]=G.arcs[i][j];
}
printf("无向图创建成功!");
return true;
}
int LocateVex(ALGraph G,char v){
for(int i=0;i<G.vexnum;i++){
if(G.vertices[i].data==v){
return i;
}
}
return -1;
}
//建立表的邻接表结构
bool CreateALGraph(ALGraph &G){
char v1,v2;
printf("\n请输入顶点的个数:");
scanf("%d",&G.vexnum);
printf("\n请输入边的个数:");
scanf("%d",&G.arcnum);
for(int i=0;i<G.vexnum;i++){
printf("\n请输入顶点的名称:");
scanf(" %c",&G.vertices[i].data);//初始化顶点的指针域
getchar();
G.vertices[i].first=NULL;
}
for(int k=0;k<G.arcnum;k++){//构造边表
printf("\n请输入边的顶点:");
scanf(" %c, %c",&v1,&v2);
getchar();
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
//将新节点插入到顶点的头部
ArcNode *p1;
p1=(ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex=j;
p1->next=G.vertices[i].first;
G.vertices[i].first=p1;
//再创建一个结点与p2对称
ArcNode *p2;
p2=(ArcNode *)malloc(sizeof(ArcNode));
p2->adjvex=i;
p2->next=G.vertices[j].first;
G.vertices[j].first=p2;
}
printf("无向图的邻接表创建成功!");
return true;
}
void showALGraph(ALGraph G){
for(int i=0;i<G.vexnum;i++){
printf("\n");
printf(" %c:",G.vertices[i].data);
for(ArcNode *p=G.vertices[i].first;p;p=p->next){
printf("->%d",p->adjvex);
}
printf("\n");
}
}
int main(){
// AMGraph G;
// CreateUDM(G);
ALGraph G;
CreateALGraph(G);
showALGraph(G);
}