完整版鄰接表

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream>
#include<iomanip>
using namespace std;
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define INFINITY 65535
#define MAXSIZE 100
typedef enum{DG,DN,UG,UN}Graphkind;
typedef struct 
{
    VRType adj;
    InfoPtr *info;
}ArcNode,AdjMatrix[MAXSIZE][MAXSIZE];
typedef struct 
{
    VertexType vex[MAXSIZE];
    AdjMatrix arc;
    int vexnum,arcnum;
    Graphkind kind;
}MGraph;
void CreateGraph(MGraph *N);
int LocateVertex(MGraph N,VertexType v);
void DestroyGraph(MGraph *N);
void DisplayGraph(MGraph N);
int main()
{
    MGraph N;
    cout<<"創建一個網:"<<endl;
    CreateGraph(&N);
    cout<<"輸出網的頂點和弧:"<<endl;
    DisplayGraph(N);
    DestroyGraph(&N);
}
void CreateGraph(MGraph *N)
{
    int i,j,k,w;
    VertexType v1,v2;
    cout<<"請輸入有向網N的定點數和弧數:";
    cin>>(*N).vexnum>>(*N).arcnum;
    cout<<"請輸入"<<N->vexnum<<"個頂點的值:"<<endl;
    for(i=0;i<N->vexnum;i++)
    cin>>N->vex[i];
    for(i=0;i<N->vexnum;i++)
    for(j=0;j<N->vexnum;j++)
    {
        N->arc[i][j].adj=INFINITY;
        N->arc[i][j].info=NULL;
             } 
             cout<<"請分別輸入"<<N->arcnum<<"條弧的弧尾 弧頭 權值 :"<<endl;
             for(k=0;k<N->arcnum;k++)
             {
                cin>>v1>>v2>>w;//輸入兩個頂點和弧的權值
                 i=LocateVertex(*N,v1);
                 j=LocateVertex(*N,v2);
                 N->arc[i][j].adj=w; 
              } 
              N->kind=DN;//有向圖 
}
int LocateVertex(MGraph N,VertexType v)
{
    int i;
    for(i=0;i<N.vexnum;i++)
       if(strcmp(N.vex[i],v)==0)//在頂點向量中查找頂點v,找到返回在向量的序號,否則返回-1 
    return i;
    return -1;
}
void DestroyGraph(MGraph *N)//這裏一直報錯
/*銷燬網N*/
{ 
    int i,j;
    for(i=0;i<N->vexnum;i++)                /*釋放弧的相關信息*/
        for(j=0;j<N->vexnum;j++)
            if(N->arc[i][j].adj!=INFINITY)  /*如果存在弧*/
                if(N->arc[i][j].info!=NULL)
    {
        free(N->arc[i][j].info);
        N->arc[i][j].info=NULL;
    }
    N->arcnum=0;//弧的數目置0 
    N->vexnum=0;//頂點數目置0 
}
void DisplayGraph(MGraph N)
{
    int i,j;
    cout<<"有向網具有"<<N.vexnum<<"個頂點"<<N.arcnum<<"條弧,頂點依次是: " ;
    for(i=0;i<N.vexnum;++i )
    cout<<N.vex[i]<<" ";
    cout<<endl<<"有向網N的:"<<endl;
    cout<<"頂點 ";
    for(i=0;i<N.vexnum;i++)
    cout<<setw(7)<<N.vex[i];
    cout<<endl;
    for(i=0;i<N.vexnum;i++)
    {
    cout<<setw(6)<<N.vex[i];
    for(j=0;j<N.vexnum;j++)
    cout<<setw(7)<<N.arc[i][j].adj;
    cout<<endl; 
    }   
}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章