美文网首页
链式存储结构的线性表

链式存储结构的线性表

作者: 我有一只碗 | 来源:发表于2018-01-25 10:26 被阅读0次

单链表结构可用如下C语言代码描述

typedef struct Node
{
    ElemType data;
    struct Node *next;
} Node;

typedef struct Node *LinkList

建立链表操作

// 尾插法建立链表
// 操作结果:产生长度为size的正序链表并返回头指针
LinkList CreateListTail(int size)
{
    int count;
    // head为头节点,p为工作指针,q为临时指针
    LinkList head, p, q;
    // 先建立一个空的头节点
    head = (LinkList)malloc(sizeof(Node));
    head->data = 0;
    head->next = NULL;
    // 将工作指针指向头节点
    p = head;
    for (count = 0; count < size; count++)
    {
        // 临时指针创建节点
        LinkList q = (LinkList)malloc(sizeof(Node));
        q->data = count;
        // 工作指针连接新建节点
        p->next = q;
        // 工作指针后移
        p = q;
    }
    // 标识链表结束
    p->next = NULL;
    return head;
}

// 头插法建立链表
// 操作结果:产生长度为size的逆序链表并返回头指针
LinkList CreateListHead(int size)
{
    int count;
    // head为头节点,p为临时指针
    LinkList head, p;
    // 先建立一个空的头节点
    head = (LinkList)malloc(sizeof(Node));
    head->data = 0;
    head->next = NULL;
    for (count = 0; count < size; count++)
    {
        p = (LinkList)malloc(sizeof(Node));
        p->next = head->next;
        p->data = count;
        head->next = p;
    }
    return head;
}

读取操作

// 读取一个节点
// 操作结果:读取head指向的链表的第i个节点并赋值给e指向的内存
int GetNode(LinkList head, int i, int *e)
{
    LinkList p = head;
    int count;
    // 位置不合理
    if (i <= 0)
    {
        return ERROR;
    }
    // 寻找读取的位置
    for (count = 0; count < i; count++)
    {
        p = p->next;
        if (!p)
        {
            return ERROR;
        }
    }
    *e = p->data;
    return OK;
}

插入节点操作

// 插入一个节点
// 操作结果:在head指向的链表的第i个位置插入e
int InsertNode(LinkList head, int i, int e)
{
    LinkList p = head, q;
    // 插入位置不合理
    if (i <= 0)
    {
        return ERROR;
    }
    int count;
    // 移动到插入的位置
    for (count = 1; count < i; count++)
    {
        p = p->next;
        // 插入位置不合理
        if (!p)
        {
            return ERROR;
        }
    }
    q = (LinkList)malloc(sizeof(Node));
    q->data = e;
    q->next = p->next;
    p->next = q;
    return OK;
}

删除一个节点操作

// 删除一个节点
// 操作结果:删除head指向链表的第i个节点
int DeleteNode(LinkList head, int i)
{
    LinkList p = head, q;
    int count;
    // 删除位置不合理
    if (i <= 0)
    {
        return ERROR;
    }
    //  找到需要删除的节点的前一个节点
    for (count = 0; count < i - 1; count++)
    {
        p = p->next;
        if (!(p->next))
        {
            return ERROR;
        }
    }
    // 删除节点
    q = p->next;
    p->next = p->next->next;
    free(q);
    return OK;
}

遍历操作

// 遍历链表
// 操作结果:输出head指向的链表的所有节点的值
void Traversal(LinkList head)
{
    LinkList p = head->next;
    while (p)
    {
        printf("%d\n", p->data);
        p = p->next;
    }
}

链式存储结构线性表的优点:

  1. 不用确定具体的大小
  2. 插入与删除操作时间复杂度为O(1)

顺序存储结构线性表的缺点:

  1. 访问操作的时间复杂度比较高
  2. 需要为存储关系(next指针)消耗额外的存储空间

相关文章

  • 数据结构与算法-C语言6-线性表之链式存储结构

    数据结构与算法-目录 1、线性表的链式存储结构 1.1、线性表链式存储结构定义 线性表的链式存储结构的特点是用一组...

  • 数据结构之有序线性表的链式存储结构

    之前写了线性表的顺序存储结构和有序线性表的顺序存储结构以及线性表的链式存储结构,今天接着写有序线性表的链式存储结 ...

  • 线性链表

    线性链表 线性表的顺序存储结构:顺序表线性表的链式存储结构:线性链表 线性表的链式存储所占存储空间大于顺序存储。 ...

  • 线性表的链式存储--单链表

    Java之线性表的链式存储——单链表 我们都知道,线性表的存储结构分为两种,顺序存储结构和链式存储结构,线性表的分...

  • C++线性表的链式存储结构

    C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储。在顺序存储结构(数组描述)...

  • 数据结构 线性表 链式存储结构

    本文主要介绍线性表的链式存储结构 为什么要使用链式存储结构? 首先我们知道,根据线性表的顺序存储结构,我们可以对顺...

  • 数据结构和算法之一——线性表_2_顺序结构存储

    线性表存储结构分类线性表有两种物理存储结构:1)顺序存储结构;2)链式存储结构 顺序存储结构2.1定义:线性表的顺...

  • 线性表二(链表的简单概念)

    链式存储结构的线性表:除了要存储数据元素的信息外还要存储它的直接后继元素的存储地址。 链式存储结构线性表的定义 链...

  • 数据结构之线性表的链式存储结构

    之前写了线性表的顺序存储结构和有序线性表的顺序存储结构,今天接着写线性表的链式存储结构 数据结构之线性表的顺序存储...

  • 数据结构 —— 链表

    链式存储是最常用的动态存储方法,为了克服顺序表的缺点,可以采用链式方式存储线性表,通常将采用链式存储结构的线性表称...

网友评论

      本文标题:链式存储结构的线性表

      本文链接:https://www.haomeiwen.com/subject/ubzyaxtx.html