掌握选择结构的程序设计思想。完整的源程序:提醒:以上程序也可将case 2换成default,思考一下为什么?项目3:运输公司对用户计算运费。根据距离s的取值范围不同,折扣也相应发生变化,因此该程序为选择结构的程序,可以使用if语句,也可以使用switch语句。在编写程序时,距离s取值区间两端的数据都是250的整数倍,因此,可以通过s/250的方法将区间转换成用整型数据来表达,以便使用switch语句编写程序。......
2025-09-30
线性表是常见的一种数据逻辑结构,线性表各数据元素之间的逻辑结构可以用一个简单的线性结构表示出来,其特征是:除第一个和最后一个元素外,任何一个元素都只有一个直接前驱和一个直接后继;第一个元素无前趋而只有一个直接后继;最后一个元素无后继而只有一个直接前趋。单链表是一种链式存储结构,是处理线性表的常用的数据表示形式。
1.单链表使用的数据结构
10.4 结点结构
单链表的数据元素称为结点。单链表的每个结点由两部分组成:一个是用于存储实际数据的存储区,称为数据域;另一个是用于提供链表的链接作用的指针,称为指针域。其结点结构如图10.4所示。
在单链表的构造中,除第一个结点之外,其余每一个结点的存放位置由该结点的前驱在其指针域中指出。为了确定单链表第一个结点的存放位置,使用一个指针变量指向链表的表头,这个指针变量称作“头指针”。单链表的最后一个结点没有后继,为了表示这个概念,该结点的指针域赋值为空(NULL或∧)。单链表的一般结构如图10.5所示。
图10.5 单链表的存储结构
常用的结点结构C语言描述方式如下:
其中:elementtype是某种用于表示结点数据域的数据类型,可以是基本数据类型或者是结构体之类的构造数据类型;NODE是结点类型struct node的别名。
【例10.11】 下面示例中的数据类型NODE定义如下:
/功能:构造示例程序使用的数据结构,存入头文件ex1011.h/
设计单链表基本运算实现程序需要使用存储分配和释放标准库函数,常用的是存储分配函数malloc和存储释放函数free,这两个标准库函数的使用方法在6.5.1小节中已经讨论过,请读者自行参考。
2.单链表的构造
单链表的构造方法有两种:一种是将新结点添加到链表的头部,一种是将新结点添加到链表的尾部。下面程序段描述的是用第一种方法构造单链表。
在函数中首先创建单链表的头结点,构成一个空的单链表。然后根据所需要创建的链表长度,反复地依次为每一个结点分配存储空间、输入结点的数据、将新建的结点插入到单链表的头结点之后。
3.单链表的输出
单链表的输出实质上就是对某一头指针指向的单链表进行遍历,也就是将单链表中的每一个数据元素结点从表头开始依次处理一遍。下面程序段描述了单链表输出的基本概念。
4.单链表上的插入运算
如果将一个新的结点插入链表中间的某个位置,其操作只需要如图10.6所示修改两个结点的指针域即可。
图10.6 在单链表中插入新结点
(1)p->next=q->next(2)q->next=p
实现在单链表上插入一个结点的基本过程如下:
①创建一个新结点;
②按要求寻找插入点;
③被插入结点的指针域指向插入点结点的后继结点;
④插入点结点的指针域指向被插入的结点。
下面的程序段描述带头结点的单链表中实现的插入结点运算。
在函数中首先创建被插入的新结点,然后通过对结点某一数据域(本例中为name)进行比较,确定新结点的插入位置,最后将新建结点插入链表中。
5.单链表上的删除运算
在单链表中删除一个结点的实质就是将该结点从链表中移出,使得被删除结点的原后继结点成为被删除结点原前趋结点的直接后继,如图10.7所示。(https://www.chuimin.cn)
图10.7 在单链表中删除结点
(1)q->next=p->next(2)free(p);
删除结点被从链表中移出后,仍然占据存储单元,必须使用存储释放函数将其所占据的存储单元释放归还系统。
实现在单链表中删除一个数据元素结点的基本过程如下:
①查找被删除结点以及其前趋结点;
②被删除结点的前趋结点指针域指向被删除结点的直接后继结点;
③释放被删除结点。
下面程序段描述带头结点的单链表中实现的删除结点运算。
/Name:ex101104.c
在函数中首先按某种条件定位被删除结点和它的前趋结点,然后将被删除结点从链表中取出并释放其所占的存储空间。
6.单链表操作综合示例
上面分别讨论了单链表的最基本运算,可以将这些函数组织起来形成一个能够对单链表进行简单处理的程序,下面的示例展示了组织方法,请读者结合前面对单链表各种基本运算的介绍自行分析。
【例10.12】 带头结点单链表基本操作示例。要求设计一个简单的菜单,根据对菜单项的选择分别实现带头结点单链表的构造操作、插入操作、删除操作和输出操作。
相关文章
掌握选择结构的程序设计思想。完整的源程序:提醒:以上程序也可将case 2换成default,思考一下为什么?项目3:运输公司对用户计算运费。根据距离s的取值范围不同,折扣也相应发生变化,因此该程序为选择结构的程序,可以使用if语句,也可以使用switch语句。在编写程序时,距离s取值区间两端的数据都是250的整数倍,因此,可以通过s/250的方法将区间转换成用整型数据来表达,以便使用switch语句编写程序。......
2025-09-30
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2025-09-30
C语言中逻辑运算符及其含义见表3.2。表3.2逻辑运算符及其含义逻辑运算符“&&”和“||”是双目运算符,具有左结合性;“!”表3.3逻辑运算真值表C语言中进行逻辑表达式求值运算时,不但要注意逻辑运算符本身的运算规则,而且还必须要遵循下面的两条原则:·对逻辑表达式从左到右进行求解。......
2025-09-30
可以使用typedef为结构体数据类型取一个方便程序中使用的别名。用typedef构造指定行数和列数的二维数组类型。用typedef构造指针数据类型。......
2025-09-30
算法的描述方法主要有如下几种。例如,用传统流程图表示的顺序结构如图3.2所示,用NS图表示的顺序结构如图3.2所示,表示先执行A操作,再执行B操作,两者是顺序执行的关系。......
2025-09-30
一个循环结构的循环体内又包含另外一个完整的循环结构,称为循环的嵌套。循环嵌套层数可以是多层,称为多重循环。在某些具有规律性重复计算的问题中,如果被重复计算部分的某个局部又包含着另外的重复计算问题,就可以通过使用循环的嵌套结构来处理。while和for 3种循环控制结构均可互相嵌套,并且可以多层嵌套以适应不同的应用,下面列出最常见的几种二层循环嵌套结构:多层循环嵌套时,外层循环每执行一次,内层循环就完整执行一遍。......
2025-09-30
在例7.8 中采用动态分配的办法为一个结构分配内存空间。某学生退学,可删去该结点,释放该结点占用的存储空间。这样一种连接方式,在数据结构中称为“链表”。其示意如图7.10 所示。图7.10链表示意图图7.10 中,head 是一个指针变量,存放第一个结点的首地址。链表中的每一个结点有同一种结构类型。例如一个存放学生学号和成绩的结点的结构如下:前两个成员项组成数据域,后一个成员项next 构成指针域,是一个指向stu 类型结构的指针变量。......
2025-09-30
若在表中找不到与给定条件相符合的数据,则称为不成功的查找,给出提示信息或空位置信息。本节介绍最常用的两种查找方法:顺序查找和折半查找。③基准位置数据值与查找的关键字值不相符时,在两个子集合中选取一个,重复执行①、②,直到被处理的查找集合中没有数据为止。图6.11是在一有序序列中实现对key=21进行折半查找的过程。......
2025-09-30
相关推荐