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("\n请输入两顶点间的关系(用空格隔开):");
    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("\n请输入顶点数和弧数(用空格隔开):");
    scanf("%d",&G.vexnum);    // 顶点数
    scanf("%d",&G.arcnum);   // 弧数
    x=G.vexnum;
    if(G.vexnum<20 && G.arcnum<=(x*(x-1))/2){
        printf("\n请输入%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("\n!!!您输入的总顶点数 大于 20 了或者是输入的总边数 不符合 n(n-1)/2 !!!\n");
        Create(G);
    }
    
}
/*打印输出邻接关系*/
void Print(ALGraph G){
    int i;
    ArcNode *p;
    printf("邻接表:\n");
    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\n");    
    }
    
}

/*图的深度遍历*/
int visited[MAX_VERTEX_NUM];  // 辅助数组
void DFS(ALGraph &G,int i){
    ArcNode *p;
    visited[i]=1;
    printf("\n访问到顶点%d \n",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("\n深度优先遍历\n");
    for(i=0;i<G.vexnum;i++){    // 初始化辅助数组
        visited[i] = 0;
    }
    printf("\n请输入遍历起点:");
    scanf("%d",&x);
    printf("\n遍历起点为:%d \n",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("\n!!!您输入的起点不在顶点表内!!!\n");
        DFSTraverse(G);
    }

}
/*菜单*/
void OperateMenu(){      

    printf("\n--------------请选择元素处理方式---------\n\n");
    printf("!!!!!注:测试程序过程中,输入应全为数字!!!!!\n\n");
    printf("0> :退出\n\n");
    printf("1>: 建立无向无权图\n\n");
    printf("2>:深度遍历图\n\n");
    printf("3>:打印邻接顶点间的关系\n\n");
    printf("请选择对元素的处理:");
}
/*主函数*/
void main(){
    ALGraph G;
    int w,m;
    OperateMenu();
    scanf("%d",&w);
    if(w!=1){
        printf("\n您未完成建图,是否继续(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("已经建立邻接表!!\n");break;
        case 2:DFSTraverse(G);break;
        case 3:Print(G);break;    
        }
        OperateMenu();
        scanf("%d",&w);
    }
    
}

 

posted @ 2019-09-09 15:04  yin_zhaozhao  阅读(282)  评论(0编辑  收藏  举报