<初识数据结构+算法实现>数据结构(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

相关文章
|
5天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
64 9
|
24天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
61 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
20天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
4天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
43 16
|
4天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
32 8
|
7天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
32 4
|
8天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
32 3
|
9天前
|
存储 算法 C语言
C语言数据结构(2)
【10月更文挑战第21天】
|
21天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
31 4
|
20天前
|
存储 算法 C语言
【趣学C语言和数据结构100例】
《趣学C语言和数据结构100例》精选5个编程问题,涵盖求最大公约数与最小公倍数、字符统计、特殊序列求和及阶乘计算等,通过实例讲解C语言基础与算法思维,适合初学者实践学习。