#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;
}
}
完整版鄰接表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.