struct arcnode
{//边节点
int vertext; //边上另外一个节点的存储位置
int weight; //边的权值
arcnode* next; //指向下一条边
};
struct node
{//存储节点的结构
int degree; //每个节点的度 或 入度
arcnode* first; //每个几点连接的第一条边
};
node adjlist[n0+1] ; //存储节点的列表
int adjmatrix[n0+1][n0+1]; //邻接矩阵
int n; //定点数
//设置连接矩阵 和 邻接链表
void setgraph()
{
int i; //开始点
int j; //终点
int k; //表示 有向/无向
int w; //权值
arcnode *p;
cout<<"1 无向图,2 有向图";
cin>>k;
cout<<"顶点数:";
cin>>n;
//邻接矩阵初始化
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
adjmatrix[i][j] = infinity; //infinity 表示不可达
}
adjmatrix[i][i] = 0; //
}//说明这个是一个带有权值的网络
//邻接表初始化
for(i=1;i<=n;i++)
{
adjlist[i].degree = 0;
adjlist[i].first = NULL;
}
cout<<"请输入边的集合";
cout<<"始点,终点,权值";
cin>>i>>j>>w; //
while((i>=1)&&(i<=n)&&(j>=1)&&(j<=n))
{//当i,j的范围都是正确的
//存入邻接矩阵
adjmatrix[i][j] = w;
if(k == 1)
{//如果是无向图
adjmatrix[j][i] = w;
}
//存入邻接表
p = adjlist[i].first ;//得到 指向 邻接表第1个边节点的指针
while((p)&&(p->vertext != j))
{//如果这条边不为空,并且这条边不是已经存储的话,继续向下寻找
p = p->next;
}
if(p == NULL)
{//如果p为空,说明这条边没有被存储过,如果p不为空,说明这条边已经被存储过
//插入一个边的节点,并且是逆向插入
p = new arcnode;
p->vertext = j;
p->weight = w;
p->next = adjlist[i]->first;
adjlist[i]->first = p;
++(adjlist[i].degree);
}
if(k == 1)
{//如果是无向图,也要把j,i,w录入到邻接表
p = adjlist[j].first ;//得到 指向 邻接表第1个边节点的指针
while((p)&&(p->vertext != i))
{//如果这条边不为空,并且这条边不是已经存储的话,继续向下寻找
p = p->next;
}
if(p == NULL)
{//如果p为空,说明这条边没有被存储过,如果p不为空,说明这条边已经被存储过
//插入一个边的节点,并且是逆向插入
p = new arcnode;
p->vertext = i;
p->weight = w;
p->next = adjlist[j]->first;
adjlist[j]->first = p;
++(adjlist[j].degree);
}
}
cin>>i>>j>>w;
}
}