数据结构--C语言版--第一章线性表1

 数据结构作为软件工程师必备的知识之一,同时也是计算机考研的专业课程之一,在人人都在说着算法的今天,从头开始学习数据结构同时也写当作数据结构的复习笔记(本系列出现的代码和案例会在文章最后标注出,主要来自严蔚敏的《数据结构》,仅作为学习分享使用,不作商业用途)

by the way ,因为本人是考研党,所以在下文中会尽量将专业的名词单词都写出来,有意识的去学学这些专业单词我认为对英文还是有帮助的

数据结构第一个最重要的概念就是--复杂度!

复杂度分为时间复杂度 和空间复杂度,一般人们广泛用来判断一个算法效率的主要依据就是时间复杂度;

时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级,记作T(n)=o(f(n)).

请看下面的例子

算法1: 一个简单的从1加到100的算法

int i ,sum = 0, n =100;   //  执行1次
for(i=0;i<=n;i++)         //  执行n+1次
{     
sum =sum +i;             //  执行n次
}


高斯算法:

int sum = 0, n = 100;  //   执行1次
sum = (1+n)*n/2;      //   执行1次

第一种算法CPU共执行了2n+2次运算,第二种算法CPU执行了2次运算,所以第二种算法明显是要优于第一种算法的,因为执行同样一个功能,第二种的时间复杂度仅o(1)。为什么执行了两次运算而时间复杂度却仅为1呢?

因为在计算算法的时间复杂度的时候,我们对于常数的复杂度统一忽略前面的系数,而只用计算它的最高项的次数。故第一种算法复杂度(文章下所有时间复杂度统称复杂度)为o(n).

那么同理,对于二维数组,需要嵌套循环执行的算法,它的复杂度为o(n^2).

既然是数据结构,那么数据都有哪些类型呢,大家都学过C语言,这也是编程梦开始的地方,在《C语言程序设计》这本书中,第一章就花费大篇幅进行数据类型的讲解。以C语言为例

1、原子类型:不可以在分解的类型,如整型、浮点型、字符型等

2、结构类型:由若干个类型组合而成,是可以再分解的,例如数组,字符串型等

--线性表(list):线性表是由零个或多个数据元素组成的有限序列。注意,这里的有限序列即代表了数据中的元素有先来

Initlist(*L)--初始化操作,创建一个空的线性表。

ListEmpty(L)--判断线性表是否为空,若空返回T,否返回F。

ClearList(*L)--将线性表清空。

GetElem(L , i ,*e)--将线性表中的第i个位置的元素返回给e。

LocatElem(L, e)--再线性表中查找与给定值相等的元素,如果查找成功返回1,查找失败返回0。

ListInert(*L , i ,e)--在线性表中第i个位置插入新元素e。

ListDelet(*L , i , *e)--删除线性表中的第i个位置的元素并用e返回

ListLength(L)--返回线性表的元素个数

--线性表:线性表是由零个或多个数据元素组成的有限序列

线性表的两种存储方式:1、顺序存储结构

                                        2、链式存储结构

顺序存储结构:顾名思义是从起始位置以此排列的线性结构。

顺序存储的三个属性:1、存储空间的起始位置

                                    2、线性表的最大存储容量

                                    3、线性表的当前长度(length)

顺序存储的优点:1、无须为元素的逻辑关系开辟额外的存储空间。

                             2、可以快速的取表中的任意位置的元素

 缺点:插入和删除需要移动大量元素

           当线性表长度变化比较大时,难以确定存储空间容量

线性表的链式存储结构:1、除了存储其本身的信息之外,还需要存储一个指向下一个元素地址。也就是C语言中的指针,指向下一个。

                                       2 、 把存储数据元素信息的域称为数据域,把存储后继位置的域称为指针域,这两部分加起来叫做结点。

图像来源:小甲鱼《数据结构和算法》 

对于单链表一定有头有尾,第一个结点叫做头指针,最后一个叫做空(null)或^表示。

参考文献

小甲鱼--《数据结构和算法》  网课地址:https://www.bilibili.com/video/BV1jW411K7yg?p=9

严蔚敏--《数据结构》-C语言版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值