图的邻接表结构

1.首先是变量声明和定义
#define OK 1
#define ERROR -1
#define MAX_VERTEX_NUM 20          //顶点个数最大值为20
#define INFINITY    INT_MAX        //权值的最大值∞
typedef int Status;
typedef char VexType;
2.图的存储结构初始化
/* ------------ 边结点 -------------*/
typedef struct ArcNode
{
    struct ArcNode *nextarc;       //指向下一条边的指针    
    int adjvex;                    //该边所连接的顶点的位置
}ArcNode;

/* ------------ 顶点结点 -------------*/
typedef struct
{
    ArcNode *firstarc;              //该顶点指向的第一条边
    VexType data;                   //顶点的数据
}VNode,AdjList[MAX_VERTEX_NUM];     //邻接表的顶点使用一维数组

/* ------------ 邻接表图的存储结构 -------------*/
typedef struct
{
    AdjList vertices;               //图的顶点
    int vexnum, arcnum;             //图的顶点数和弧数
}ALGraph;
3.在构造好图的邻接表存储结构后,便可以对有向图(网)和无向图(网)的算法

邻接表无向图的构建方法:
1.输入顶点数和边数
2.建立定点表。
依次输入顶点的信息存入顶点表中,
使每个表头结点的指针域初始化为NULL
3.创建邻接表。
依次输入每条边依附的两个顶点
确定两个顶点的序号i和j,建立边结点
将此边结点分别插入到vi和vj对应的两个边链表的头部(使用链表的头插法)

/*---------------无向图的构造,用邻接表表示------------*/
Status CreateUDG(ALGraph &G)
{
    printf("请输入顶点数目:");
    scanf("%d", &G.vexnum);
    printf("请输入弧的数目:");
    scanf("%d", &G.arcnum);
    int i,j,k;
    VexType v1, v2;
    for (i = 0; i < G.vexnum; i++)             //输入各点,构造表头结点表
    {
        getchar();
        printf("正在创建顶点表,请输入顶点信息:\n");
        scanf("%c", &G.vertices[i].data);      //输入顶点值
        G.vertices[i].firstarc = NULL;         //初始化表头结点的指针域
    }
    for (k = 0; k < G.arcnum; k++)    
    {
        getchar();        
        printf("正在连接各个顶点,请输入弧的信息:\n");   
        printf("请输入这条边所依附的一个顶点:  ");
        scanf("%c",&v1);
        getchar();
        printf("请输入该边的另一个顶点:  ");
        scanf("%c",&v2);
        printf("\n");
        i = Locate(G, v1);                 //求顶点v1在顶点表中的编号
        j = Locate(G, v2);                 //求顶点v2在顶点表中的编号  
        //采用头插法建表
        ArcNode *p1,*p2;                   //使用指向边结点的指针p来进行链表连接
        p1 =new ArcNode;                   //p1是从v1结点到v2的弧
        p1->adjvex = j;
        p1->nextarc = G.vertices[i].firstarc;
        G.vertices[i].firstarc = p1;        //将新结点*p1插入到顶点vi的边表头部
        p2 =new ArcNode;                   //p2是从v2结点到v1的弧
        p2->adjvex = i;
        p2->nextarc = G.vertices[j].firstarc;
        G.vertices[j].firstarc = p2;       //将新结点*p2插入到顶点vj的边表头部
    }
    return OK;
}

若构建有向图,则只需要构建出度边的邻接表即可,即只需建立以vi为弧尾的边的结点

4.使用递归法实现深度遍历DFS
/*----------深度遍历判断两顶点间是否存在边-----------*/
void DFS(ALGraph G, int i, int j,bool &found)
{
	ArcNode *p;
	visited[i] = true;
	if (i == j)
		found = true;
	else
	{
		p = G.vertices[i].firstarc;
		while(!found && p != NULL)
		{
			if(!visited[p->adjvex])
				DFS(G, p->adjvex, j, found);            
			p = p->nextarc;
		}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值