//_DataStructure_C_Impl:鄰接矩陣
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define INFINITY 10000 //定義一個無限大的值
#define MaxSize 50 //最大頂點個數
typedef enum{DG,DN,UG,UN}GraphKind; //圖的型別:有向圖、有向網、無向圖和無向網
typedef struct{
VRType adj; //對於無權圖,用1表示相鄰,0表示不相鄰。對於帶權圖,儲存權值
InfoPtr *info; //與弧或邊的相關資訊
}ArcNode,AdjMatrix[MaxSize][MaxSize];
//圖的型別定義
typedef struct{
VertexType vex[MaxSize]; //用於儲存頂點
AdjMatrix arc; //鄰接矩陣,儲存邊或弧的資訊
int vexnum,arcnum; //頂點數和邊(弧)的數目
GraphKind kind; //圖的型別
}MGraph;
//在頂點向量中查詢頂點v。找到返回在向量的序號。否則返回-1
int LocateVertex(MGraph N,VertexType v){
int i;
for(i=0;i<N.vexnum;++i)
if(strcmp(N.vex[i],v)==0)
return i;
return -1;
}
//採用鄰接矩陣表示法建立有向網N
void CreateGraph(MGraph *N){
int i,j,k,w,InfoFlag,len;
char s[MaxSize];
VertexType v1,v2;
printf("請輸入有向網N的頂點數,弧數,弧的資訊(是:1,否:0): ");
scanf("%d,%d,%d",&(*N).vexnum,&(*N).arcnum,&InfoFlag);
printf("請輸入%d個頂點的值(<%d個字元):\n",N->vexnum,MaxSize);
for(i=0;i<N->vexnum;++i) //儲存網的各個頂點
scanf("%s",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; //弧的資訊初始化為空
}
printf("請輸入%d條弧的弧尾 弧頭 權值(以空格作為間隔): \n",N->arcnum);
for(k=0;k<N->arcnum;k++){
scanf("%s%s%d",v1,v2,&w); //輸入兩個頂點和弧的權值
i=LocateVertex(*N,v1);
j=LocateVertex(*N,v2);
N->arc[i][j].adj=w;
if(InfoFlag){ //假設弧包括其他資訊
printf("請輸入弧的相關資訊: ");
gets(s);
len=strlen(s);
if(len){
N->arc[i][j].info=(char *)malloc((len+1)*sizeof(char));
strcpy(N->arc[i][j].info,s);
}
}
}
N->kind=DN; //圖的型別為有向網
}
//銷燬網N
void DestroyGraph(MGraph *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->vexnum=0; //將網的頂點數置為0
N->arcnum=0; //將網的弧的數目置為0
}
//
void DisplayGraph(MGraph N){
int i,j;
printf("有向網具有%d個頂點%d條弧。頂點依次是: ",N.vexnum,N.arcnum);
for(i=0;i<N.vexnum;++i) //輸出網的頂點
printf("%s ",N.vex[i]);
printf("\n有向網N的:\n"); //輸出網N的弧
printf("序號i=");
for(i=0;i<N.vexnum;i++)
printf("%8d",i);
printf("\n");
for(i=0;i<N.vexnum;i++)
{
printf("%8d",i);
for(j=0;j<N.vexnum;j++)
printf("%8d",N.arc[i][j].adj);
printf("\n");
}
}
void main(){
MGraph N;
printf("建立一個網:\n");
CreateGraph(&N);
printf("輸出網的頂點和弧:\n");
DisplayGraph(N);
printf("銷燬網:\n");
DestroyGraph(&N);
system("pause");
}