#include "stdio.h"
#include "malloc.h"
#define OK 0
#define TRUE 1
#define MAX 20
#define FALSE 0
#define OVERFLOW 0
typedef char VertexType;
typedef int InfoType;
typedef int VRType;
typedef struct ArcCell{
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix;
typedef struct {
VertexType vex[MAX];
AdjMatrix arcs[MAX][MAX];
int vexnum,arcnum;
}MGraph; // 邻接矩阵
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode;
typedef struct{
VNode vertices[MAX];
int arcnum,vexnum;
}ALGraph,*ALG; //邻接表
int visit[MAX]={0};
/*****************************函数定义*************************************/
//邻接表
void Createadj(ALG &p,MGraph g) //邻接表结构
{
int i,j;
ArcNode *q;
p=(ALGraph *)malloc(sizeof(ALGraph)); //创建首元素
p->vexnum=g.vexnum; //存入点个数
for(i=0;i<p->vexnum;i++)
{
p->vertices[i].firstarc=0; //将点的表示记录如邻接表
p->vertices[i].data=g.vex[i];
}
for(i=0;i<p->vexnum;i++)
for(j=p->vexnum-1;j>=0;j--)
{
if(g.arcs[i][j].adj!=0)
{
q=(ArcNode *)malloc(sizeof(ArcNode)); //每次将新加入的点添加在头部
q->adjvex=j;
q->nextarc=p->vertices[i].firstarc;
p->vertices[i].firstarc=q;
p->arcnum++;
}
}
}
void displayALGraph(ALG G) //邻接表的显示
{
ArcNode *p;
int i;
char d;
printf("\n以下为邻接表\n");
for(i=0;i<G->vexnum;i++)
{
printf("%c -> ",G->vertices[i].data); //显示头节点的值
p=G->vertices[i].firstarc;
while(p!=NULL) //////////有问题
{
d=p->adjvex+'A';
printf("%c -> ",d); //显示下一个元素
p=p->nextarc;
}
printf("\n");
}
printf("\n");
}
void DFS(ALG g,int v)
{
ArcNode *p;
char show=v+'A';
visit[v]=1;
printf("%c",show);
p=g->vertices[v].firstarc;
while(p!=0){
if(visit[p->adjvex]==0)
DFS(g,p->adjvex);
p=p->nextarc;
}
}
//////////////////////////////////////////////////////////////////////
//临界矩阵
int CreatUDN(MGraph &G)
{
char v1,v2;
int i,j,k,w;
printf("请输入有向网的节点,弧的个数\n");
scanf("%d",&G.vexnum);
printf("\n");
scanf("%d",&G.arcnum);
printf("请输入定点向量\n"); //输入节点的名字如A,B,C
for(i=0;i<G.vexnum;i++)
{
scanf("%s",G.vex);
getchar();
break;
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=0; //对所有节点初始化
for(k=0;k<G.arcnum;k++)
{
printf("输入对应一条边以及依附的节点\n"); //输入依附的一条边及节点
printf("头为\n");
scanf("%c",&v1);
getchar();
printf("尾为\n");
scanf("%c",&v2);
getchar();
printf("权值为\n");
scanf("%d",&w);
getchar();
i=v1-'A'; //相当于取得节点在数组中的位置loacate()
j=v2-'A'; //相当于取得节点在数组中的位置loacate()
G.arcs[i][j].adj=w;
G.arcs[j][i]=G.arcs[i][j]; //无向图是对称的如果是有向图就去掉这句
}
return OK;
}
void displayMGraph(MGraph G)
{
char c,d;
int i,j;
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
printf("%d",G.arcs[i][j].adj); //以矩阵的形式输出联系关系
printf("\n");
}
printf("\n");
printf("以下为指向关系\n");
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
if(G.arcs[i][j].adj!=0)
{
c=i+'A'; //以A->B的形式输出链接关系
d=j+'A';
printf("%c -> %c %d\n",c,d,G.arcs[i][j].adj);
}
}
////////////////////////////////////////////////////////////////////////////////////
//函数结束
int main()
{
MGraph a;
ALG g;
/* int j;
printf("请输入要创建的结构(1)无向图\n(2)有向图\n(3)无向网\n(4)有向网\n");
scanf("%d",&j);*/
CreatUDN(a);
displayMGraph(a);
printf("%s",a.vex);//OK
Createadj(g,a);
displayALGraph(g);
printf("\n");
printf("深度优先遍历是\n");
DFS(g,0);
printf("\n");
return 1;
}