第八课,线性表的链式存储结构

线性表-链式存储结构(C语言实现) 线性表-链式存储结构主要完成功能包括: - 表的定义 - 表初始化 - 断链表是否为空 - 清空链表 - 打印(遍历)链表 - 头插法创建链表 - 尾插法创建链表 - 链表长度 - 取链表第i个值 - 链表数据元素位置查找(顺序查找) - 链表第i个位置插入新元素 - 链表删除第i个元素 - 链表翻转(申请内存) - 链表翻转(未申请内存版本)代码: #includ 阅读详情

专题二:初探门径。包括以下章节:

  1. 线性表的本质
  2. 线性表的相关操作
  3. 线性表的顺序存储结构
  4. 线性表的链式存储结构

思考

顺序表的最大问题是插入和删除需要移动大量的元素!

链式存储结构

  1. 链式存储定义
    • 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。
      这里写图片描述
  2. 链式存储逻辑结构
    • n个结点链接成一个链式线性表的结构叫做链表,当每个结点中只包含一个指针域时,叫做单链表。
      这里写图片描述

链表的基本概念

  1. 表头结点
    • 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息
  2. 数据结点
    • 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息
  3. 尾结点
    • 链表中的最后一个数据结点,其下一元素指针为空,表示无后继

这里写图片描述

链式存储结构

1. 在C语言中可以用结构体来定义链表中的指针域
2. 链表中的表头结点也可以用结构体实现

结点指针域定义

typedef struct _tag_LinkListNode LinkListNode;
struct _tag_LinkListNode
{
    ListListNode* next;
}

头结点定义

typedef struct _tag_LinkList
{
    LinkListNode header;
    int length;
}TListList;

数据元素定义

struct Value
{
    LinkListNode header;
    int v;
}

3. 获取第pos个元素操作
- 判断线性表是否合法
- 判断位置是否合法
- 由表头开始通过next指针移动pos次后,当前元素的next指针即指向要获取的元素

LinkListNode* current = (LinkListNode*)list;
for(i=0;i<pos;i++)
{
    current = current->next;
}
ret = current->next;

4. 插入元素操作
- 判断线性表是否合法
- 判断插入位置是否合法
- 由表头开始通过next指针移动pos次后,当前元素的next指针即指向要插入的位置
- 将新元素插入
- 线性表长度加1

LinkListNode* current = (LinkListNode*)list;
for(i=0;(i<pos)&&(current->next!=NULL);i++)
{
    current = current->next;
}
node->next = current->next;
current->next = node;

sList->length++;

这里写图片描述

5. 删除元素操作
- 判断线性表是否合法
- 判断删除位置是否合法
- 获取第pos个元素
- 将第pos个元素从链表中删除
- 线性表长度减1

TLinkList* sList = (TLinkList*)list;
LinkListNode* ret = NULL;
int i = 0;

if((sList!=NULL) && (0<=pos) && (pos<sList->length))
{
    LinkListNode* current = (LinkListNode*)list;

    for(i=0;i<pos;i++)
    {
        current = current->next;
    }

    ret = current->next;
    current->next = ret->next;

    sList->length--;
}

这里写图片描述

小结

  1. 优点:
    • 无需一次性定制链表的容量
    • 插入和删除操作无需移动数据元素
  2. 缺点:
    • 数据元素必须保存后继元素的位置信息
    • 获取指定数据的元素操作需要顺序访问之前的元素

创建可复用单链表

LinkList.h

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;
struct _tag_LinkListNode
{
    LinkListNode* next;
};

LinkList* LinkList_Create();

void LinkList_Destroy(LinkList* list);

void LinkList_Clear(LinkList* list);

int LinkList_Length(LinkList* list);

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);

LinkListNode* LinkList_Get(LinkList* list, int pos);

LinkListNode* LinkList_Delete(LinkList* list, int pos);

#endif

LinkList.c

#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"

typedef struct _tag_LinkList
{
    LinkListNode header;
    int length;
} TLinkList;

LinkList* LinkList_Create() // O(1)
{
    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));

    if( ret != NULL )
    {
        ret->length = 0;
        ret->header.next = NULL;
    }

    return ret;
}

void LinkList_Destroy(LinkList* list) // O(1)
{
    free(list);
}

void LinkList_Clear(LinkList* list) // O(1)
{
    TLinkList* sList = (TLinkList*)list;

    if( sList != NULL )
    {
        sList->length = 0;
        sList->header.next = NULL;
    }
}

int LinkList_Length(LinkList* list) // O(1)
{
    TLinkList* sList = (TLinkList*)list;
    int ret = -1;

    if( sList != NULL )
    {
        ret = sList->length;
    }

    return ret;
}

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // O(n)
{ 
    TLinkList* sList = (TLinkList*)list;
    int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
    int i = 0;

    if( ret )
    {
        LinkListNode* current = (LinkListNode*)sList;

        for(i=0; (i<pos) && (current->next != NULL); i++)
        {
            current = current->next;
        }

        node->next = current->next;
        current->next = node;

        sList->length++;
    }

    return ret;
}

LinkListNode* LinkList_Get(LinkList* list, int pos) // O(n)
{
    TLinkList* sList = (TLinkList*)list;
    LinkListNode* ret = NULL;
    int i = 0;

    if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
    {
        LinkListNode* current = (LinkListNode*)sList;

        for(i=0; i<pos; i++)
        {
            current = current->next;
        }

        ret = current->next;
    }

    return ret;
}

LinkListNode* LinkList_Delete(LinkList* list, int pos) // O(n)
{
    TLinkList* sList = (TLinkList*)list;
    LinkListNode* ret = NULL;
    int i = 0;

    if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
    {
        LinkListNode* current = (LinkListNode*)sList;

        for(i=0; i<pos; i++)
        {
            current = current->next;
        }

        ret = current->next;
        current->next = ret->next;

        sList->length--;
    }

    return ret;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct Value
{
    LinkListNode header;
    int v;
};

int main(int argc, char *argv[]) 
{
    int i = 0;
    LinkList* list = LinkList_Create();

    struct Value v1;
    struct Value v2;
    struct Value v3;
    struct Value v4;
    struct Value v5;

    v1.v = 1;
    v2.v = 2;
    v3.v = 3;
    v4.v = 4;
    v5.v = 5;

    LinkList_Insert(list, (LinkListNode*)&v1, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v2, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v3, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v4, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v5, LinkList_Length(list));

    for(i=0; i<LinkList_Length(list); i++)
    {
        struct Value* pv = (struct Value*)LinkList_Get(list, i);

        printf("%d\n", pv->v);
    }

    while( LinkList_Length(list) > 0 )
    {
        struct Value* pv = (struct Value*)LinkList_Delete(list, 0);

        printf("%d\n", pv->v);
    }

    LinkList_Destroy(list);

    return 0;
}
数据结构实验一_线性表、顺序表基本操作的编程实现(C语言) 一、实验题目 线性表、顺序表基本操作的编程实现 二、实验要求 线性表、顺序表基本操作的编程实现,掌握线性表、顺序表的建立、遍历、插入、删除、读取等基本操作的编程实现,也可以进一步编程实现逆序等操作,存储结构可以采用顺序存储结构和链表存储结构之一,可以依次完成主要功能来体现功能的正确性,用菜单进行管理完成大部分功能,要求可以重复运行。 三、运行效果图 四、代码 #include<stdio... 阅读详情

相关推荐

线性表链式存储结构C语言实现

线性表 链式存储结构 C语言实现 VC6.0

线性链式存储结构c语言建立,线性表的链式存储结构(C语言版)

上一篇博文我对数据结构中线性表的顺序存储结构顺序表(http://12172969.blog.51cto.com/12162969/1916336)按照我的理解做了总结,今天我继续对顺序表的另一种存储结构,链表谈一下我看法。链表为什么会出现?按照我的理解,有需就有求,我们都知道,当顺序表存储的元素较多时,插入删除,就要耗费大量时间,这是不能满足当下的需求的,而链表就解决了这个问题,也不是说链表就是...

weixin_30320771的博客 553

STM32CubeMX 6.4.0 + STM32F407ZGT6 实战:基于YT8512C PHY的lwIP以太网配置与调试

本文详细介绍了使用STM32CubeMX 6.4.0为STM32F407ZGT6微控制器配置YT8512C PHY芯片,并成功移植lwIP以太网协议栈的实战过程。文章从硬件差异分析入手,逐步讲解时钟配置、ETH外设设置、PHY寄存器适配以及lwIP协议栈剪裁等关键步骤,旨在帮助开发者解决非标准PHY芯片的联网难题,最终实现网络连通与Ping测试。

n8m7b6v5c4的博客 593

3.线性表的链式存储结构————静态链表(C语言和C++完整解析)

目录 1. 静态链表的概念 2. 静态链表的存储结构 3. 静态链表的基本操作 4. 静态链表的编程实现        4.1  C语言实现静态链表        4.2  C++实现静态链表        4.3测试结果 5. 静态链表的特点 6. 参考资料 1.静态链表的概念 因为有些语言没有指针,所以难以实现普通链表,静态链表就是用来解决这一问题的有力工具,静态链表使用...

隔壁老王的博客 5915

MIKE11实战:平原河网水动力建模从入门到精通(附GIS数据处理技巧)

本文系统介绍了MIKE11软件在平原河网水动力建模中的完整实战流程。从GIS数据预处理、河网构建、参数率定到结果分析,详细阐述了构建可靠数字孪生模型的关键步骤与技巧,旨在帮助水利工程师高效解决平原地区复杂水流模拟的挑战,为防洪决策提供科学依据。

weixin_28419039的博客 689

Innovus 安装全过程

【代码】Innovus 安装全过程。

lmyynlbcy的博客 5539

2.线性表的链式存储结构————单链表(思路分析,C语言、C++完整程序)

目录 1.单链表的基本概念 2.单链表的基本操作 3.单链表编程实现----C语言 4.单链表编程实现----C++ 5.实验结果 1.单链表的基本概念 (1)单链表:当链表中的每个结点只含有一个指针域时,称为单链表。 (2)头指针:如上图所示,链表中第一个结点的存储位置叫做头指针。 (3)头结点:头结点是放在第一个元素结点之前的结点,头结点不是链表中的必须元素,其数据域一般...

隔壁老王的博客 7614

库卡机器人外部轴配置全流程:从接线到WorkVisual 6.0实战(附避坑指南)

本文详细解析了库卡机器人外部轴配置的全流程,涵盖从硬件接线到WorkVisual 6.0软件配置的实战步骤。重点介绍了KPP驱动模块连接、电机参数匹配、安全配置激活及零点标定等关键环节,并提供了实用的避坑指南,旨在帮助工程师高效、安全地完成外部轴集成,提升工作站柔性。

weixin_29161785的博客 497

c实现线性表的链式存储

线性表的链式存储: 用任意的存储单元存储线性表的数据元素,用节点存储每个元素的数据,节点中还存储直接后继元素存储位置的域(指针域)。 n个结点链接成一个链表,即线性表的链式存储。 线性表的基本操作c语言实现 #include &lt;stdio.h&gt; #include &lt;malloc.h&gt; typedef int ElemType; typedef struct SL...

linry的博客 1350

爬虫瑞数5案例:联通

瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。

老衲爱洗头的博客 4470

3、全面掌握QGIS开发:从调试到应用的全方位指南

本文全面介绍了QGIS开发的各个环节,涵盖插件调试、PyQGIS API导航、插件创建与分发、独立地理空间应用开发,以及全局和项目级首选项的管理。通过详细的步骤说明、代码示例和流程图,帮助开发者系统掌握QGIS扩展与集成的核心技能,并展望了未来在功能拓展、跨平台兼容性和技术融合方面的可能性。

hill8的博客 89

数据结构教程

数据结构教程

漫漫长路 3415

【人工智能】从零开始玩转龙虾(Openclaw):本地与云端(火山Arkcloud)部署全指南

龙虾(Openclaw)是一款海外智能体操作系统(agent operating system),可通过飞书机器人实现自动化办公、信息抓取、任务协作等功能。它支持本地部署和云端部署两种方式,适配MacOS和Windows系统(,建议优先使用MacOS)。sudo。

奶爸的编程之路,也就一周冷个三天 947

数据结构资料

数据结构教程    第一课:数据结构的基本概念和术语 第二课:抽象数据类型的表示与实现 第三课:算法及算法设计要求 第四课:算法效率的度量和存储空间需求 第五课:线性表的类型定义 第六课:线性表的顺序表示和实现 第七课:实验一 线性表的顺序存储实验 第八课:线性表的链式表示与实现 第九课:循环链表与双向链表 第十课:

maidanm 4174

百度百科 X-Bk-Token 算法还原

百度百科 X-Bk-Token 算法还原

自成背后的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构详解

第一课:数据结构的基本概念和术语 第二课:抽象数据类型的表示与实现 第三课:算法及算法设计要求 第四课:算法效率的度量和存储空间需求 第五课:线性表的类型定义 第六课:线性表的顺序表示和实现 第七课:实验一线性表的顺序存储实验 第八课:线性表的链式表示与实现 第九课:循环链表与双向链表 第十课:栈的表示与实现 第十一课:栈的应用 第十二课:实验二循环链表实验 第十三课:队列

安静的美男子 8291

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

广东专插本c语言和数据结构,专插本数据结构.doc

数据结构教程?第一课:数据结构的基本概念和术语第二课:抽象数据类型的表示与实现第三课:算法及算法设计要求第四课:算法效率的度量和存储空间需求第五课:线性表的类型定义第六课:线性表的顺序表示和实现第七课:实验一 线性表的顺序存储实验第八课:线性表的链式表示与实现第九课:循环链表与双向链表第十课:栈的表示与实现第十一课:栈的应用第十二课:实验二 循环链表实验第十三课:队列第十四课:串的定义第十五课:串...

weixin_39795065的博客 1588

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

线性表Part1--定义及ADT、顺序、链式存储结构及其部分操作具体实现(C语言描述)

线性表Part1–定义、抽象数据类型(ADT)、顺序存储结构定义及其部分操作具体实现方法(C语言描述) 此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 1.线性表(List)的定义: 线性表(List):零个或多个数据元素的有限序列。 通常将线性表记作(a1,a2,…,an),n指表长,当n=0时称该表为空表。同时注意此处下标是从1开始的。 线性表包括顺序表和链表。二者的主要区别在于: 在顺序表中,数据元素是用一段地址连续的存储

ZZay's 2785

数据结构之线性表的链式存储结构 C语言版

单链表的添加,插入,删除,查找等

bsqetuo的博客 1022

数据结构与算法(C语言) | 线性表(顺序存储、链式存储)

   线性表是最常用最简单的线性结构      线性结构具有以下基本特征:    线性结构是一个数据元素的有序(次序)集(处理元素有限)。若该集合非空,则 1)必存在唯一的一个“第一元素”; 2)必存在唯一的一个“最后元素”; 3)除第一元素之外,其余每个元素均有唯一的前驱; 4)除最后元素之外,其余每个元素均有唯一的后继。   抽象数据类型(ADT)格式: ADT 抽象数据类...

Shannon 7408

线性表的链式存储结构

链表存储结构 单链表是有很多的节点组成起来的 节点有两个区域: 1.数据域 是可以有很多数据的 里面有一个自己的 Message 这里的Message就是一个节点 2.指针域 ...

LiChengZe_Blog的博客 276

(一)线性表的链式存储结构

2.3.1 线性表的链式存储结构——链表 链表: 1.每个节点中除数据域外,设置了一个指针域,用以指向其后继节点,这样构成的链接表称为线性单向链表,简称单链表。 2.每个节点中除数据域外,设置两个指针域,分别用以指向其前驱节点和后继节点,这样构成的链表称为线性双向链接表,简称双链表。 在线性表的链式存储中,为了便于插入和删除算法的实现,每个链表带有一个头节点,并通过头

etdeng的专栏 925

C语言实现一般线性表的链式存储

C语言实现一般线性表的顺序存储,以下是在VS2013编译通过的,欢迎讨论。有关数据结构的概念可看我的另一篇文章http://blog.youkuaiyun.com/linuxlsl/article/details/45649655 一、头文件linklist.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typed

linuxlsl的博客 520
上一篇: 第七课,线性表的顺序存储结构
下一篇: 第九课,静态链表
wuyadecs
博客等级 码龄15年 16粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值