• 数据结构


    学习C语言,是简单的学习了C语言的语法以及简单的算法和程序。C语言是面向过程的语言,所以我们更加专注算法的设计,以及算法在程序上的具体实现。之前,我们没有系统的介绍数据的封装,数据结构让我们系统的了解数据是如何封装和组织的。

    首先,我们来考虑这样一个事情,如何利用数据描述一样事物。比如说,在做的各位同学,我们如何把诸位的信息存储到计算机上。一个学生的信息有哪些?学生的姓名,年龄,性别,学号等等。我们使用结构体的形式来封装这些信息,也就是说,自定义一个类型,用这个类型来描述学生。

    我们把学生的很多基本信息封装到student这个自定类型里面,使用的时候,只要对学生的信息分别初始化就可以了。

    方法一:

    方法二:

    我们有了学生,就可以组建班级了。

    众所周知,班级是由很多学生组成的。描述一个班级的信息,需要包括学生这个类型。

    同时,班级内的资源是有限的。首先,教室的空间有限,其次,教室里的桌椅板凳,以及计算机的数目也是有限的。所以,一个班级是有一定的容量的,即最多能容纳的学生个数。

    因此,我们如下进行定义一个班级:

    这个班级最多能容纳的学生数目是40,stu_num是用来表示当前这个班级内部学生数目的。

    当这个班级增加一个学生,stu_num就会增加一。

    我们通过下面的方式定义一个班级

    定义班级后,我们要为这个班级的stu_num赋值为0,表示当前班级中的学生数目为0。

    我们通过如下方式,向班级中插入学生。

    注意,每次插入一个学生,就要为这个班级的stu_num加一。

    这个例子为了简要演示插入操作,只向这个班级中插入2个学生。

    下面表示了如何输出这个班级中的学生信息:

    在屏幕上会打印出这个班级中的学生的信息。

    以上的内容是为了说明,在C程序中,我们如何对数据进行封装,来表示我们想要表达的具体含义。

    对于结构体的定义,如果你觉得struct这个关键字比较麻烦,可以使用typedef来定义一下这个类型的别名。

    上图是未用typedef的方式,student是这个结构体的名字。

    上图是使用了typedef的方式,student是我们利用typedef来定义的一个类型别名。我们未对这个结构体定义类型名称,直接使用typedef定义它的别名。

    当然,也可以这样做:

    这样定义了这个结构体的名字sutdent_def,并且为其定义了一个别名student。后面我们再使用这个结构体的时候,就无需加上struct这个关键字了。这样我们使用起来,比较像C默认的类型。

    另一个问题,我们这样去定义class_1,只是定义了一个局部变量。退出这个函数,我们就找不到它了。当然,我们可以定义一个全局变量,但是定义过多的全局变量不是一个好的风格。我们采用在堆上为这个变量分配空间的方法。

    我们定义了一个class类型的指针class_1。我们为这个指针在堆上分配空间。

    访问结构体成员的过程中,我们需要使用->这个操作符。因为class_1是一个指针。

    我们可以用类似这个种模式,去表示一个顺序存储的线性表。

    顺序表的定义如下:

    数据存储在一个数组中,当前表中的最后一个元素下表存储在last这个变量中。

    我们编写函数,来实现创建一个空线性表,为表插入一个值,删除一个值,以及判断表的状态等功能。

    创建一个空表:

    判断表是否为空表:

    判断表是否为满表:

    清空一个表:

    遍历一个表,将其中的元素打印出来:

    求一个表的长度(元素个数):

    往一个表中的某一个位置上插入一个元素:

    在表中的某一个位置上删除一个元素:

    在表中查找一个元素,返回其下标值:

    删除表中的所有重复元素:

    相比顺序表,链式表在插入和删除操作上有很高的效率。

    链式表定义如下:

    数据域保存的是一个整型的数字,此外还有个指向下一个节点的指针。

    这个结构体定义定义了两个类型,一个是linknode节点类型,一个是linklist节点指针类型。Linklist用来表示指向一个链式表的指针。

    创建一个空链表的函数如下:

    这个函数返回了创建好的链表的表头节点地址。我们创建的是一个有头链表,空链表的标志是表头节点的下一节点地址为NULL。

    然后,我们来判断一下链表是否为空:

    判断链表的长度:

    遍历链表,打印出链表中每个元素的具体值:

    往指定的位置插入一个元素:

    指定位置删除一个元素:

    删除在链表中存在的元素:

    清空一个链表:

    将链表元素翻转存储:

  • 相关阅读:
    趣味网站、趣味应用
    趣味网站、趣味应用
    论文写作的句型
    Python Tricks(二十一)—— 排列组合的计算
    Python Tricks(二十一)—— 排列组合的计算
    辨异 —— 有两人生日在同一天、只有两人生日在同一天
    辨异 —— 有两人生日在同一天、只有两人生日在同一天
    品味电影
    品味电影
    HDU 4414 Finding crosses (DFS + BFS)
  • 原文地址:https://www.cnblogs.com/kalo1111/p/3221157.html
Copyright © 2020-2023  润新知