数据结构——图的邻接表

#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 
			 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值