数据结构——C语言实现图的邻接表和邻接矩阵表示

文章介绍了如何使用C语言实现无向图的数据结构,包括邻接矩阵和邻接表的方法。创建过程中提到了邻接矩阵的简洁性和邻接表在处理大量边时的优势,以及输入处理中的注意事项,如避免回车错误。代码示例展示了两种方法的创建过程。
摘要由CSDN通过智能技术生成

提醒:邻接矩阵比邻接表好实现和理解,我写邻接表的时候一直在出现千奇百怪的错误,然后看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);
}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值