zoukankan      html  css  js  c++  java
  • 数据结构——单链表

    一、线性表

    1、线性表的定义及运算

    线性表是信息表的一种形式,表中数据元素之间满足线性关系(或线性结构),是一种最基本、最简单的数据结构类型。

    线性表的定义是描述其逻辑结构,而运算是讨论在线性表上进行的查找、插入、删除等操作。

    2、线性表的特征
    对非空表,a0是表头,无前驱;
    an-1是表尾,无后继;
    其它的每个元素ai有且仅有一个直接前驱(ai-1)和一个直接后继(ai+1)。

    二、链表

    1、链表的定义

    线性表的链式存储结构,即链表。

    将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立它们之间的联系,所得到的存储结构为链表结构。表中元素ai的结点形式如图所示:image

    其中,结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。于是,线性表L=( a0,a1,……,an-1)的结构如图所示:

    image

    2、结点类型描述

    typedef int data_t;
    typedef struct node_t
    { data_t data; //结点的数据域//
    struct node_t *next; //结点的后继指针域//
    }linknode_t, *linklist_t;

    若说明linknode_t A;linklist_t p = &A;则结构变量A为所描述的结点,而指针变量p为指向此类型结点的指针(p的值为结点的地址),如图所示:image

    3、结点的获取

    设p指向链表中结点ai,如图所示:image,获取ai,写作:p->data;而取ai+1,写作:p->next->data。另外,若指针p的值为NULL,则它不指向任何结点,此时取p->data或p->next是错误的。可调用C语言中malloc()函数向系统申请结点的存储空间,例如:linklist_t p;p = (linklist_t)malloc(sizeof(linknode_t));则创建一个类型为linknode_t的结点,且该结点的地址已存入指针变量p中:image

    4、建立单链表
    算法思路:依次读入表L=(a0,.....,an-1)中每一元素ai(假设为整型),若ai≠结束符(-1),则为ai创建一结点,然
    后插入表尾,最后返回链表的头结点指针H。

    5、链表查找
    a、按序号查找:实现GetLinklist(h, i)运算。
    算法思路:从链表的a0起,判断是否为第i结点,若是则返回该结点的指针,否则查找下一结点,依次类推。

    b、按值查找(定位) : 即实现Locate(h, x)。
    算法思路:从链表结点a0起,依次判断某结点是否等于x,若是,则返回该结点的地址,若不是,则查找下一结点a1,依次类推。若表中不存在x,则返回NULL。

    6、链表的插入:即实现InsertLinklist(h, x, i,)。将x插入表中结点ai之前的情况。
    算法思路:调用算法GetLinklist(h, i-1),获取结点ai-1的指针p(ai 之前驱),然后申请一个q结点,存入x,并将
    其插入p指向的结点之后。

    7、链表的删除:即实现DeleteLinklist(h, i), 算法对应的链表结构如图2.15所示。
    算法思路:同插入法,先调用函数GetLinklist(h, i-1),找到结点ai的前驱,然后将结点ai删除之。

    8、单链表H倒置
    算法思路:依次取原链表中各结点,将其作为新链表首结点插入H结点之后。

  • 相关阅读:
    SOJ 3531_Number Pyramids
    TYVJ P1047 乘积最大 Label:dp
    TYVJ P1067 合唱队形 Label:上升子序列?
    TYVJ P1093 验证数独 Label:none
    TYVJ P1088 treat Label:鞭笞人的DP
    TYVJ P1008 传球游戏
    表达式系列问题
    数字三角形系列 系列问题
    TYVJ P1024 外星人的密码数字
    TYVJ P1056 能量项链 Label:环状区间DP
  • 原文地址:https://www.cnblogs.com/sanwumanzi/p/10557986.html
Copyright © 2011-2022 走看看