第12週目、項目2-操作用隣接テーブルに格納した図

9262 ワード

問題およびコード:
(1)テスト関数:main.cpp、関連するテスト作業を完成する;
/*
 *Copyright(c) 2015,              
 *All rights reserved.
 *    :test.cpp
 *      :   
 *    :2015 11 16 
 *     ;v1.0
 *
 *    :   G       ,             : 
           (1)    G        ; 
           (2)   G          ,       ; 
           (3)   G    0    ; 
           (4)   G      <i,j> 。 
                      ,    。 
<img src="http://img.blog.csdn.net/20151116164015972?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
 *    :
 *    :
 */
#include <stdio.h>
#include <malloc.h>
#include "graph.h"

//   G    v      
int OutDegree(ALGraph *G,int v)
{
    ArcNode *p;
    int n=0;
    p=G->adjlist[v].firstarc;
    while (p!=NULL)
    {
        n++;
        p=p->nextarc;
    }
    return n;
}

//   G        
void OutDs(ALGraph *G)
{
    int i;
    for (i=0; i<G->n; i++)
        printf("    %d:%d
",i,OutDegree(G,i)); } // G void OutMaxDs(ALGraph *G) { int maxv=0,maxds=0,i,x; for (i=0; i<G->n; i++) { x=OutDegree(G,i); if (x>maxds) { maxds=x; maxv=i; } } printf(" %d, =%d
",maxv,maxds); } // G 0 void ZeroDs(ALGraph *G) { int i,x; for (i=0; i<G->n; i++) { x=OutDegree(G,i); if (x==0) printf("%2d",i); } printf("
"); } // G <i,j> bool Arc(ALGraph *G, int i,int j) { ArcNode *p; bool found = false; p=G->adjlist[i].firstarc; while (p!=NULL) { if(p->adjvex==j) { found = true; break; } p=p->nextarc; } return found; } int main() { ALGraph *G; int A[7][7]= { {0,1,1,1,0,0,0}, {0,0,0,0,1,0,0}, {0,0,0,0,1,1,0}, {0,0,0,0,0,0,1}, {0,0,0,0,0,0,0}, {0,0,0,1,1,0,1}, {0,1,0,0,0,0,0} }; ArrayToList(A[0], 7, G); printf("(1) :
"); OutDs(G); printf("(2) :"); OutMaxDs(G); printf("(3) 0 :"); ZeroDs(G); printf("(4) <2,6> ?"); if(Arc(G,2,6)) printf("
"); else printf("
"); printf("
"); return 0; }
(2)   :graph.h,            、   、           ;
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED

#define MAXV 100                //      
#define INF 32767       //INF  ∞
typedef int InfoType;

//          
typedef struct
{
    int no;                     //    
    InfoType info;              //      ,         
} VertexType;                   //    

typedef struct                  //    
{
    int edges[MAXV][MAXV];      //    
    int n,e;                    //   ,  
    VertexType vexs[MAXV];      //      
} MGraph;                       //        

//         
typedef struct ANode            //        
{
    int adjvex;                 //       
    struct ANode *nextarc;      //         
    InfoType info;              //       ,        
} ArcNode;

typedef int Vertex;

typedef struct Vnode            //         
{
    Vertex data;                //    
    int count;                  //      ,        
    ArcNode *firstarc;          //      
} VNode;

typedef VNode AdjList[MAXV];    //AdjList      

typedef struct
{
    AdjList adjlist;            //   
    int n,e;                    //     n   e
} ALGraph;                      //       

//  :                  ,            
//  :Arr -    ,                       ,     Arr        (  int   )
//      n -      
//      g -               
void ArrayToMat(int *Arr, int n, MGraph &g); //             
void ArrayToList(int *Arr, int n, ALGraph *&); //            
void MatToList(MGraph g,ALGraph *&G);//     g      G
void ListToMat(ALGraph *G,MGraph &g);//    G       g
void DispMat(MGraph g);//      g
void DispAdj(ALGraph *G);//     G

#endif // GRAPH_H_INCLUDED

(3)   :graph.cpp,              ;
#include <stdio.h>
#include <malloc.h>
#include "graph.h"

//  :                  ,            
//  :Arr -    ,                       ,     Arr        (  int   )
//      n -      
//      g -               
void ArrayToMat(int *Arr, int n, MGraph &g)
{
    int i,j,count=0;  //count      ,     0    
    g.n=n;
    for (i=0; i<g.n; i++)
        for (j=0; j<g.n; j++)
        {
            g.edges[i][j]=Arr[i*n+j]; // Arr  n×n     ,Arr[i*n+j]  Arr[i][j],             
            if(g.edges[i][j]!=0)
                count++;
        }
    g.e=count;
}

void ArrayToList(int *Arr, int n, ALGraph *&G)
{
    int i,j,count=0;  //count      ,     0    
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    G->n=n;
    for (i=0; i<n; i++)                 //                 
        G->adjlist[i].firstarc=NULL;
    for (i=0; i<n; i++)                 //           
        for (j=n-1; j>=0; j--)
            if (Arr[i*n+j]!=0)      //     , Arr  n×n     ,Arr[i*n+j]  Arr[i][j]
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));   //      *p
                p->adjvex=j;
                p->info=Arr[i*n+j];
                p->nextarc=G->adjlist[i].firstarc;      //       *p
                G->adjlist[i].firstarc=p;
            }

    G->e=count;
}

void MatToList(MGraph g, ALGraph *&G)
//     g      G
{
    int i,j;
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    for (i=0; i<g.n; i++)                   //                 
        G->adjlist[i].firstarc=NULL;
    for (i=0; i<g.n; i++)                   //           
        for (j=g.n-1; j>=0; j--)
            if (g.edges[i][j]!=0)       //     
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));   //      *p
                p->adjvex=j;
                p->info=g.edges[i][j];
                p->nextarc=G->adjlist[i].firstarc;      //       *p
                G->adjlist[i].firstarc=p;
            }
    G->n=g.n;
    G->e=g.e;
}

void ListToMat(ALGraph *G,MGraph &g)
//    G       g
{
    int i,j;
    ArcNode *p;
    for (i=0; i<g.n; i++)   //        
        for (j=0; j<g.n; j++)
            g.edges[i][j]=0;
    for (i=0; i<G->n; i++)  //     ,       
    {
        p=G->adjlist[i].firstarc;
        while (p!=NULL)
        {
            g.edges[i][p->adjvex]=p->info;
            p=p->nextarc;
        }
    }
    g.n=G->n;
    g.e=G->e;
}

void DispMat(MGraph g)
//      g
{
    int i,j;
    for (i=0; i<g.n; i++)
    {
        for (j=0; j<g.n; j++)
            if (g.edges[i][j]==INF)
                printf("%3s","∞");
            else
                printf("%3d",g.edges[i][j]);
        printf("
"); } } void DispAdj(ALGraph *G) // G { int i; ArcNode *p; for (i=0; i<G->n; i++) { p=G->adjlist[i].firstarc; printf("%3d: ",i); while (p!=NULL) { printf("-->%d/%d ",p->adjvex,p->info); p=p->nextarc; } printf("
"); } }
<img src="http://img.blog.csdn.net/20151116164031559?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />