特殊的链表——双向、循环、静态

拈花ヽ惹草 提交于 2020-02-16 19:52:16

双向链表

定义 :每个节点有两个指针域,分别知道直接前驱直接后继节点 , 特点是可以重任意节点出发,从两个方向遍历链表

数据结构

typedef struct node {
    int data;
    struct node *font ;
    struct node *next;
} NODE, *LinkList;

在这里插入图片描述
插入

  // p 为链中节点  s 为待插入节点 把s 放在p前
    s->font = p->font ;  // s 的前驱在是 p 的前驱节点
    p->font->next = s ;  // p 前驱节点的 后继节点是 s
    s->next = p ;
    p->font =s ;

在这里插入图片描述
删除

    p->font->next = p->next ; // p 的前驱节点的后继 是 p 的后继节点
    p->next->font = p->font ; // p 的后继节点 的前驱节点 是 p 的前驱节点
    free(p) ;

循环链表

定义 :在单向或双向链表的基础上令表尾节点的指针指向第一个节点,构成循环

静态链表

定义 : 借数组来描述线性表的链式存储,用数组元素的下标表示元素所在节点的指针

在这里插入图片描述

指针域代表的下一个值得地址

数据结构

typedef struct node {
    int index; // 指针
    int data;
} NODE;

// 遍历

void showAll(NODE[] n) {
    int i = 0;
    while (true) {
        printf("%d\n", n[i].data);
        if (n[i].index == 0) { //  如果index 为 0 表示后面没有数据了 
            break;
        } else {
            i = n[i].index;
        }
    }
}

插入: 需要判断是否有新的空间
删除: 就需要标记

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!