用邻接表表示的有向网

#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();
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值