图的邻接表实现

以前邻接表都用vector,今天学习了下一种手写的邻接表,学会后也挺方便的。

传上来和大家分享~~。

#include <stdio.h>
#include <string.h>

#define CLR(arr,val) memset(arr,val,sizeof(arr))

#define Max_n 100005
#define Max_e 10005

struct Vertex
{
    int head;    //head记录某点的的信息,即从E中的哪个下标开始
}V[Max_n];

struct Edge
{
    int v,w;     //v表示连接点的编号,w表示此边的权值
    int next;    //next负责连接和此点相关的边
}E[Max_e];

int top;         //top记录已用E的个数,且保证每个E独立

void Init()
{
    top = 0;
    CLR(V,-1);
}

void Add_edge(int u,int v,int w)    //演示如何添加边
{
    E[top].v = v;
    E[top].w = w;
    E[top].next = V[u].head;  //链表的头插法
    V[u].head = top++;        //链表的头指针改为此边编号
}

void dfs(int x)                     //演示如何遍历
{
    for(int i = V[x].head; i != -1;i = E[i].next)//i为边在E中的编号
    {
        int v = E[i].v;
        int w = E[i].w;
    }
}

写成模板,用着更爽。

#include <stdio.h>
#include <string.h>

template<int N,int M>
struct Graph
{
    int top;
    struct Vertex{
        int head;
    }V[N];
    struct Edge{
        int v,next;
    }E[M];
    void init(){
        memset(V,-1,sizeof(V));
        top = 0;
    }
    void add_edge(int u,int v){
        E[top].v = v;
        E[top].next = V[u].head;
        V[u].head = top++;
    }
};

Graph<1000,10000> g;

int main()
{
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值