#include<stdio.h>
#include<stdlib.h>
#define Ok 1
#define Error 0
#define MAX 20
typedef int Status ;
typedef char VertexType ;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc; //指向下一个弧的指针
int *info; //该弧相关信息的指针
}ArcNode;
typedef struct VNode {
VertexType data; //顶点的信息
ArcNode *firstarc; //指向第一条在该点的弧的指针
}VNode,AdjList[MAX];
typedef struct{
AdjList vertices; //记录节点的数组
int vexnum,arcnum; //记录图的相关的顶点数和弧度数
}ALGraph;
Status Initatmap(ALGraph &m)//初始化图
{
m.arcnum=0;
m.vexnum=0;
m.vertices[0].data=0;
m.vertices[0].firstarc=NULL;
return Ok;
}
void initatarcnode(ArcNode &a)
{
a.adjvex=0;
a.nextarc=NULL;
}
Status InsertNode(ALGraph &m)//插入节点
{
char ch;
printf("请输入您想要插入的图的节点名字");
ch=getchar();
getchar();
m.vertices[m.vexnum].data=ch;
m.vertices[m.vexnum].firstarc=NULL;
printf("插入节点成功,插入的节点为:%c\n",m.vertices[m.vexnum].data);
m.vexnum++;
return Ok;
}
Status InsertArc(ALGraph &m)//插入弧的信息
{
char ch1,ch2;
int i,j;
ArcNode *p,*n;
p=n=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=0;p->nextarc=NULL;
n->adjvex=0;n->nextarc=NULL;
printf("请输入您想要连接的一个主要节点 :");
ch1=getchar();
getchar();
for(i=0;i<m.vexnum;i++)
{
if(m.vertices[i].data==ch1)
break;
}
printf("请分别输入该节点所连接的所有的节点(输入0结束)\n");
ch2=getchar();
getchar();
while(ch2!='0')
{
for(j=0;j<m.vexnum;j++)
{
if(m.vertices[j].data==ch2)
break;
}
/*if(m.vertices[i].firstarc==NULL)
{
m.vertices[i].firstarc=p;
n=m.vertices[i].firstarc;
m.arcnum++;
}
else
{
n->nextarc=p;
n=n->nextarc;
m.arcnum++;
}*/
p->adjvex=j;
p->nextarc=m.vertices[i].firstarc;
m.vertices[i].firstarc=p; //这两句其实就是链表在中间进行插入一个节点时所用的语句
ch2=getchar();
getchar();
p=(ArcNode*)malloc(sizeof(ArcNode));//存储新的胡信息
}
return Ok;
}
Status Show(ALGraph &m) //输入一个节点,然后看与他相连的有那几个节点
{
char ch;int i,j;
ArcNode *p;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=0;p->nextarc=NULL;
printf("请输入您想要查找的节点所邻接的节点");
ch=getchar();
getchar();
for(i=0;i<m.vexnum;i++)
{
if(m.vertices[i].data==ch)
break;
}
printf("{0}节点相连的节点有:",m.vertices[i].data);
p= m.vertices[i].firstarc;
while(p!=NULL)
{
printf("%c",m.vertices[p->adjvex]);
p=p->nextarc;
}
return Ok;
}
void main ()
{
char i;
ALGraph m;
Initatmap(m);
bool j=true;
while(j)
{
printf("您想要干什么\n");
printf("1.在图中插入根节点的名字\n");
printf("2.输入您想要连接的两个节点\n");
printf("3.查看节点\n");
printf("0.按零结束\n");
i=getchar();
getchar();
switch(i)
{
case '0':
j=false;
break;
case '1':
InsertNode(m);
break;
case'2':
InsertArc(m);
break;
case'3':
Show(m);
break;
}
}
}
//算法分析:图的连接表表示方法用的是静态链表和普通链表相结合的方式来存储图的信息,用普通链表来存储相连节点的信息
图算法------图的邻接表表示法(图的链式存储)
最新推荐文章于 2023-03-23 17:24:34 发布