文章目录

  • 前言
  • 一、什么是线性表?
  • 二、顺序表:
  • 三、链表:
  • 四、顺序表和链表对比:
  • 总结

前言

线性表是实际中广泛应用的重要数据结构,本文用通俗易懂的方法讲解它。


一、什么是线性表?

首先,我们了解下“线性表”的基本概念:

  • 全名为“线性存储结构”,使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。
  • 是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、队列…

二、顺序表:

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储数据。

  2. 动态顺序表:使用动态开辟的数组存储。

扩容方法:动态开辟一块新的空间(一般为原空间的两倍),将原空间的数据拷贝到新的空间,然后让array指针指向新的空间并且释放旧空间。

对比以上两者:

区别:

  • 静态顺序表和动态顺序表唯一不同的是,静态顺序表在创建顺序表的时候容量已经确定,不可以更改,而动态顺序表的容量是由malloc函数动态开辟,当容量不够用时可以增加容量capacity。

优缺点:

  • 静态顺序表创建空间时为静态开辟,不用malloc函数,代码相对简单(一点点),不存在内存泄露问题。
  • 动态顺序表,动态开辟空间,使用相对灵活,相比于静态开辟空间也可以少空间浪费。

动态顺序表代码演示:初始化、插入数据和检查容量

//初始化顺序表
void SeqList_Init(SeqList* ps)
{SLDataType* tmp = (SLDataType*)malloc(5 * sizeof(SLDataType));if (tmp == NULL){perror(malloc);exit(-1);}ps->arr = tmp;ps->size = 0;ps->capacity = 5;
}
//检查容量
void Check_Capacity(SeqList* ps)
{assert(ps);if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->arr, 2*ps->capacity* sizeof(SLDataType));if (tmp == NULL){perror(realloc);exit(-1);}ps->arr = tmp;ps->capacity = 2 * ps->capacity;printf("扩容成功\n");}
}
//插入数据
void SeqList_Insert(SeqList* ps, SLDataType pos)
{assert(ps);Check_Capacity(ps);//检查容量SLDataType num = 0;printf("请输入需要写入的值:>");scanf("%d", &num);if (ps->size == 0 || pos == ps->size){ps->arr[pos] = num;}    SLDataType end = ps->size - 1;while (end >= pos){ps->arr[end + 1] = ps->arr[end];end--;}ps->arr[pos] = num;ps->size++;
}
//头部插入数据
void SeqList_PushFront(SeqList* ps)
{SeqList_Insert(ps, 0);
}
//尾部插入数据
void SeqList_PushBack(SeqList* ps)
{SeqList_Insert(ps, ps->size);
}

三、链表:

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

下图为单链表的逻辑结构类型:

注意:

  1. 链式结构在逻辑上是连续的,但在物理上不一定连续
  2. 现实中结点一般都是在堆上申请出来的
  3. 从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可连续,也可能不连续

链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

  1. 单向或者双向:

  1. 带头和不带头:

  2. 循环和不循环:

    经过以上三种可以有2^3=8种类型。

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:

  • 无头单向链表和带头双向循环链表:

这边通过单链表头部和尾部插入数据代码帮大家理解过程:

//创建结点
SListNode* BuySListNode(SLTDataType x)
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));assert(newnode);newnode->data = x;newnode->next = NULL;return newnode;
}
//头插数据
void SListPushFront(SListNode** pphead, SLTDataType x)
{SListNode* newnode = BuySListNode(x);//读取新建的结点newnode->next = *pphead;*pphead = newnode;
}
//尾插数据
void SListPushBack(SListNode** pphead, SLTDataType x)
{SListNode* newnode = BuySListNode(x);//读取新建的结点if (*pphead == NULL){*pphead = newnode;return;}SListNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;
}

四、顺序表和链表对比:

不同点 顺序表 链表
存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续
随机访问 支持 不支持
任意位置插入或删除元素 可能搬移元素,效率低 只需修改指针指向
插入 动态顺序表,空间不够需要扩容 没有容量概念
应用场景 元素高效存储+频繁访问 任意位置插入和删除
缓存利用率

总结

以上就是今天要讲的顺序表和链表的内容啦,如果本篇博客对你有所帮助的话,请给博主一个三连哦!

C语言链表详解(通俗易懂)相关推荐

  1. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  2. 最简单粗暴的C语言链表详解

    单链表分为有头节点和无头节点链表,插入的方法有头接法和尾接法俩种办法,下面,我将使用无头结点的链表,因为尾插法更适合无头结点的链表的插入,所以在此我们使用 1.无头结点链表 2.尾插法插入数据 #in ...

  3. rs232发送数据程序c语言,RS-232C详解.pdf

    RS-232C详解,rs指令详解,rs232串口通信详解,rs触发器详解,c语言指针详解,c指针详解,c语言链表详解,c语言题库及详解答案,c语言for循环详解,c语言关键字详解 串口通讯-RS-23 ...

  4. 链表的基本操作(C语言)详解(摘取自C语言学习网2.5)

    链表的基本操作(C语言)详解 #include <stdio.h> #include <stdlib.h>typedef struct Link{int elem;struct ...

  5. C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...

  6. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

  7. python链表值讲解_python数据结构之链表详解

    python数据结构之链表详解 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用 ...

  8. 归并排序过程实现c语言,C语言归并排序详解

    C语言归并排序详解 发布日期:2015-12-31 11:16 来源: 标签: 编程语言 C教程 C语言归并排序 C语言归并排序算法 本章我们主要学习C语言实现排序算法之归并排序,对归并排序的原理及实 ...

  9. Go语言defer详解笔记

    Go语言defer详解 1.defer概述: ​ defer是用来声明一个延迟函数,并且将这个函数放到一个栈中,它的调用时间在return执行之前,详细来讲,它的执行时间在return的值赋值之后,在 ...

  10. python语言编程基础-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

最新文章

  1. 微软:杀死那个曾经全球第一的浏览器
  2. IDEA使用技巧整理
  3. SQL 查询横表变竖表
  4. Spring的javaMail邮件发送(带附件)
  5. 如何应对日益膨胀的数据流量? | 技术头条
  6. 【Keil5】关于keli5使用ST-link下载的配置方法
  7. 软考系统分析师考试大纲
  8. 二元函数对xy同时求导_呆哥数学每日一题 ——求多元函数最小值
  9. 《Redis视频教程》(p5)
  10. Matlab mapminmax函数使用及原理
  11. 跑分软件测试原理,只会比高低?教你三分钟看懂安兔兔跑分
  12. 如何在word文档里复选框里打勾?
  13. 短短十言,把人生说透了.
  14. 如何学习自动化测试?一文4从个方面带你入门自动化测试【建议收藏】
  15. 其他|Cherry 键盘 Fn 锁定切换方法
  16. CSS 发明者 Håkon Wium Lie 访谈(三)
  17. 受限于弹幕池的数量,没有办法可以爬取到B站更多的弹幕呢?
  18. axios请求拦截器错误_axios拦截器获取不到接口返回的response?
  19. 【译】教你用50种语言写Hello, World
  20. 数字新基建指南|数字化赋能智慧园区建设

热门文章

  1. 猿创征文|计算机专业硕博研究生提高效率的10款科研工具
  2. 说说用笔记本电脑的惨痛经历
  3. 计算机网络管理员试题2016,2016年 -1月自考计算机网络管理试题真题.doc
  4. cad2012打开后闪退_windows7打不开CAD2012出现闪退的处理方法
  5. 电商公司ERP管理软件与旺店通、第三方仓库以及云仓的贯通解决方案
  6. 超级计算机预测未来,超级计算机预测未来
  7. axure8 事件改变样式_AxureRP8实战手册-案例2(文本框:边框变色)
  8. html手机页面怎么保存图片,【答疑】你知道手机怎么保存网页长图吗?超简单!...
  9. root认证失败 tera term_(转载)linux ssh telnet TeraTerm终端中文显示乱码解决方法
  10. erdas几何校正_实验一 ERDAS介绍与图像几何校正