<初识数据结构+算法实现>数据结构(C语言版)

简介: <初识数据结构+算法实现>数据结构(C语言版)

前言:

●本篇博文基于《数据结构》(C语言版)严蔚敏教授、吴伟民教授、李冬梅教授编著的教材知识及框架主线,以及参考借阅其他相关资料,结合作者的学习所记录的笔记分享。

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教

让我们先从一个著名的公式开始:

程序=算法+数据结构

这个公式由图灵奖获得者尼古拉斯·沃斯(Niklaus Wirth)(瑞士计算机科学家)所提出。

1.什么是数据结构?

数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。

◆解释:数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

2.为什么要学数据结构?

★编程基础

★计算机及相关专业考研考博课程

★计算机等级考试课程

★程序员考试课程

3. 数据结构的研究内容、应用及方向:

数据结构的研究内容为: 研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作。

image.gif编辑

image.gif编辑image.gif编辑

4.基本概念和术语 :

▶数据(data)—所有能输入到计算机中去的描述客观事物的符号

          ◆ 数值性数据

          ◆非数值性数据(多媒体信息处理)

▶数据元素(data element)—数据的基本单位,也称结点(node)或记录(record)

▶数据项(data item)—有独立含义的数据最小单位,也称域(field)

三者之间的关系:数据 > 数据元素   >  数据项 

例:学生表 >  个人记录 >  学号、姓名……

▶数据对象(Data Object):相同特性数据元素的集合,是数据的一个子集

5. 数据结构的两个层次:

逻辑结构--- 数据元素间抽象化的相互关系,与数据的存储无关,独立于计算机,它是从具体问题抽象出来的数学模型。

存储结构(物理结构)---- 数据元素及其关系在计算机存储器中的存储方式。

★逻辑结构★

▲划分方法一

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

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

▲划分方法二

集合——数据元素间除“同属于一个集合”外,无其它关系image.gif编辑

线性结构——一个对一个,如线性表、栈、队列

image.gif编辑

树形结构——一个对多个,如树

image.gif编辑

图形结构——多个对多个,如图

image.gif编辑

★存储结构★:

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

◆链式存储结构——借助指示元素存储地址的指针表示数据元素间的逻辑关系

image.gif编辑

image.gif编辑  

image.gif编辑

6.数据类型:

6.1定义:在一种程序设计语言中,变量所具有的数据种类

         ♦FORTRAN语言:整型、实型、和复数型

         ♦C语言:

                 ✔基本数据类型: char  int  float  double  void

                 ✔构造数据类型:数组、结构体、共用体、文件

数据类型是一组性质相同的值的集合, 以及定义于这个集合上的一组运算的总称

6.2抽象数据类型 (ADTs: Abstract  Data Types)

            ☛更高层次的数据抽象

            ☛由用户定义,用以表示应用问题的数据模型

            ☛由基本的数据类型组成, 并包括一组相关的操作

image.gif编辑

image.gif编辑

image.gif编辑

6.3抽象数据类型的表示与实现

抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现。它有些类似C语言中的结构(struct)类型,但增加了相关的操作 教材中用的是类C语言(介于伪码和C语言之间)作为描述工具

(1) 预定义常量及类型

★函数结果状态代码

#define OK 1

#define ERROR 0

#define OVERFLOW -2

★Status是函数返回值类型,其值是函数结果状态代码。

typedef  int  Status;

(2)数据元素被约定为ElemType 类型,用户需要根据具体情况,自行定义该数据类型。

(3)算法描述为以下的函数形式:            

函数类型 函数名(函数参数表)            

{                

                语句序列;        

}

(4)内存的动态分配与释放

(5)赋值语句 (6)选择语句 (7)循环语句

(8)使用的结束语句形式有:

函数结束语句  return

循环结束语句  break;

异常结束语句  exit(异常代码);

(9)输入输出语句形式有: 输入语句

(10)扩展函数有: 求最大值  max 求最小值  min

7.算法和算法分析

7.1算法定义:一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列

7.2算法的描述:  

☛自然语言  

☛流程图  

☛程序设计语言  

☛伪代码

7.3算法的特性:

       ◆输入  有0个或多个输入  

       ◆输出  有一个或多个输出(处理结果)  

       ◆确定性  每步定义都是确切、无歧义的  

       ◆有穷性  算法应在执行有穷步后结束  

       ◆有效性  每一条运算应足够基本

7.3算法的评价

       ✔正确性

       ✔可读性

       ✔健壮性

       ✔高效性(时间代价和空间代价)

7.4算法的效率的度量

▶算法效率:用依据该算法编制的程序在计算机上执行所消耗的时间来度量

              ★事后统计

              ★事前分析估计

  ♜事后统计:利用计算机内的计时功能,不同算法的程序可以用一组或多组相同的统计数据区分

缺点:

            ♦必须先运行依据算法编制的程序

            ♦所得时间统计量依赖于硬件、软件等环境因素,掩盖算法本身的优劣  

  ♜事前分析估计: 一个高级语言程序在计算机上运行所消耗的时间取决于:      

          ♦依据的算法选用何种策略      

          ♦问题的规模      

          ♦程序语言      

         ♦编译程序产生机器代码质量      

         ♦机器执行指令速度    

同一个算法用不同的语言、不同的编译程序、在不同的计算机上运行,效率均不同,———使用绝对时间单位衡量算法效率不合适  

8.时间复杂度和空间复杂度:

8.1时间复杂度:image.gif编辑

题例1:image.gif编辑

n * n阶矩阵加法:
for( i = 0; i < n; i++)
  for( j = 0; j < n; j++)
    c[i][j] = a[i][j] + b[i][j];
image.gif

题例2:

image.gif编辑 题例3:

image.gif编辑

void exam ( float x[ ][ ], int m, int n ) {
     float sum [ ];
     for ( int i = 0; i < m; i++ ) { 
         sum[i] = 0.0;                      
         for ( int j = 0; j < n; j++ ) 
      sum[i] += x[i][j];  
     }
     for ( i = 0; i < m; i++ )
         cout << i << “ : ” <<sum [i] << endl; 
 }
image.gif

题例4:

image.gif编辑

N×N矩阵相乘
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]=c[i][j]+a[i][k]*b[k][j];
     }
image.gif

题例5:

image.gif编辑

for( i=1; i<=n; i++) 
         for (j=1; j<=i; j++) 
             for (k=1; k<=j; k++)
    x=x+1;
image.gif

image.gif编辑

image.gif编辑

image.gif编辑

题例6:image.gif编辑

有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同

题例7:

image.gif编辑image.gif编辑

8.2空间复杂度:

空间复杂度:算法所需存储空间的度量,记作:    S(n)=O(f(n)) 其中n为问题的规模(或大小)

算法要占据的空间

       ♦算法本身要占据的空间,输入/输出,指令,常数,变量等

       ♦算法要使用的辅助空间

image.gif编辑

算法1:S(n) = O(1) 原地工作

算法2:S(n) = O(n)

后记:

本篇博文是作者对《数据结构》(C语言版)的第一篇学习记录,并未涉及算法代码实现。算法代码的实现在《数据结构》学习笔记专栏的后续笔记。

写在最后的话:

非常荣幸每一位读者能够阅读到此处!你好!来自现在以及未来的朋友!

今天期末考试结束了,这学年真的很难忘,很多地方需要总结。  就到这里吧,收拾行李回家了!

image.gif编辑

                                                                     ——By 作者:新晓·故知

                                                                                          2022.01.05

相关文章
|
23天前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
45 1
|
2天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
2天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
2天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
2天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
2天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
2天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
2天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
24天前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
24天前
|
算法 索引
【初阶数据结构篇】单链表算法题进阶
深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。