数据结构复习之十字链表的应用

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define MAX_VERTEX_NUM 20
using namespace std;
typedef struct ArcBox{
    int tailVex, headVex;//该弧的尾和头顶点的位置
    struct ArcBox *hlink, *tlink;//分别为弧头相同和弧尾相同的弧的链域
    ArcBox(){
        hlink = NULL;
        tlink = NULL;
    }
} ArcBox; 

typedef struct VexNode{
    int data;
    ArcBox *firstin, *firstout;
    VexNode(){
        firstin = NULL;
        firstout = NULL;
    }
} VexNode; 

typedef struct{
    VexNode xlist[MAX_VERTEX_NUM];
    int vexnum, arcnum;
} OLGraph;

void buildG(OLGraph &g, int u, int v){
    ArcBox *p = new ArcBox;
    /*
        或者, new 方式可以调用类的构造函数
        ArcBox *p = (ArcBox *)malloc(sizeof(ArcBox));
        p->hlink = NULL;
        p->tlink = NULL;
    */
    p->tailVex = u;
    p->headVex = v;
    if(g.xlist[u].firstout == NULL){//在弧尾的地方插入
        g.xlist[u].firstout = p;
    } else {
        ArcBox *tmp = g.xlist[u].firstout;
        while(tmp->tlink) tmp = tmp->tlink;//找到和u节点相关的最后一个弧尾
        tmp->tlink = p;
    }

    if(g.xlist[v].firstin == NULL){//在弧头的地方插入
        g.xlist[v].firstin = p;
    } else {
        ArcBox *tmp = g.xlist[v].firstin;
        while(tmp->hlink) tmp = tmp->hlink;//找到和u节点相关的最后一个弧头
        tmp->hlink = p;
    }
}

void inG(OLGraph g){
    printf("从每一个节点出度方向遍历弧\n");
    for(int i=1; i<=g.vexnum; ++i){
        ArcBox *tmp = g.xlist[i].firstout;//找到弧尾节点为i的第一个节点
        printf("节点 %d:\n");
        while(tmp) {
            printf("弧 %d %d\n", tmp->tailVex, tmp->headVex);
            tmp = tmp->tlink;
        }
    }
}

void outG(OLGraph g){
    printf("每一个节点的入度方向遍历弧\n");
    for(int i=1; i<=g.vexnum; ++i){
        ArcBox *tmp = g.xlist[i].firstin;//找到弧头节点为i的第一个节点
        printf("节点 %d:\n");
        while(tmp) {
            printf("弧 %d %d\n", tmp->tailVex, tmp->headVex);
            tmp = tmp->hlink;
        }
    }
}

int main(){
    printf("请输入图的节点的个数和图的弧数:\n");
    OLGraph g;
    scanf("%d %d", &g.vexnum, &g.arcnum);
    printf("请输入图的弧:\n");
    for(int i=0; i<g.arcnum; ++i) {
        int u, v;
        scanf("%d %d", &u, &v);
        buildG(g, u, v);
    }
    //遍历方式,1.从每一个节点出度方向遍历弧 2.从每一个节点的入度方向遍历弧
    inG(g);
    printf("*****************\n");
    outG(g);
    return 0;
}

/*
有向图测试数据:
4 7
1 2
4 2
4 1
1 3
3 1
3 4
4 3 

*/
时间: 2024-09-29 16:46:26

数据结构复习之十字链表的应用的相关文章

【算法与数据结构】图 -- 十字链表

图的[十字链表]表示法是一种链式存储结构,可以看成是[邻接表]和[逆邻接表]的组合 本文中用到的有向图 /************************************************************************ 有向图的存储:十字链表 有向图的十字链表存储结构,是有一种链式存储结构,可以看成是[邻接表]和[逆邻接表] 的结合. 图中每条弧对应一个[弧结点],每个顶点对应一个[顶点结点] 弧结点 -------------------------------

数据结构之---C++语言实现图的十字链表存储表示

最近一直忙着考研复习,很久都没有更新博客了,今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstdio> #include <stdlib.h> #include <cstring> using namespace std; #define MAX_VERTEX_NUM 20 #define OVERFLOW -2 #define OK 1 typedef int Status

7-3-有向图的十字链表存储结构-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向图的十字链表存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.LinkQueue.c        

看数据结构写代码(21) 稀疏矩阵(十字链表方式)

写完 这个样例,花费了 我不少时间.大部分时间 花费在 调试 内存问题上. 比如在销毁十字链表时.多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常. 当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去.free(p)的时候 ,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除._CrtIsValidHeapPointer(pUserData)  这个函数 正是 检查 这个空间是否 在链表里

javascript实现数据结构:稀疏矩阵的十字链表存储表示

当矩阵的非零个数和位置在操作过程中变化大时,就不宜采用顺序存储结构来表示三元组的线性表.例如,在作"将矩阵B加到矩阵A上"的操作时,由于非零元的插入或删除将会引起A.data中元素的移动.为此,对这种类型的矩阵,采用链式存储结构表示三元组的线性表更为恰当. 在链表中,每个非陵园可用一个含5个域的结点表示,其中i,j和e这3个域分别表示该非零元所在的行,列和非零元的值,向右域right用以链接同一行中下一个非零元,向下域down用以链接同一列中下一个非零元.同一行的非零元通过right域

数据结构之---C/C++实现稀疏矩阵的十字链表

首先这里介绍什么是矩阵的十字链表,大家可以理解稀疏矩阵是顺序存储的,那么这个就是链式存储的. 如图: 存储该矩阵 那么应该是如下的格式: 我们知道稀疏矩阵的三元组存储方式的实现很简单,每个元素有三个域分别是col,row, e.代表了该非零元的行号.列号以及值.那么在十字链表的存储方式下,首先这三个域是肯定少不了的,不然在进行很多操作的时候都要自己使用计数器,很麻烦.而十字链表的形式大家可以理解成每一行是一个链表,而每一列又是一个链表 通过上面的图我们可以知道,每个结点不止要存放row, col

看数据结构写代码(37) 图的十字链表的表示与实现

图的邻接表在 查找 有向图的 出度 很 方便,但是 在 查找 入度 时,需要遍历整个图.如果想要 方便的 查找 入度,需要 建立 逆邻接表.十字链表 正好 就是 邻接表 和 逆邻接表的集合.具体结构图如下: 感觉 十字链表 在 查找 入度时 方便 一些,其他 跟 邻接表没什么区别. 源代码 网盘地址:点击打开链接 代码如下: // CrossLinkGraph.cpp : 定义控制台应用程序的入口点. //有向图的十字链表表示法 #include "stdafx.h" #include

[数据结构]图,邻接多重表,十字链表

十字链表 你会发现,要表示一个有向图,因为有 出度 和 入度 ,需要两个邻接表:邻接表和逆邻接表. 其实我们可以把这两个表整合在一起,也就是十字链表(Orthogonal List). 我们依然需要构造一种结构体A,用结构体A的数组来存放所有顶点-我们其实可以把它叫做 顶点表. 我们构造的结构体A如下: data firstin firstout 构造结构体B,用结构体B来记录与这个顶点 用边邻接的 顶点的相关信息,我们把它叫做 边表. tailvex headvex headlink tail

数据结构复习

1.         以Niklus Wirth的观点,程序等于什么? =数据结构+算法 2.         算法的重要特性:确定.有穷.能行.输入.输出 3.         好算法的标准:正确.可读.健壮.高效低存贮 4.         数据结构主要研究对象:逻辑结构.存贮结构和运算(增删改查) 5.         数据的逻辑结构有几大类?(线性.非线性) 6.         数据的存贮结构有几类?(顺序.链式.索引.散列hash) 7.         对数据的最主要的操作:增删改