十字链表的应用

简介:


#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;
}

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

*/


目录
相关文章
|
25天前
|
机器学习/深度学习 SQL
环形链表详解
环形链表详解
|
2月前
|
索引
07_环形链表
07_环形链表
|
6月前
|
存储
环形链表题
环形链表题
35 0
|
6月前
|
存储 算法 C语言
十字链表法,十字链表压缩存储稀疏矩阵详解
十字链表法,十字链表压缩存储稀疏矩阵详解
142 0
十字链表法,十字链表压缩存储稀疏矩阵详解
|
6月前
|
C++
相交链表(C++)
相交链表(C++)
42 0
【链表】160. 相交链表
【链表】160. 相交链表
|
6月前
|
算法 程序员
【算法训练-链表 三】【特殊链表】环形链表、环形链表II、回文链表、相交链表
【算法训练-链表 三】【特殊链表】环形链表、环形链表II、回文链表、相交链表
52 0
|
C语言 索引 Windows
LeetCode ——160. 相交链表,142. 环形链表 II
✅<1>主页:C语言的前男友 📃<2>知识讲解:LeetCode经典链表笔试题目 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 🏡<5>系统环境:Windows 10 💬<6>前言:今天来讲解几个经典的链表题目,链接已经给出大家可以挑战一下。
|
C++ 索引
【手撕力扣链表题】 环形链表,相交链表 (4/98)
【手撕力扣链表题】 环形链表,相交链表 (4/98)
73 0