#include "stdio.h"
#define MAXSIZE 100
struct ArcNode
{
int adjvex; //该弧所指向节点的位置
struct ArcNode *next; //指向下一个弧节点
int weight; //权值
};
struct VNode
{
char data; //顶点的值
struct ArcNode *firstArc; //指向该节点的第一个弧
};
struct Graph
{
struct VNode vexs[MAXSIZE]; //顶点数组
int vexnum,arcnum; //当前弧和顶点的个数
};
main()
{
struct Graph ALGraph; //创建一个图
int quit=0;
ALGraph.vexnum=0; //初始化图的当前节点和弧的个数
ALGraph.arcnum=0;
while(!quit) //菜单显示
{
char ch;
clrscr();
puts("1 插入图节点");
puts("2 插入弧");
puts("3 察看节点信息");
puts("4 察看节点的度");
puts("5 退出");
ch=getch();
switch(ch)
{
case '1':InsertVex(&ALGraph);break;
case '2':InsertArc(&ALGraph);break;
case '3':ShowVexs(&ALGraph);break;
case '4':ShowDepth(&ALGraph);break;
case '5':quit=1;break;
}
}
}
InsertVex(struct Graph *ALGraph) //插入顶点
{
char ch;
struct ArcNode *p;
clrscr();
printf("请输入节点信息:");
ch=getche();
ALGraph->vexs[ALGraph->vexnum].data=ch; //为该节点数据域赋值
p=(struct ArcNode *)malloc(sizeof(struct ArcNode)); //为新节点开辟内存单元
ALGraph->vexs[ALGraph->vexnum].firstArc=p; //让该节点的第一个弧的指针域指向该内存单元
p->next=NULL; //先令该指针的NEXT域指向NULL
ALGraph->vexnum++; //当前节点计数加一
puts("/n插入成功");
getch();
}
InsertArc(struct Graph *ALGraph) //插入弧
{
char node1,node2;
int weight,i,j;
struct ArcNode *p1,*p2;
clrscr();
printf("请输入弧的相关信息:");
node1=getche();
node2=getche();
scanf("%d",&weight);
for(i=0;i<ALGraph->vexnum;i++) //找到第一个输入节点的位置
if(node1==ALGraph->vexs[i].data)
break;
for(j=0;j<ALGraph->vexnum;j++) //找到第二个输入节点的位置
if(node2==ALGraph->vexs[j].data)
break;
p2=(struct ArcNode *)malloc(sizeof(struct ArcNode)); //为新的弧节点开辟内存单元
p1=ALGraph->vexs[i].firstArc; //先让p1指向该节点的第一个弧
while(p1->next!=NULL)
p1=p1->next; //让p1找到该节点的原先最后一个弧节点处,并指向它
p2->adjvex=j; //对新的弧节点的各个元素进行赋值
p2->weight=weight;
p2->next=NULL;
p1->next=p2; //让原先的最后一个弧节点的next指向新的弧节点
ALGraph->arcnum++; //让当前的弧计数加一
puts("插入成功");
getch();
}
ShowVexs(struct Graph *ALGraph) //显示各个顶点的状态
{
int i;
struct ArcNode *p;
clrscr();
for(i=0;i<ALGraph->vexnum;i++)
{
printf("第%d个节点:%c/n",i+1,ALGraph->vexs[i].data);
puts("该节点的邻接表:");
p=ALGraph->vexs[i].firstArc;
p=p->next;
while(p)
{
printf("指向节点:%5d 权值:%5d/n",p->adjvex+1,p->weight);
p=p->next;
}
}
getch();
}
ShowDepth(struct Graph *ALGraph) //计算指定节点的度
{
int i,j;
struct ArcNode *p;
char ch;
int indegree=0,outdegree=0; //先初始化入度计算和出度计数为0
clrscr();
printf("请输入要察看的节点:");
ch=getche();
for(i=0;i<ALGraph->vexnum;i++) //找到输入顶点的位置
if(ch==ALGraph->vexs[i].data)
break;
p=ALGraph->vexs[i].firstArc; //让p指向该顶点的第一个弧节点处
p=p->next;
while(p) //计算该顶点的出度
{
p=p->next;
outdegree++;
}
for(j=0;j<ALGraph->vexnum;j++) //查找所有邻接表,计算该顶点的入度
{
p=ALGraph->vexs[j].firstArc;
p=p->next;
while(p)
{
if(p->adjvex==i)
indegree++;
p=p->next;
}
}
printf("/n该节点的出度为%d 入度为%d 度为%d",outdegree,indegree,outdegree+indegree);
getch();
}