数据结构---线性表的静态/动态分配与顺序/链式存储

2023-11-20

线性表---基于严魏敏版数据结构c语言实现---谭浩强版c语言

数据元素在计算机中的存储分为顺序存储链式存储

顺序存储:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系

链式存储:借助指示元素存储地址的指针表示数据元素之间的逻辑关系

ps:谭浩强版c语言涉及8.8内存的动态分配与静态分配

动态分配:数据存储容量不固定(谭浩强:8.8P285 动态分配是需要时随时开辟,不需要时随时释放)

谷歌搜索动态分配的连续存储:(64页)通过程序设计语言提供的动态存储功能,申请一组指定大小的连续空间

静态分配:数据存储容量固定

谷歌搜索静态分配的连续存储:(64页)程序设计语言提供的构造类数据类型---数组(顺序表)

ps:严魏敏版章节区分为顺序表和链表的实现,仅仅有动态分配的顺序存储没有静态分配的顺序存储,但是本人认为代码实现不仅限于顺序表和线性表的实现,更应该严格地区分为四类,动态分配的顺序存储、静态分配的顺序存储、动态分配的链式存储、静态分配的链式存储,且顺序表和链表的划分并不等同于顺序存储和链式存储的划分,所以本篇会介绍基于静态分配和动态分配的顺序存储和链式存储

线性表基于动态分配的顺序存储结构--严魏敏(抄书原文p22)

(实现方法:结构体成员表列用指针和动态开辟数组)https://www.cnblogs.com/Romi/archive/2012/01/07/2315788.html

1.顺序表构造

顺序表构造前进行如下宏定义和变量替换,方便代码的理解:

1

2

3

4

5

6

7

8

9

10

11

12

13

#define TRUE 1

#define FALSE 0

#define OK 1

#define ok 1

#define ERROR 0

#define error 0

#define INFEASIBLE -1

 

#define LIST_INIT_SIZE 100;

#define LISTINCREMENT 10;

 

typedef int ElemType;

typedef int Status;

采用结构体构造一个顺序表,定义顺序表的地址、长度、存储容量的表示,代码如下:

1

2

3

4

5

typedef struct{

    ElemType *elem;   //定义了顺序表中元素类型的数组指针,指向顺序表存储空间的基址

    int length;       //顺序表的长度(也即元素个数)

    int listsize;     //当前分配给顺序表的存储容量

}SqList;

 

2.顺序表的初始化

接下来对该顺序表进行初始化,为顺序表分配一个预定义大小的数组空间,并将当前顺序表长度设为0,如果元素个数大于分配的存储容量则再对容量进行扩充(初始化时不扩充,顺序表使用中按需要进行容量扩充)。代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

Status InitList(SqList *L)

{

    (*L).elem=(ElemType*)malloc(100*sizeof(ElemType));

    //不知什么问题不能用LIST_INIT_SIZE,必须用100,下面的realloc函数也是一样?

    if((*L).elem==NULL)

    {

        exit(OVERFLOW);

    }

    (*L).length=0;

    (*L).listsize=LIST_INIT_SIZE;

    return ok;

}

线性表基于静态分配的顺序存储结构--

(实现方法1:结构体成员表列用静态数组)仅作参考https://www.cnblogs.com/newwy/archive/2010/10/10/1847449.html

https://blog.csdn.net/zwj1452267376/article/details/85011271

静态分配内存:

const int Maxsize = 100;//定义表格的最大长度 
//ElemType表示存储元素的类型
typedef struct{
    ElemType data[MaxSize];//顺序表中的元素 
    int length;//顺序表的当前长度 
}Sqlist; 

(实现方法2:严魏敏(静态链表实现抄书原文p31)争议处理:https://ask.csdn.net/questions/274643?ops_request_misc=%7B%22request_id%22%3A%22158195017719725256734898%22%2C%22scm%22%3A%2220140713.130063897..%22%7D&request_id=158195017719725256734898&biz_id=4&utm_source=distribute.pc_search_result.none-task

StaticLinkList.h

#ifndef _STATIC_LINK_LIST_H_
#define _STATIC_LINK_LIST_H_
#define MAXSIZE 100

typedef enum {ERROR,OK}Status;

typedef struct{
    int cur;
    int data;
}StaticLinkList[MAXSIZE];

线性表基于动态分配的链式存储结构--严魏敏(抄书原文p28

(实现方法1:定义结构体成员为指针)

  1. //-----线性表的单链表存储结构-----

  2. typedef struct LNode { //自定义数据类型

  3. ElemType data ; //数据域

  4. struct LNode *next ; //指针域

  5. } LNode, *LinkList ;

(实现方法2:定义结构体成员为指针)https://www.cnblogs.com/choon/p/3915706.html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#include <stdio.h>

#include <stdlib.h>

/*所谓动态链表,是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。*/

struct Student

{

    int No;//学号

    struct Student *next;

};

int main()

{

    struct Student *p1, *p2, *head;

    int n = 0; //结点个数

    head = NULL;

    p1 = (struct Student *)malloc(sizeof(struct Student));

    printf("请输入1个学号\n");

    scanf("%d", &p1->No);

    p2 = p1; //开始时,p1和p2均指向第1个结点

    while (p1->No != 0)

    {

        n++;

        if (n == 1)

        {

            head = p1;

        }

        else

        {

            p2->next = p1;

        }

        p2 = p1;//p2是最后一个结点

        printf("请输入学号,输入0终止:\n");

        p1 = (struct Student *)malloc(sizeof(struct Student));

        scanf("%d", &p1->No);

    };

    p2->next = NULL;//输入完毕后,p2->next为NULL

 

    //遍历动态链表

    struct Student *p;

    p = head;

    while (p != NULL)

    {

        printf("%d,", p->No);

        p = p -> next;

    }

    printf("\n");

 

    system("pause");

}

线性表基于静态分配的链式存储结构--谭浩强(p310)

(实现方法:结构体成员为指针)

https://www.cnblogs.com/choon/p/3915706.html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#include <stdio.h>

#include <stdlib.h>

/*所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。*/

struct Student

{

    int num;

    float score;

    struct Student *next;

};

int main()

{

    struct Student stu1, stu2, stu3, *head, *p;

    stu1.num = 1001; stu1.score = 80; //对结点stu1的num和score成员赋值

    stu2.num = 1002; stu2.score = 85; //对结点stu2的num和score成员赋值

    stu3.num = 1003; stu3.score = 90; //对结点stu3的num和score成员赋值

 

    head = &stu1;      //头指针指向第1个结点stu1

    stu1.next = &stu2; //将结点stu2的地址赋值给stu1结点的next成员

    stu2.next = &stu3; //将结点stu3的地址赋值给stu2结点的next成员

    stu3.next = NULL;  //stu3是最后一个结点,其next成员不存放任何结点的地址,置为NULL

    p = head;          //使p指针也指向第1个结点

 

    //遍历静态链表

    do{

        printf("%d,%f\n", p->num, p->score); //输出p所指向结点的数据

        p = p->next;                         //然后让p指向下一个结点

    while (p != NULL);                     //直到p的next成员为NULL,即完成遍历

 

    system("pause");

}

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构---线性表的静态/动态分配与顺序/链式存储 的相关文章

  • 毕业设计-基于 PID 控制算法仿真算法研究- Matlab

    目录 前言 课题背景和意义 实现技术思路 一 基本原理 二 无超调 PID 控制器的设计 三 无超调 PID 设计的验证 代码 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一
  • 安装anaconda及修改conda config 的channels/default_channels

    先说一下安装anaconda的方法 很简单 就是去官网下载然后在本地安装 bash Anaconda3 4 4 0 Linux x86 64 sh 这个过程中要耐心 会有提问 需要输入yes来回应 并且需要按很多的回车 总之 看见让输入ye

随机推荐

  • 转:机器学习的理解

    转李航博士的一篇关于机器学习理解的文章 算算时间 从开始到现在 做机器学习算法也将近八个月了 虽然还没有达到融会贯通的地步 但至少在熟悉了算法的流程后 我在算法的选择和创造能力上有了不小的提升 实话说 机器学习很难 非常难 要做到完全了解算
  • Ridis持久化

    Redis持久化 RDB Redis DataBase Redis会单独创建 fork 一个子进程来进行持久化 会先将数据写入到一个临时文件中 待持久化都结束了 再用这个临时文件替换上次持久化好的文件 整个过程中 主进程是不进行io操作的
  • 8--UI 初步认识 简易计算器

    UI是App的根基 一个App应该是先有UI界面 然后在UI的基础上增加实用功能 2 UI相对简单易学 UI普遍是学习过程中最简单的一块 能快速拥有成就感和学习兴趣 3 UI至关重要 开发中的绝大部分时间都在处理UI 谨记一条IOS软件开发
  • MySQL根据某一个或者多个字段查找重复数据

    sql 查出一张表中重复的所有记录数据 1 表中有id和name 两个字段 查询出name重复的所有数据 select from xi a where a username in select username from xi group
  • 系列教程

    PDF Search 系列教程来咯 在 Part 1 中 我们将演示如何从 PDF 中提取 处理并存储图像及文本 随着神经搜索 Neural Search 技术的普及 越来越多开发者 开始尝试用 Jina 解决非结构化数据的索引和搜索问题
  • MySQL必知必会 学习笔记 第二十五章 使用触发器

    触发器在MySQL 5中增加 触发器可以在MySQL响应DELETE INSERT UPDATE语句时自动执行一条SQL语句 MySQL 5中触发器名在每个表中唯一而不是在一个数据库中唯一 其他DBMS有的重名限制是数据库范围 以后MySQ
  • lua和测试(一)

    lua做为一门高级语言 在游戏产业运用到机会越来越多了 测试掌握几门脚本语言也有一定的重要性 以下对于lua组合输入做出一些引导 测试需要掌握的关于返回数值 主要用到布尔类 前言的指引 lua的语法比较简单和清晰 学过c语言的可以很好的掌握
  • 并发编程系列之自定义线程池

    前言 前面我们在讲并发工具类的时候 多次提到线程池 今天我们就来走进线程池的旅地 首先我们先不讲线程池框架Executors 我们今天先来介绍如何自己定义一个线程池 是不是已经迫不及待了 那么就让我们开启今天的旅途吧 什么是线程池 线程池可
  • selenium+python 对输入框的输入处理

    最近自己在做项目的自动化测试 公司无此要求 在用户管理模块做修改用户信息时 脚本已经跑成功 并且的确做了update操作 但是自己登陆页面检查 信息却没有被修改 再次确定系统该模块的编辑功能可用 脚本如下 if result num gt
  • 近千万EOS被盗事件回顾,大家请保护好自己的EOS私钥

    最近有伙伴被盗了价值近千万的EOS 于是查看了这次被盗活动账号记录 这次分享出来 一是有可能大家有线索 二是也让大家意识到数字货币私钥安全的重要性 事件回顾 受害人在7 9号被偷盗人通过update auth更换了账号授权公私钥 紧接着被转
  • 零基础到GPT高手:快速学习与利用ChatGPT的完全指南

    进入人工智能时代 令人惊叹的ChatGPT技术正在引爆全球 您是否想象过能够与智能语言模型对话 提升工作效率 解锁创意 甚至实现商业化变现 在本篇文章中 我将向你揭示ChatGPT的原理 学习技巧 并展示如何利用ChatGPT提升工作效率和
  • Windows11:QT5.14.2+PCL1.12.0+VS2019环境配置

    之前在win10系统下配置了PCL1 8 1 QT5 9 1 VS2015的开发环境 由于PCL库已经更新到了1 12 1而且1 8 1一直有bug 为了使用下新的算法库 今天配置一下新的开发环境 1 安装Qt5 14 2 Qt5 14 2
  • 【b站雅思笔记】Simon‘s IELTS Course - 听力部分

    前情提要 b站up主贼开心的小林上传的Simon的听力课 资料均来源于她 参考 雅思阅读 最好的雅思课程 阅读部分全集 https www bilibili com video BV1ea4y1x7qR spm id from 333 78
  • Spring为什么要用的三级缓存解决循环依赖

    一 代码准备 Component aService public class AService Autowired private BService bService public void test System out println
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • react_hooks系列05_useRef,useImperativeHandle,高阶组件forwordRef

    一 useRef 1 uesRef使用在官方标签上 useRef 返回一个可变的 ref 对象 其 ref 对象 current 属性被初始化为传入的参数 initialValue 返回的 ref 对象在组件的整个生命周期内保持不变 imp
  • 蓝桥杯字母阵列

    字母阵列 递归解法 仔细寻找 会发现 在下面的8x8的方阵中 隐藏着字母序列 LANQIAO SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLANQIAO RSFWFNYA XIFZVWAL COAIQNAL 我
  • 教你怎么导入导出数据

    最近在做一个项目 需要对数据进行导入导出 实现之后 自己也做了一个总结 总体来说还是比较容易的 第一次的话肯定有许多坑的 细节真的很重要 当你踏过一个又一个坑 一路路走来 你会发现自己的信心越来越强 对于数据的导入导出 我们首先写一个工具类
  • 代码检查、评审、单元测试工具 大搜集

    看书真是迅速进入一个陌生领域的最快办法 系统的 体系完整的知识比起在互联网上七拼八凑出的认识强太多了 先记下一些理论概念 软件生命周期模型 分析 设计与文档 编码与审查 测试与调试 发布与维护 软件测试对象的6种分类 单元测试 静态检查 动
  • 数据结构---线性表的静态/动态分配与顺序/链式存储

    线性表 基于严魏敏版数据结构c语言实现 谭浩强版c语言 数据元素在计算机中的存储分为顺序存储和链式存储 顺序存储 借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系 链式存储 借助指示元素存储地址的指针表示数据元素之间的逻辑关系 ps