• c_数据结构_图_邻接表


    课程设计------邻接表

    图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip

    #include<stdio.h>
    #include<stdlib.h>
    #include<windows.h>
    #define OK 1
    #define MAX_VERTEX_NUM 20 //最大顶点个数
    
    //邻接表存储结构
    typedef struct ArcNode {       //邻接顶点信息链表
        int adjvex;             //该弧指向的结点位置
        struct ArcNode *nextarc;    //指向下一个弧的指针
    }ArcNode;
    typedef struct VNode {     //顶点信息数组
        char data;      //顶点信息
        ArcNode *firstarc;      //指向第一条依附该顶点的弧指针
    }VNode,AdjList[MAX_VERTEX_NUM];
    typedef struct {      //图的邻接表存储结构
        AdjList vertices;
        int vexnum,arcnum;
    }ALGraph;
    
    /*定位顶点*/
    int LocateVex(ALGraph G,int v){  
        int i;
        for(i=0;i<G.vexnum;i++)
            if(G.vertices[i].data == v)  return i;
        return -1;
    }
    /*边的连接*/
    int CreateSide(ALGraph &G){
        int m,n,v1,v2;ArcNode *s;
        printf("
    请输入两顶点间的关系(用空格隔开):");
        fflush(stdin);
        scanf("%d %d",&v1,&v2);
        m = LocateVex(G,v1);
        n = LocateVex(G,v2);
        while (m==-1||n==-1) {
            printf("!!!顶点输入错误!!!");
            if(CreateSide(G))break;
        }
        s = (ArcNode * )malloc(sizeof(ArcNode));
        s->adjvex = n;    // 新的顶点指向结点位置的信息
        s->nextarc = G.vertices[m].firstarc;   // 新的顶点的next指向m位置的next
        G.vertices[m].firstarc = s; // m 位置的next指向新节点
        return OK;
    }
    
    /*图的创建*/
    void Create(ALGraph &G){
        int i,x;
        printf("
    请输入顶点数和弧数(用空格隔开):");
        scanf("%d",&G.vexnum);    // 顶点数
        scanf("%d",&G.arcnum);   // 弧数
        x=G.vexnum;
        if(G.vexnum<20 && G.arcnum<=(x*(x-1))/2){
            printf("
    请输入%d 个顶点值(用空格隔开):",G.vexnum);
            for(i=0;i<G.vexnum;i++){  // 循环存入顶点值
                scanf("%d",&G.vertices[i].data);
                G.vertices[i].firstarc=NULL;
            }
            for(i=0;i<G.arcnum;i++){
                CreateSide(G);
            }
        }else{
            printf("
    !!!您输入的总顶点数 大于 20 了或者是输入的总边数 不符合 n(n-1)/2 !!!
    ");
            Create(G);
        }
        
    }
    /*打印输出邻接关系*/
    void Print(ALGraph G){
        int i;
        ArcNode *p;
        printf("邻接表:
    ");
        for(i=0;i<G.vexnum;i++){
            printf("%d ->",G.vertices[i].data);
            p = G.vertices[i].firstarc;
            while(p){
                printf("%d-> ",G.vertices[p->adjvex].data);
                p = p->nextarc;
            }
        printf("NULL
    ");    
        }
        
    }
    
    /*图的深度遍历*/
    int visited[MAX_VERTEX_NUM];  // 辅助数组
    void DFS(ALGraph &G,int i){
        ArcNode *p;
        visited[i]=1;
        printf("
    访问到顶点%d 
    ",G.vertices[i].data);
        p = G.vertices[i].firstarc;
        while(p){
            if(visited[p->adjvex]==0){  // 如果结点未被访问
                DFS(G,p->adjvex);
            }
            p = p->nextarc;
        }
         
    }
    /* 保证非连通图被遍历*/
    void DFSTraverse(ALGraph &G){
        int i,m,x;ArcNode *p;
        printf("
    深度优先遍历
    ");
        for(i=0;i<G.vexnum;i++){    // 初始化辅助数组
            visited[i] = 0;
        }
        printf("
    请输入遍历起点:");
        scanf("%d",&x);
        printf("
    遍历起点为:%d 
    ",x);
        m = LocateVex(G,x);
        if(m!=-1){    
            visited[m]=1;
            p = G.vertices[m].firstarc;
            while(p){
                if(visited[p->adjvex]==0){  // 如果结点未被访问
                    DFS(G,p->adjvex);
                }
                p = p->nextarc;
            }
            for(i=0;i<G.vexnum;i++){   // 保证非连通图被遍历
                if(visited[i]==0){
                    DFS(G,i);
                }
            }
        }else{
            printf("
    !!!您输入的起点不在顶点表内!!!
    ");
            DFSTraverse(G);
        }
    
    }
    /*菜单*/
    void OperateMenu(){      
    
        printf("
    --------------请选择元素处理方式---------
    
    ");
        printf("!!!!!注:测试程序过程中,输入应全为数字!!!!!
    
    ");
        printf("0> :退出
    
    ");
        printf("1>: 建立无向无权图
    
    ");
        printf("2>:深度遍历图
    
    ");
        printf("3>:打印邻接顶点间的关系
    
    ");
        printf("请选择对元素的处理:");
    }
    /*主函数*/
    void main(){
        ALGraph G;
        int w,m;
        OperateMenu();
        scanf("%d",&w);
        if(w!=1){
            printf("
    您未完成建图,是否继续(1-建图,0-退出):");
            scanf("%d",&m);
            if(m==1){
                w=1;
                Create(G);
            }
            else
                w=0;    
        }
        while(w){
            
            switch(w){
            case 0:break;
            case 1:printf("已经建立邻接表!!
    ");break;
            case 2:DFSTraverse(G);break;
            case 3:Print(G);break;    
            }
            OperateMenu();
            scanf("%d",&w);
        }
        
    }
  • 相关阅读:
    nodepad++中的正则表达式匹配和替换操作。
    QT Creator配置环境和安装
    圣诞树小程序的制作
    C#编辑xml文件
    delegate里的Invoke和BeginInvoke
    记录RFID操作错误
    关于Panel隐藏横向滚动条
    随笔
    Java图形打印 上下对称三角星
    Centos 7.5安装 Redis 5.0.0
  • 原文地址:https://www.cnblogs.com/Vera-y/p/11491795.html
Copyright © 2020-2023  润新知