ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构_链表及邻接表

2020-06-25 13:53:33  阅读:216  来源: 互联网

标签:head idx int void ne 链表 ++ 邻接 数据结构


单链表

两种形式

结构体形式 : 申请新节点太慢

struct List {
    int data;
    List *next;
}

数组模拟

代码模板
const int N = 1e6 + 10;
int e[N], ne[N], head, idx;

// 初始化:head存的是头结点下标,用idx分配空间
void init() {
    head = -1; idx = 0;
}
// 头插法
void add_to_head(int x) {
    e[idx] = x;
    n[idx] = head;
    head = idx;
    idx++;
}
// 删除节点
void del(int k) {
    n[k] = n[n[k]];
}
// 在第k个插入的数后插入一个数
void add(int k, int x) {
    e[idx] = x;
    n[idx] = n[k];
    n[k] = idx;
    idx++;
}
void display() {
    for(int i = head; i != -1; i = ne[i)
        printf("%d ", e[i]);
}

双链表(用于优化)

代码模板

const int N = 1e6 + 10;
int e[N], l[N], r[N], idx;

void insert(int a, int x) {
    e[idx] = x;
    l[idx] = a, r[idx] = r[a];
    l[r[a]] = idx, r[a] = idx ++ ;
}

// 删除节点a
void remove(int a) {
    l[r[a]] = l[a];
    r[l[a]] = r[a];
}

邻接表

代码模板

const int N = 1e6 + 10;
int e[N], ne[N], h[N], idx;

void init() {
    memset(h, -1, sizeof h);
    idx = 0;
}

// 加边:(a, b)表示由a指向b
void add(int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

// 遍历: 表示以ver指向的节点
void travel(int r) {
    for(int i = h[ver]; i != -1; i = ne[i])
        printf("%d", e[i]);
}

标签:head,idx,int,void,ne,链表,++,邻接,数据结构
来源: https://www.cnblogs.com/Hot-machine/p/13191622.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有