【数据结构实验】图(二)将邻接矩阵存储转换为邻接表存储

文章目录

  • [1. 引言](#1. 引言)
  • [2. 邻接表表示图的原理](#2. 邻接表表示图的原理)
    • [2.1 有向权图](#2.1 有向权图)
    • [2.2 无向权图](#2.2 无向权图)
    • [2.3 无向非权图](#2.3 无向非权图)
    • [2.1 有向非权图](#2.1 有向非权图)
  • [3. 实验内容](#3. 实验内容)
  • [4. 实验结果](#4. 实验结果)

1. 引言

  图是一种常见的数据结构,用于表示对象之间的关系。在图的表示方法中,邻接表是一种常用的形式,特别适用于稀疏图。

本实验将介绍如何使用邻接表表示图,并通过C语言实现图的邻接表创建。

2. 邻接表表示图的原理

  邻接表是一种图的表示方法,其中每个顶点都与一个链表相关联,链表中包含了与该顶点相邻的所有顶点。对于有向图,邻接表中的链表表示了每个顶点的出边。

  在邻接表中,顶点由一个结构体表示,包含顶点的名称(或编号)以及指向与该顶点相邻的第一个顶点的指针。每个相邻的顶点由一个链表节点表示,包含相邻顶点的编号以及指向下一个相邻顶点的指针。

2.1 有向权图

2.2 无向权图

2.3 无向非权图

2.1 有向非权图

3. 实验内容

3.1 实验题目

  将邻接矩阵存储转换为邻接表存储

(一)数据结构要求

  邻接表中的顶点表用Head 数组存储,顶点表中元素的两个域的名字分别为 VerNameAdjacent,边结点的两个域的名字分别为 VerAdjlink。边链表中的边结点按照顶点序号从小到大的顺序存储。

(二)输入要求

c 复制代码
{0,1,1,1,1,0,0},
{0,0,1,1,0,0,0},
{1,0,0,0,0,0,0},
{0,0,1,0,0,0,0},
{0,0,0,0,0,1,1},
{0,0,0,0,0,0,1},
{0,0,0,0,0,0,0}

(三)输出要求

按照顶点编号从小到大的顺序,依次输出每个顶点的边链表。形如:

"顶点 0 的边链表为:1->2->3->4->5->6->7->8"

3.2 算法实现

c 复制代码
#include<stdio.h>
#include<stdlib.h>
#define N 7
int A[N][N]={
    {0,1,1,1,1,0,0},
    {0,0,1,1,0,0,0},
    {1,0,0,0,0,0,0},
    {0,0,1,0,0,0,0},
    {0,0,0,0,0,1,1},
    {0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0}
};
typedef struct P{
    int VerAdj ;
    struct P *link;
}P;
typedef struct Q{
    int VerName;
    P *Adjacent;
}Q;
typedef struct{
    Q Head[20];
}Graph;
void Create(Graph *g)
{
    int i,j,n,t;
    for(i=0;i<N;i++)
    {
        g->Head[i].VerName=i;
        g->Head[i].Adjacent=NULL;
        P *p=(P*)malloc(sizeof(P));
        t=0;
        for(j=0;j<N;j++){
            if(A[i][j]){
                if(t==0){
                    //printf("%d&%d ",A[i][j],j);
                    g->Head[i].Adjacent=p;
                    p->VerAdj =j;
                    p->link=NULL;
                    t=1;
                }
                else{
                    //printf("%d&%d ",A[i][j],j);
                    P *q=(P*)malloc(sizeof(P));
                    q->VerAdj =j;
                    q->link=NULL;
                    p->link=q;
                    p=q;
                }
            }
        }
    }
}
void Output(Graph g)
{
    int i;
    for(i=0;i<N;i++)
    {
        printf("顶点%d的边链表为:",i);
        P *p=g.Head[i].Adjacent;
        while(p)
        {
            printf("%d",p->VerAdj );
            p=p->link;
            if(p) printf("--->");
        }
        printf("\n");
    }
}
int main()
{
    Graph g;
    Create(&g);
    Output(g);
}

4. 实验结果

相关推荐
caimouse6 分钟前
ReactOS 窗口系统分析(14):计时器/属性/加速键/热键 — timer.c + prop.c + accelerator.c + hotkey.c
c语言·开发语言·reactos
水饺编程14 分钟前
第5章,[Win32 章节] :贝塞尔样条曲线(一)
c语言·c++·windows·visual studio
Wang's Blog27 分钟前
PostgreSQL笔记49:向量检索核心算法、索引调优与过滤策略深度解析
笔记·算法·postgresql
疯狂打码的少年35 分钟前
【数据结构】交换类排序:冒泡与快速排序
数据结构·笔记·算法·排序算法
-凌凌漆-1 小时前
【C语言】结构体typedef struct与struct的区别
c语言·开发语言
Nil2081 小时前
leetcode 108有序数组转换为二叉搜索树
数据结构·算法·leetcode
高频因子挖掘机1 小时前
QuantDash 成交量单位统一实战:从“手”到“股”的跨市场量化数据清洗全流程
后端·算法·github
hn小菜鸡1 小时前
LeetCode 763、划分字母区间
数据结构·算法·leetcode
caimouse1 小时前
ReactOS 窗口系统分析(24):输入法 — ime.c
c语言·reactos
Escalating_xu1 小时前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法