#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
#define MVNum 20 //最大顶点数
typedef char VertexType; //顶点类型
typedef int InfoType; //权值类型
typedef struct ArcNode{
int adjvex; //该边所指向的顶点的位置
InfoType weight; //权(和边相关的信息)
struct ArcNode *nextarc; //指向下一条边的指针(递归结构体)
}ArcNode;//边结点
typedef struct VNode{
VertexType data; //顶点值
ArcNode *firstarc; //一个指针,指向以该点为起始点的第一条边
}VNode, AdjList[MVNum]; //表头结点 ,AdjList代表邻接表的类型
typedef struct {
int kind; //图的类型
int vexnum,arcnum; //图的顶点数、边数
VNode vertices[MVNum]; //顶点向量表(重点),每个元素是顶点结点
}ALGraph; //图
#define MAXQSIZE 100
typedef char QElemType;
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
SqQueue Q;
//顶点查找函数,返回v在顶点数组中的下标
int LovateVex(ALGraph G,VertexType v){
int i;
for (i=0;i<G.vexnum ;i++)
if ( G.vertices[i].data==v ) return i;//找到则返回该位置的对应下标
return -1; //找不到则返回-1
}
//创建无向网
Status CreateUDN(ALGraph &G){
int i,j,k;
VertexType v1,v2;
InfoType w;
ArcNode *p,*q;
cout<<endl<<"输入图的顶点数和边数:";
cin>>G.vexnum>>G.arcnum;
cout<<endl<<"输入图的顶点信息:";
for (i=0;i<G.vexnum;i++) {
cin>>G.vertices[i].data; //输入顶点信息
G.vertices[i].firstarc=NULL; //初始化每个顶点的邻接表(为空)
}
cout<<endl<<"输入边:(v1,v2,weight)"<<endl; //输入各边,构造邻接表
for (k=0;k<G.arcnum;k++)
{
cout<<"\n第"<<k+1<<"条边:" ;
cin>>v1>>v2>>w; //输入一条边依附的两个结点
i=LovateVex(G,v1); //确定v1,v2在图中的位置,即顶点在G.vertices中的编号
j=LovateVex(G,v2);
if (i==-1 ||j==-1) {
cout<<"\n顶点有误,程序退出!";
return ERROR;
}
p=new ArcNode; //生成一个新的边结点*p
p->adjvex=j; //邻接点序号为j
p->weight=w; //该边对应的权为w
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p; //用头插法将*p插入顶点v1的边表中
q=new ArcNode; //成另一个对称新的边结点*q
数据结构——图的邻接表
最新推荐文章于 2024-08-26 14:47:11 发布