图(C)

图的顺序存储结构

邻接矩阵

四种图分别实现   下面只给出了有向图的实现,其他三种仅修改最后存储结果即可(网需要读入权重)

复制代码
#include<stdio.h>
#define NumOfVertex 200
#define VertexType int

typedef enum{Digraph,Undigraph,DirectedNet,UndirectedNet}GraphKind;

typedef struct{
    int relation;   //无权图用01表示是否相连接   网直接表示权重 
    //Info;
}rlt,rltionMatrix[NumOfVertex][NumOfVertex];

typedef struct{
    VertexType Vex[NumOfVertex];  //存顶点 
    int NumOfVex,NumOfArc;            //存顶点和边的数量 
    rltionMatrix Matrix;             // 矩阵 
    GraphKind kind;                //图的类型 
}MyGraph;

//定位顶点在表中位置 
int LocateVex(MyGraph*g,VertexType v){
    for(int i = 0;i<g->NumOfVex;i++){
        if(g->Vex[i]==v)
        return i;
    }
    
    printf("None");
    return -1;
}

//创建有向图 
void CreatDG(MyGraph *g){
    int VNum,ANum;
    scanf("%d %d",&(g->NumOfVex),&(g->NumOfArc));
    
    //存顶点数据
    for(int i =0;i<g->NumOfVex;i++)
    scanf("%d",&(g->Vex[i]));
    
    //printf("RUN HERE");
    //初始化矩阵全置为0
    for(int i =0;i<g->NumOfVex;i++)
        for(int j = 0;j<g->NumOfVex;j++)
            {
                g->Matrix[i][j].relation=0;
                //info
             } 
             

    //构造矩阵
    for(int i = 0;i<g->NumOfArc;i++)
    {
        int v1,v2;
        scanf("%d %d", &v1, &v2);
        int pos1 = LocateVex(g,v1);
        int pos2 = LocateVex(g,v2);
        
        if(pos1==-1||pos2==-1)
        return;
        else
        g->Matrix[pos1][pos2].relation=1;
        ////无向图的二阶矩阵沿主对角线对称
        //网读入权存入矩阵 
                 }             
     
}

//void CreateGraph(MyGraph* G) {
//    //选择图的类型
//    scanf("%d", &(G->kind));
//    //根据所选类型,调用不同的函数实现构造图的功能
//    switch (G->kind) {
//    case DG:
//        return CreateDG(G);
//        break;
//    case DN:
//        return CreateDN(G);
//        break;
//    case UDG:
//        return CreateUDG(G);
//        break;
//    case UDN:
//        return CreateUDN(G);
//        break;
//    default:
//        break;
//    }
//}

void printG(MyGraph *g){
    
    for (int i = 0;i<g->NumOfVex;i++){
        
    
        for(int j = 0;j<g->NumOfVex;j++)
            {
                printf(" %d ",g->Matrix[i][j].relation);
                
            }
            printf("\n");
        }
}

int main(){
    MyGraph g;
    CreatDG(&g);
    printG(&g);
    
}
复制代码

 

图的邻接表存储结构

复制代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define NumOfVertex 200
#define VertexType char

//typedef enum{Digraph,Undigraph,DirectedNet,UndirectedNet}GraphKind;
typedef struct ArcNode{
    int pos;   //点下标
    struct ArcNode* next;
    //info 
}ArcNode;

typedef struct VexNode{
    VertexType data;
    ArcNode * firstArc;  //顶点后第一个节点   前插法 
    //info
    
}VexNode,List[NumOfVertex];   //有几个点就有几个链 


typedef struct{
    List lists;   
    int Vnum,Anum;
}MyGraph;

void createGraph(MyGraph*g){
    scanf("%d %d",&g->Vnum,&g->Anum);
    getchar();
//存顶点
for (int i =0;i<g->Vnum;i++){
    scanf("%c",&g->lists[i].data);
//    printf("  %d %d  \n",i,g->lists[i].data);
    getchar();
    g->lists[i].firstArc = NULL;
//    printf("Suc1");
}    

//存储弧
for(int i = 0;i<g->Anum;i++){
    ArcNode *node = NULL;
    int st,end;
    
    scanf("%c %c",&st,&end);
    getchar();
    
    //
    node = (ArcNode*)malloc(sizeof(ArcNode));
    node->next = NULL;
    node->pos = -1;
    //找下标(另一个点 )
    for(int j =0;j<g->Vnum;j++){
        if(g->lists[j].data==end)
        {
            node->pos = j;
            break;
        }
    }
    
    //没找到结束
    if(node->pos ==-1)
    {
        printf("FAILED");
        exit(0);
     } 
     
     
     //将 node 结点以头插法的方式添加到相应链表中
     
    for(int j =0;j<g->Vnum;j++){
        if(g->lists[j].data==st)
        {
            node->next = g->lists[j].firstArc;
            g->lists[j].firstArc = node;
        }
    }
    
    
    
    
    
} 
} 



int InDegree(MyGraph* g,char v){
    int ans = 0;
    int pos = -2;
    //找位置先
    for(int i = 0;i<g->Vnum;i++){
        if(g->lists[i].data==v)
        {
            pos = i;
            break;
        }
    } 
    if(pos ==-2){
        printf("没找到捏");
        exit(0);
    }
    
    //遍历每一个链
    for(int i = 0;i<g->Vnum;i++){
        ArcNode* t = g->lists[i].firstArc;
        while(t){
            if(t->pos==pos)
            ans++;
            
            t = t->next;
        }
        
        
        
    } 
    return ans;
    
}


int OutDegree(MyGraph*g,char v){
    int ans = 0;
    
    for(int i = 0;i<g->Vnum;i++){
        if(g->lists[i].data==v)
        {
            ArcNode* t = g->lists[i].firstArc;
            while(t)
            {
                ans++;
                t = t->next;
            }
        }
    }
    
    
    return ans;
}
int main(){
         MyGraph g;
         createGraph(&g);
        printf("%c 顶点的出度为 %d\n", 'A', OutDegree(&g, 'A'));
        printf("%c 顶点的入度为 %d", 'A', InDegree(&g, 'A'));
}
复制代码

 

posted @   Konataaa  阅读(258)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示