单分支if语句的执行过程如图3.3所示。使用if语句实现单分支选择结构程序时还需要注意下面两点:图3.3if语句的执行流程①作为条件的表达式一般来说应该是关系表达式或逻辑表达式,但C语言中允许表达式是任何可以求出0值或非0值的表达式。同时还需要提醒读者,此处分析的关于条件表达的方法在C程序设计的所有控制结构中都是相同的,今后涉及此问题时不再赘述。......
2023-11-20
线性表是常见的一种数据逻辑结构,线性表各数据元素之间的逻辑结构可以用一个简单的线性结构表示出来,其特征是:除第一个和最后一个元素外,任何一个元素都只有一个直接前驱和一个直接后继;第一个元素无前趋而只有一个直接后继;最后一个元素无后继而只有一个直接前趋。单链表是一种链式存储结构,是处理线性表的常用的数据表示形式。
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所示。(www.chuimin.cn)
图10.7 在单链表中删除结点
(1)q->next=p->next(2)free(p);
删除结点被从链表中移出后,仍然占据存储单元,必须使用存储释放函数将其所占据的存储单元释放归还系统。
实现在单链表中删除一个数据元素结点的基本过程如下:
①查找被删除结点以及其前趋结点;
②被删除结点的前趋结点指针域指向被删除结点的直接后继结点;
③释放被删除结点。
下面程序段描述带头结点的单链表中实现的删除结点运算。
/*Name:ex101104.c
在函数中首先按某种条件定位被删除结点和它的前趋结点,然后将被删除结点从链表中取出并释放其所占的存储空间。
6.单链表操作综合示例
上面分别讨论了单链表的最基本运算,可以将这些函数组织起来形成一个能够对单链表进行简单处理的程序,下面的示例展示了组织方法,请读者结合前面对单链表各种基本运算的介绍自行分析。
【例10.12】 带头结点单链表基本操作示例。要求设计一个简单的菜单,根据对菜单项的选择分别实现带头结点单链表的构造操作、插入操作、删除操作和输出操作。
有关C语言程序设计基础(第3版)的文章
单分支if语句的执行过程如图3.3所示。使用if语句实现单分支选择结构程序时还需要注意下面两点:图3.3if语句的执行流程①作为条件的表达式一般来说应该是关系表达式或逻辑表达式,但C语言中允许表达式是任何可以求出0值或非0值的表达式。同时还需要提醒读者,此处分析的关于条件表达的方法在C程序设计的所有控制结构中都是相同的,今后涉及此问题时不再赘述。......
2023-11-20
掌握选择结构的程序设计思想。完整的源程序:提醒:以上程序也可将case 2换成default,思考一下为什么?项目3:运输公司对用户计算运费。根据距离s的取值范围不同,折扣也相应发生变化,因此该程序为选择结构的程序,可以使用if语句,也可以使用switch语句。在编写程序时,距离s取值区间两端的数据都是250的整数倍,因此,可以通过s/250的方法将区间转换成用整型数据来表达,以便使用switch语句编写程序。......
2023-11-18
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
A.与参数x的类型相同B.无法确定C.void类型D.int类型3.为了避免嵌套的条件语句if-else的二义性,C语言规定()。A.else与缩排位置相同的if配对B.else与同一行上的if配对C.else与其之后最近的if配对D.else与其之前最近的尚未配对的if配对4.设x、y、z和k都是int型变量,则执行表达式:x=后,x的值为()。A.7 B.6 C.5 D.47.在C语言程序中,用关键字()定义无符号型变量。else语句实现两个分支。......
2023-09-19
C语言中逻辑运算符及其含义见表3.2。表3.2逻辑运算符及其含义逻辑运算符“&&”和“||”是双目运算符,具有左结合性;“!”表3.3逻辑运算真值表C语言中进行逻辑表达式求值运算时,不但要注意逻辑运算符本身的运算规则,而且还必须要遵循下面的两条原则:·对逻辑表达式从左到右进行求解。......
2023-11-20
在例7.8 中采用动态分配的办法为一个结构分配内存空间。某学生退学,可删去该结点,释放该结点占用的存储空间。这样一种连接方式,在数据结构中称为“链表”。其示意如图7.10 所示。图7.10链表示意图图7.10 中,head 是一个指针变量,存放第一个结点的首地址。链表中的每一个结点有同一种结构类型。例如一个存放学生学号和成绩的结点的结构如下:前两个成员项组成数据域,后一个成员项next 构成指针域,是一个指向stu 类型结构的指针变量。......
2023-10-21
针对不同的实际应用,数据排序方法有很多种。本节介绍两种常用排序方法的基本思想和实现方法,帮助读者初步理解排序方法的计算机解决思路。②不考虑已排好序的数据,将剩下的数据作为待排序列。编写程序实现冒泡排序算法,对随机生成的10个3位整数按升序进行排序并输出。......
2023-11-20
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2023-11-20
相关推荐