数据结构(C语言)

本文介绍了数据结构的基础概念,包括数据的逻辑结构和存储结构,强调了数据结构、算法和程序设计之间的关系。讨论了线性表的逻辑结构和抽象数据类型,并详细阐述了线性表的顺序存储结构和链式存储结构,包括单链表和双链表的实现。最后,文章预告了栈和队列的内容。
摘要由CSDN通过智能技术生成

第一章  绪论

1.1 问题求解与程序设计

著名的计算机学者沃思给出了一个公式:数据结构+算法=程序

主要内容:

(1)、数据的逻辑结构:包括表、树、图等数据结构,其核心是如何组织待处理的数据以及数据之间的逻辑关系

(2)、数据的存储结构:如何将表、树、图等数据结构存储到计算机的存储器中,其核心是如何有效地存储数据以及数据之间的逻辑关系

(3)、算法:如何基于数据的某种存储结构实现插入、删除、查找等基本操作,其核心是如何有效地处理数据

(4)、常用的数据处理技术:包括查找技术和排序技术等

1.2  数据结构的基本概念

1.2.1数据结构

数据:所有能输入到计算机中并且能被计算机程序识别和处理的符号集合。可以将数据分为俩大类:一类整数、实数等数值数据;另一类是文字、声音、图形和图像等非数值数据

数据元素:是数据的基本单位构成数据元素最小单位称为数据项,而且数据元素通常具有相同个数和类型的数据项。        数据元素与数据的关系——是集合的个体。

数据对象:性质相同的数据元素集合。        数据对象与数据的关系——是集合的子集。       

数据结构:指相互之间存在一定关系的数据元素的集合。数据元素之间的相互关系称为结构。需要强调的是,数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不给予考虑。按照观点的不同,数据结构分为逻辑结构存储结构

数据的逻辑结构是指数据元素以及数据元素之间的逻辑关系,是从实际问题抽象出的数据模型,在形式上可定义为一个二元组:Data_Structure = (D,R)       其中,D是数据元素的有限集合,R是D上关系的集合。 

逻辑结构的划分:

        (1)线性结构:有且仅有一个开始和一个终端节点,并且所有节点都最多有一个直接前驱和一个直接后继。例如:线性表、栈、队列、串。

        (2)非线性结构:一个结点可能有多个直接前驱和直接后继。例如:树、图。

根据数据元素之间的逻辑关系的不同,数据结构可分为以下四类:

  1.  集合:数据元素之间就是“属于同一个集合”,除此之外,没有任何关系。
  2. 表结构:数据元素之间存在着一对一的线性关系。
  3. 树结构:数据元素之间存在着一对多的层次关系。
  4. 图结构:数据元素之间存在在多对多的任意关系。

树结构和图结构也称为非线性结构

通常用逻辑结构图来描述数据的逻辑结构。

 数据的存储结构又称为物理结构,是数据以及逻辑结构在计算机中的表示(也称为映像)。

存储结构有俩种存储结构:顺序存储结构链式存储结构

顺序存储结构:一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系有元素的存储的位置来表示。

链式存储结构:一组任意的存储单元存数据元素,数据元素之间的逻辑关系用指针来表示。

数据结构的两种存储结构图

数据的逻辑结构是从具有问题抽象出来的数据模型,是面向问题的,反映了数据元素之间的关联方式或邻接关系。

数据的存储结构是面向计算机的,其基本目标是将数据及其逻辑关系存储到计算机的内存中。

一种数据的逻辑结构可以用多种存储结构来存储,而采用不同的存储结构,其数据处理的效率往往是不同的。

1.2.2抽象数据类型

 数据类型:是一组值的集合以及定义于这个值集上的一组操作的总称。数据类型规定了该类数据的取值范围以及能够执行的操作。

抽象:就是抽出问题本质的特征而忽略非本质的细节,是对具体事情的一个概括。

抽象数据类型:是一个数据模型以及定义在该模型上的一组操作的总称。

1.3算法的基本概念

1.3.1算法及算法的特性

算法:对特定问题求解步骤的一种描述,是指令的有限序列。

算法必须满足以下基本特性:

  1. 有穷性
  2. 确定性
  3. 可行性
  4. 正确性
  5. 健壮性
  6. 可理解性
  7. 抽象分级性
  8. 高效性

1.4算法分析(时间复杂度重难点

常见的时间复杂度:

O(\log_{2}N) < O(N) < O(N\log_{2}N) < O(N^{2}) < O(N^{3}) < O(2^{^{N}}) < O(n!)

算法在运行过程中需要的存储空间包括:

  1. 输入\输出数据占用的空间;
  2. 算法本身占用的空间;
  3. 执行算法需要的辅助空间;

算法的空间复杂度:指算法在执行过程中需要的辅助空间数量,也就是除算法本身和输入输出数据所占用的空间外,算法临时开辟的存储空间。

1.4.1算法分析举例

 1.非递归算法的时间复杂

(1)       

x++;

解:x++是基本语句,执行次数为1次,所以时间复杂度为O(1),称为常量阶。

(2)       

for(i = 1; i <= n; i++)
    ++x;

解:++x是基本语句,执行次数为n次,所以时间复杂程度为O(n),称为线性阶。

(3)   

    for(i = 1; i <= n;i++)
        for(j = 1; j<= n;j++)
            ++x;

解:++x是基本语句,执行次数为n^{^{2}}次,所以时间复杂程度为O(n^{^{2}}),称为平方阶。

(4)

for(i = 1 ; i <= n ; i++)
    for(j = 1 ; j<= n ; j++) 
    {         
        c[i][j]=0;
        for(k = 1; k<= n; k++)
            c[i][j]+=a[i][k] * b[k][j];

    }

解:++x是基本语句,执行次数为n^{^{3}}次,所以时间复杂程度为O(n^{^{3}}),称为立方阶。

(5)

for(i=0;i<=n;++i){
    for(j=1;j<=i-1;++j){
        ++x;
    }
}

解: ++x是基本语句,执行次数为:(n(n-1))/2,所以时间复杂度为O(n^{^{2}})。

(6)

for(i=1;i<=n;i=2*i){
    ++x;
}

解答:++x是基础语句,设其执行次数为T(n),时间复杂

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值