第九章:结构体
c程序设计 第九章 结构体
一、概念题二、判断题1. 结构体中的成员不可以单独使用(F)。
2. 成员名可以与程序中的变量名相同,二者不代表同一对象(T)。
3. 不能将一个结构体变量作为一个整体进行输入输出(T)。
4. 结构体变量所占内存长度是各成员占的内存长度之和(T)。
5. 结构体中的成员不可以单独使用(F )。
9. 一个结构体变量的指针就是该变量所占内存段的起始地址(T)。
10. 用结构体变量作实参,形参也必须是同类型的结构体变量(T )。
三、单选题1. 设变量定义如下,则对其中的结构分量num正确的引用是( )。
struct student {int num ;char name[20];float score;} stud[10];A. stud[1].num=10;B. student.stud.num=10;C. struct.stud.num=10;D. struct student.num=10;2. 已知职工记录描述如下,设变量w中的“生日”是“1993年10月25日”,下列对“生日”的正确赋值方式是()。
struct worker{int no;char name[20];char sex;struct birth{ int day; int month; int year;}a;};struct worker w;A day=25;month=10;year=1993;B w.birth.day=25; w.birth.month=10; w.birth.year=1993;C w.day=25; w.month=10; w.year=1993;D w.a.day=25; w.a.month=10; w.a.year=1993;3. 对于以下的变量定义,语句( )在语法和语义上都是正确的。
struct node {float x,y;char s[10];} point={1,2,”abc”},*p;A. *p=point;B. p=&point;C. point=p;D. p->x=point.y;4. 设有以下语句typedef struct S{ int g;char h;} T;则下面叙述中正确的是()。
C语言 第九章 结构体数据类型期末测试习题与答案
程序运行后的输出结果是( )。
A.SunDan 20044
B.YangSan 20041
C.SunDan 20042
D.LiSiGuo 20042
参考答案:D
3、以下程序运行的结果是_( )。
#nclude”stdio.h
main()
{
struct date
{
int year , month , day ;
D.struct color
{ int red;
int green;
int blue;
} c l;
参考答案:B
7、有以下程序:
struct stu
{
char[10];
float score[3];
};
main( )
{
struct stu s[3]={{"20021",90,95,85},
{"20022",95,80,75},
} today ;
printf(“%d\n”,sizeof(struct date));
}
A.10
B.6
C.8
D.12
参考答案:D
4、设有如下说明
typedef struct ST
{
long a;
int b;
char c[2];
} NEW;
则下面叙述中正确的是______。
A.ST是一个结构体类型
B.NEW是一个结构体类型
A.typedef struct
{ int red;
int green;
int blue;
} COLOR;
COLOR cl;
B.struct color cl
结构和联合.ppt
9.2 结构体数组
当表示(存储)一组同类型的数据时可以采用数组
9.2.1 结构体数组的定义 struct student a[10];
9.2.2 结构体数组的初始化 struct student a[3]={{……},{……},{……}};
9.2.3 结构体数组的元素引用 struct student a[10];
struct node *search(struct node *head,int m) { /*在带头节点的单链表中查找值为m的节点 */
struct node *p; p=head->next; while(p!=NULL && p->data!=m)
p=p->next; return p; }
s=0.0; for(j=0;j<3;j++)
s+=a[i].score[j]; a[i].sum=s; a[i].aver=s/3; } }
int main() {
struct student a[2]; in0(a,2); pp(a,2); out0(a,2); }
9.5 引用自身的结构
一般来说,都应该遵循先定以后使用的原则,但在 结构体中可以引用自身(此时自身还没定义好),引用 只能采用指针不能使用结构变量
int x; struct node *h,*r,*f; h=r=(struct node *)malloc(sizeof(struct node)); scanf("%d",&x); while(x){
f=(struct node *)malloc(sizeof(struct node)); f->data=x; r->next=f; r=f; scanf("%d",&x); } r->next=NULL; return h; } void printlink(struct node *head) /*输出带头节点的单链表*/ { struct node *p; p=head->next; while(p!=NULL){ printf("%6d",p->data); p=p->next; } printf("\n"); }
第九章 结构体和共用体
– 【例9.5】用指向结构体变量的指针变量引用结构体变量
14
• (2)结构体数组的指针
– 结构体指针具有同其他类型指针一样的特征和使用方 法。结构体指针变量也可以指向结构体数组。同样结 构体指针加减运算也遵照指针计算规则。例如,结构 体指针变量加1的结果是指向结构体数组的下一个元素。 结构体指针变量的地址值的增量取决于所指向的结构 体类型变量所占存储空间的字节数。 – 【例9.6】有4名学生,每个学生的属性包括学号、姓名、 成绩,要求通过指针方法找出成绩最高者的姓名和成 绩。 – 程序设计分析:将学生信息存入数组中,通过指针依 次访问每一个学生信息,比较其分数,从而求出获得 最高分学生在数组中的位置。
– 在结构体变量定义之后对结构体变量赋值时可 以采用各成员赋值,用输入语句或赋值语句来 完成。 – 【例9.2】在定义后对结构体变量赋初值。 – 【例9.3】有两条记录,记录包括数量(num)和 价钱(price),编写一程序完成总价钱的计算。
11
9.2 结构体数组与结构体指针
9.2.1结构体数组
5
• ④结构体类型的定义只说明了该类型的构成形式,系统并 不为其分配内存空间,编译系统仅给变量分配内存空间 • ⑤结构体成员的类型也可以是另外一个结构体类型。如: 1. struct date 2. { int year; 3. int month; 4. int day; 5. }; 6. struct student 7. { 8. int num; 9. char name[20]; 10. char sex; 11. struct date birthday; 12. int score[5]; 13.}; • 结构体成员的类型如果是另外一个结构体类型,同样必须 遵守先定义后使用的原则。如上例中,先定义struct date类 6 型,再定义struct student类型。
结 构 体
▪ 成员number是整型,占4个 字节;
name
g1
▪ 成员name是字符型数组,占 10个字节
▪ 成员price是实型,占4个字 节;
price
▪ 变量g1和g2各占18个字节存
储空间。
结构体变量的定义(续)
❖ (2)定义结构体类型的同时定义变量 struct goods { int number; char name[10]; float price; } g1, g2 ;
❖ 结构体变量的成员可以像普通变量一样进行各 种运算和操作。例如: g1.number=10446; strcpy(, “apple”) g1.price=1.8; printf(“%d, %s”, g1.number, ); scanf(“%f”,&g1.price);
1.2 结构体变量的定义
❖ (1)使用结构体类型名定义变量 struct goods { int number; char name[10]; float price; }; struct goods g1, g2 ;
结构体变量的定义(续)
❖ 各成员按定义顺序依次存放,
number ❖成员的存储空间是相邻的。
他位置定义该结构体类型的变量,也无法将它们用作函数参数。
结构体变量的定义(续)
❖ (4)使用typedef
▪ typedef可为一个已存在的数据类型定义一 个类型名。
typedef int integer;
▪ 为int类型指定一个新的类型名integer。
typedef float real;
▪ 为float类型指定一个新的类型名real。
结构体变量的使用(续)
❖ 结构体变量不能作为一个整体进行输入输出等运算操作。 printf(“%d, %s, %f”, g1); /*这样是错误的*/
C语言第9章结构体、共用体、枚举
结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
什么是结构体
什么是结构体?结构体(Struct)是一种在编程中常用的自定义数据类型,用于将不同类型的数据组合在一起。
结构体允许我们创建一个包含多个字段的复合数据类型,每个字段可以是不同的数据类型。
结构体的主要特点如下:1. 自定义数据类型:结构体允许我们创建自定义的数据类型,以便更好地表示和组织数据。
通过结构体,我们可以将多个相关的数据字段组合在一起,形成一个逻辑上的整体。
2. 字段:结构体由多个字段组成,每个字段可以是任何合法的数据类型,包括基本类型(如整数、浮点数、字符等)和其他自定义类型(如结构体、数组等)。
3. 访问字段:可以通过结构体的实例(也称为对象或变量)来访问和操作字段。
通过使用点运算符(.)和字段名,我们可以访问和修改结构体中的各个字段。
4. 内存布局:结构体的字段在内存中是按照声明的顺序依次存储的。
这意味着,结构体的字段在内存中是连续存储的,可以通过偏移量来访问每个字段的值。
5. 初始化:创建结构体实例时,可以通过提供字段的值来初始化结构体的字段。
初始化可以在创建结构体实例的同时进行,也可以在创建后逐个字段进行。
创建结构体的语法因编程语言而异,以下是一些常见的示例:在C语言中,创建一个表示学生的结构体的示例:```cstruct Student {int id;char name[50];int age;};```在C++语言中,创建一个表示点的结构体的示例:```c++struct Point {int x;int y;};```在Java语言中,使用关键字`class`来定义一个表示人的结构体的示例:```javaclass Person {int age;String name;}```在Python语言中,使用`class`关键字来定义一个表示汽车的结构体的示例:```pythonclass Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = year```通过结构体,我们可以创建结构体的实例,并访问和操作其字段。
结构体的定义规则
结构体的定义规则一、什么是结构体结构体(Structure)是一种用户自定义的数据类型,它是由一组不同类型的成员变量组成的。
通过结构体,我们可以将不同类型的数据组合在一起,形成一个整体的数据结构。
结构体可以包含多个不同类型的成员变量,每个成员变量都可以有自己的数据类型和名称,类似于一个小型的数据表或者实体。
在C语言中,结构体是一种很重要的数据类型,它可以用于表示复杂的数据结构,提高程序的灵活性和可读性。
二、结构体的定义语法结构体的定义语法如下:struct 结构体名 {成员变量1的数据类型成员变量1的名称;成员变量2的数据类型成员变量2的名称;...};三、结构体成员的访问与初始化结构体定义之后,我们可以通过结构体名加点操作符来访问结构体的成员变量。
例如,我们定义了一个名为Person的结构体,其中包含了name和age两个成员变量,我们可以使用以下方式来访问和修改结构体的成员变量:struct Person {char name[20];int age;};int main() {struct Person p;strcpy(, "Tom");p.age = 20;printf("Name: %s, Age: %d\n", , p.age);return 0;}上述代码中,我们首先定义了一个Person结构体类型的变量p,然后使用strcpy函数将字符串”Tom”复制给了,再将整数20赋值给了p.age。
最后,使用printf函数输出了结构体的成员变量。
另外,我们还可以使用结构体初始化器来为结构体的成员变量赋初值。
例如,我们可以使用以下方法来初始化上述的Person结构体:struct Person p = {"Tom", 20};四、结构体的嵌套与指针结构体可以嵌套定义,即一个结构体中的成员变量也可以是另一个结构体类型的变量。
通过结构体的嵌套,我们可以构建更复杂的数据结构。
第9章_用户建立的数据类型
第九章 结构体与共用体一、 教案头: 教学内容第九章 结构体与共用体2 学时认知目标(应知)技能目标(应会): 了解结构体的意义和基本概念 : 能够正确定义和引用结构体变量 : 能够采用指针引用结构体变量 : 能够通过指针引用结构体数组 : 使用结构体变量作函数参数 : 使用结构体指针作函数参数 : 掌握共用体的结构和特点 : 掌握枚举的结构和特点 :typedef 定义类型的意义 : 引用结构体变量成员,引用结构体数组元素的成员 : 结构体指针变量与其所指变量的关系 : 结构体指针变量作函数参数 : 通过指针引用结构体数组 : 通过指针操作字符串 : 掌握共用体变量的定义和引用 : 了解在程序中枚举的应用 : 读程序能够理解typedef 定义的类型 情感目标(理解)教学目标(重点难点)教学目标 : 培养学生自主探究学习、求真务实的品德 : 培养学生细致钻研的学风 : 培养学生努力拓展思维;理论与实际相结合的思维习惯 : 指向结构体的指针 : 结构体数组成员的引用 : 结构体变量作函数参数 : 共用体的存储特性 : 链表的结构特点和操作处理 内容概述 Ø 教材章节: 9.1 结构体类型和结构体变量 9.2 结构体数组 9.3 结构体指针 9.4 用指针处理链表 9.5 共用体类型 9.6 枚举类型 9.7 用typedef命名类型 Ø 教授内容: l 本章讲解了什么是结构体类型,以及如何使用结构类型变量、结构体数组、结构体指针,什么是共用体,它和结构体的异同,以及共用体变量的引用 l 本章还讲解了枚举类型、以及如何使用typedef命名类型 能力训练及任务案例 任务9-1: 结构体变量初始化 任务9-2:结构体数组举例 任务9-3: 指向结构体变量的指针变量示例 任务9-4: 指向结构体数组元素的指针的应用 任务9-5: 结构体变量作函数的参数示例 任务9-6: 指向结构体的指针作函数参数示例任务9-7: 建立静态链表示例 任务9-8:建立动态链表示例 任务9-9: 单链表的输出 任务9-10:共用体示例任务9-11:枚举类型示例 任务9-12:学生信息表(单链表)的基本操作参考资料C 程序设计教程,谭浩强 著,清华大学出版社,2007.07C 程序设计教程学习辅导,谭浩强 编著,清华大学出版社,2007.10 网络学堂:考试系统:无忧网络考试系统 http://10.1.89.100/webexam二、 教学设计 1.专业英语词汇 英文词汇中文名structure 结构member 成员tag 标记function 函数Enumerate 枚举 Define 定义 Union 联合(共用体) create 创建Insert 插入delete 删除Modify / update 修改 2.教学方法 引入结构体概念后采用项目拓展、实例分析引导,递进驱动。
《C语言程序设计》 课后习题答案 高等教育出版社
《C语言程序设计》课后习题答案高等教育出版社《C语言程序设计》课后习题答案高等教育出版社第一章:C语言概述1. C语言的特点C语言是一种以处理底层任务和系统编程为目标的高级编程语言。
其特点包括语法简洁、执行效率高、可移植性强等。
第二章:C语言基本数据类型1. C语言中的基本数据类型C语言中的基本数据类型包括整型、字符型、浮点型等。
整型可以进一步细分为有符号整型和无符号整型。
第三章:C语言运算符1. C语言中的运算符C语言中常见的运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符等。
这些运算符用于执行各种数学和逻辑操作。
第四章:C语言控制语句1. C语言中的条件语句C语言提供了if语句和switch语句来实现条件判断。
if语句用于执行基于布尔表达式的条件分支,而switch语句用于根据不同的值执行不同的代码块。
第五章:C语言函数1. C语言中的函数定义和调用函数是C语言中的基本模块,用于封装可重用的代码。
函数定义包括函数返回类型、函数名、参数列表和函数体等部分。
第六章:C语言数组1. C语言中的数组定义和使用数组是一组相同类型的数据元素的集合。
C语言中可以使用数组来存储和操作大量数据。
第七章:C语言指针1. C语言中的指针概念指针是一种变量,它存储了内存地址。
通过指针,可以直接访问和修改对应内存地址中的数据。
第八章:C语言字符串1. C语言中的字符串操作字符串是由一系列字符组成的数据类型。
C语言通过字符数组来表示和操作字符串。
第九章:C语言结构体1. C语言中的结构体定义和使用结构体是一种自定义的复合数据类型,它可以包含多个不同类型的成员变量。
第十章:C语言文件操作1. C语言中的文件读写操作文件操作是一种重要的数据输入和输出方式。
C语言提供了一系列函数来实现文件的读写操作。
总结:通过解答以上习题,我们可以更好地掌握C语言的各个方面,提升我们的编程能力和解决问题的能力。
希望本文对读者有所帮助。
Fortran结构体PPT课件
program clerkrecord
implicit none
integer :: k, i
type clerk
! 定义结构体类型
integer num
character(15) name
real sal
end type clerk
type (clerk), dimension(150):: cl ! 定义结构体数组
TYPE STUDENT
CHARACTER(15) NAME
INTEGER
MARK
INTEGER
GRADE
END TYPE STUDENT
TYPE (STUDENT)::STRE (N)
INTEGER I, N, KEY
I=1
DO WHILE((STRE (I)%MARK.NE.KEY).AND.(I.LE.N))
i=1
do while (stre(i)% MARK <new% MARK. and. i<=N)
i=i+1
end do
do j=N, i, -1
stre(j+1)=stre(j)
end do
stre(i)=new
end
12
! 顺序查找
SUBROUTINE SORT_SEARCH(STRE, N, KEY)
read *, cl(i).sal end do do i=1, 150 if(cl(i).sal<500) then ! 打印 工资<500的职工信息 及计数
k=k+1 print*, cl(i).num, " ", cl(i).name, " ", cl(i).sal end if end do Print *, k end
派生类数据类型与结构体本章主要介绍派生类数据类
例 9.3 、学生信息包含如下数据项:姓名、性 别、学号、年龄和 5 门功课的成绩:语文、数 学、物理、化学、英语,要求输入三个学生的 记录,打印出相关信息与总成绩。 分析:学生的成绩有5门,可以将它们放在一 个名为STUDENTSCORE的结构体中,而将学生 所有记录存放在名为STUDENTRECORD的结构 体中,该结构体包含结构体STUDENTSCORE, 然后作相应处理,注意学生成绩输入语句。程 序如下:
注意:
(1)两种引用方式可以交叉使用,但为 了清晰起见,在一个程序中最好使用一 种。 (2)在含嵌套定义的结构体中,成员引 用应当嵌套使用“ %” 或“ .” ,例如,对 上面结构体 S 中成员 NUM 的引用方式为 S%STUDENT% NUM。
9.3结构体的初始化
9.3.1 利用赋值语句给结构体成员赋值 下面看一个完整的例子: 例9.1 某单位职工工资表包含的记录有: 姓名、性别、家庭住址、工资等项,现 计算三个职工工资的平均值。程序如下:
PROGRAM XUESHENGJILU REAL AVER1,AVER2,AVER3 TYPE STUDENTSCORE REAL CHINESE REAL MATH REAL PHYSICS REAL CHEMISTRY REAL ENGLISH END TYPE
TYPE STUDENTRECORD CHARACTER (17)NAME LOGICAL SEX INTEGER NUMBER INTEGER BIRTHDAY TYPE(STUDENTSCORE)::SCORE END TYPE TYPE(STUDENTRECORD)::S1,S2,S3 PRINT*,"请输入3个学生的姓名" READ*,,, PRINT*,"请输入3个学生的性别" READ*,S1.SEX,S2.SEX,S3.SEX PRINT*,"请输入3个学生的学号" READ*,S1.NUMBER,S2.NUMBER,S3.NUMBER PRINT*,"请输入3个学生的年龄" READ*,S1.BIRTHDAY,S2.BIRTHDAY,S3.BIRTHDAY
结构体
一、结构体的说明及变量的定义1.结构体类型的说明由于结构体类型不是C语言提供的标准类型,为了能够使用结构体类型,必须先说明结构体类型,描述构成结构体类型的数据项(也称成员),以及各成员的类型。
其说明形式为:struct结构体名{数据类型成员1;数据类型成员n;};其中,struct是关键字,后面是结构体类型名,两者一起构成了结构体数据类型的标识符。
结构体的所有成员都必须放在一对大括号之中,每个成员的形式为:数据类型成员名;同一结构体中不同的成员不能使用相同的名字,但不同结构体类型中的成员名可以相同。
大括号后面的分号‚;‛不能省略。
如:struct person{char name[10];char sex;int age;int stature;};这里定义了一个结构体类型 person,该类型由4个成员构成。
注意:结构体类型说明中,只是描述该结构体类型的成员,说明了一种数据类型,并不分配空间。
要使用说明的结构体类型,必须定义相应的变量,才会分配空间。
2.结构体变量的定义结构体变量的定义有以下几种形式:?结构体类型的说明与定义分开。
例如说明了struct person之后,可以定义相应的变量:struct person p1, p2;定义了两个struct person变量,每个变量按结构类型中的成员分配相应的空间,每一个结构体变量所分配空间为所有成员占用空间之和。
如p1、p2所占用空间都为15byte。
?说明结构体类型的同时定义相应变量。
如:struct teacher{int number;char name[10];char sex;char profession[6];}t1, t2;在说明struct teacher类型的同时,定义了相应的两个变量t1、t2。
?直接定义结构体变量,没有结构体类型名。
如:struct{int No;char name[10];char sex;int age;}s1, s2;定义两个结构体变量s1、s2,他们都有4个成员,每个变量都占用15byte,但与第2种方式不同,没有给出结构体名,因而无法在其他地方再次使用该结构体类型定义别的变量。
结构体(结构体嵌套、结构体指针、结构体参数传递)
结构体(结构体嵌套、结构体指针、结构体参数传递)结构体(struct)1、基本概念结构体-----将不同类型的数据成员组织到统⼀的名字之下,适⽤于对关系紧密,逻辑相关、具有相同或不同类型的数据进⾏处理2、结构体定义格式struct 结构名(也可称作结构标识符){类型变量名;类型变量名;······};struct 结构名结构变量;或者struct 结构名{类型变量名;类型变量名;······}结构变量;例:声明结构体类型的同时定义变量名1struct student2 {3 int num;4 }teacher;(声明结构体类型仅仅是声明了⼀个类型,系统并不为之分配内存,就如同系统不会为类型 int 分配内存⼀样。
只有当使⽤这个类型定义了变量时,系统才会为变量分配内存。
所以在声明结构体类型的时候,不可以对⾥⾯的变量进⾏初始化。
)定义了⼀个结构名为student的结构体和⼀个结构变量teacher,如果省略变量名(teacher),就变成了对结构的声明,上述结构体声明也可分开写1struct student2 {3 int num;4 };56struct student teacher;与上⾯效果相同,可理解为struct student类似于int,⽽我们⽤的是teacher类似于变量,如果省略结构名,则称之为⽆名结构,这种情况常常出现在函数内部,或者说你只需要teacher这⼀个变量,后⾯不需要再使⽤结构体名定义其他变量,那么在定义时也可以不给出结构体名1struct2 {3 int num;4 }teacher;(在声明结构体时常常与typedef函数配合使⽤)3、结构体成员的访问访问结构体变量的成员必须使⽤成员选择运算符(也称圆点运算符),格式为:结构体变量名.成员名若使⽤指针对结构体成员进⾏访问,格式为:指针->成员名等价于 (*指针).成员名4、typedef函数为⼀种数据类型定义⼀个新名字。
第九章数组
第九章结构体与链表9.1结构体类型的定义❑程序设计者自己定义的数据类型❑包含若干成员,各成员可有不同的数据类型(与数组的区别)❑结构体类型定义struct 结构体名{ 类型标识符成员名1;类型标识符成员名2;…………….类型标识符成员名n;};大括号内为成员说明列表❑如,处理学生成绩数据,每个学生有三门课程的成绩、总成绩等变量。
struct student{long num; /*学号*/char name[10]; /* 姓名*/int score1; /* 成绩*/int score2;int score3;int total; /*总成绩*/};这样,student就是一个新的结构数据类型,可用它定义变量struct student a1, a2; 注意:struct不能省略结构体就是一个专有名词,代表一类事物,如:学生,教师,汽车等,是泛指结构体成员是描述该类事物的指标,如:学生的学号,名字,成绩等结构体变量是该类事物的一个具体事例,每个事例都具有全部成员,如每个学生都有学号,名字,成绩等9.2 结构体类型变量的定义1 先定义结构体类型,再定义变量如:struct student{ long num; /* 学号*/char name[10];/* 姓名*/int score1;/* 成绩*/int score2;int score3;int total; /* 总成绩*/};struct student a1, a2;注意:struct不能省略2 定义类型的同时定义变量struct student{ long num; /* 学号*/char name[10];/* 姓名*/int score1;/* 成绩*/int score2;int score3;int total; /* 总成绩*/} a1, a2;3 直接定义结构体类型变量struct{ long num; /* 学号*/char name[10];/* 姓名*/int score1;/* 成绩*/int score2;int score3;int total; /* 总成绩*/} a1, a2;每个结构体变量都拥有结构体的全部成员9.2.2 结构变量的引用❑结构变量的引用是通过引用其成员(分量)的形式来实现的,格式为: 结构变量名.结构成员名❑若定义了struct student a1, a2; 就可以使用其成员a1.num=00001;a2.num=00002;strcpy(, “John”);strcpy(, “Andrew”);a1.total=a1.score1+a1.score2+a1.score3;❑每个结构成员都可当做一个变量来使用,类型为在定义结构时所指定的数据类型❑结构变量的成员使用方法与普通内存变量没有区别。
9.结构体
对结构体变量初始化. 例 对结构体变量初始化 #include <stdio.h> void main() () {struct student { int num; ; char name[20]; char sex; ; char addr[20]; ;
运行结果: 运行结果: No.:10101 : name:LiLin : sex:M :M address:123 Beijing Road :
}a={10101,〃LiLin〃,′M′,〃123 Beijing Road〃}; , , , };
/* 对结构体变量 赋初值 对结构体变量a赋初值 赋初值*/ printf(〃No.:%d\nname:%s\nsex:%c\naddress:%s\n〃, , a.num,,a.sex,a.addr); , , , }
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,"Wang Lin",'M',19, "200 Beijing Road"};
形式二:(用的最多)
num 2字节
… …..
name sex age score
20字节 1字节 2字节 4字节
addr
30字节
(2)在声明类型的同时定义变量 (2)在声明类型的同时定义变量 这种形式的定义的一般形式为: 这种形式的定义的一般形式为: struct 结构体名 { 成员表列 变量名表列; }变量名表列;
* Num/ name sex age Month §图11-3 day year
C语言结构体习题及答案
第9章结构体1.定义以下结构体类型struct s{int a;char b;float f;};则语句printf("%d",sizeof(struct s))的输出结果为【】。
A) 3 B) 7 C) 6 D) 42.当定义一个结构体变量时,系统为它分配的内存空间是【】A)结构中一个成员所需的内存容量B)结构中第一个成员所需的内存容量C)结构体中占内存容量最大者所需的容量D)结构中各成员所需内存容量之和3.定义以下结构体类型struct s{ int x;float f;}a[3];语句printf("%d",sizeof(a))的输出结果为【】A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型struct student{char name[10];int score[50];float average;}stud1;则stud1占用内存的字节数是【】。
A) 64 B) 114 C) 228 D) 79、设有一结构体类型变量定义如下:struct date{ int year;int month;int day;};struct worklist{ char name[20];char sex;struct date birthday;} person;若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。
A. year=1976B. birthday.year=1976C. person.birthday.year=1976D. person.year=19761、若程序中有以下的说明和定义:struct abc{ int x;char y; } 花括号后少了分号。
struct abc s1,s2;则会发生的情况是______。
A) 编译时错B) 程序将顺序编译、连接、执行C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连接出错。
C语言 结构体
}
第六页,编辑于星期三:五点 四十五分。
9.1.2 结构的概念与定义
结构与数组比较:
使用结构来表示学生信息: •都是构造类型,是多个变量
struct student{
的集合
int num;
/* 学号 */
•数组成员类型相同,结构成
char name[10];
/* 姓名 */ 员类型不同
int computer, english, math; /* 三门课程成绩 */
第二十二页,编辑于星期三:五点 四十五分。
9.2.2 结构数组操作
结构数组的初始化
struct student students[50] = { { 101,"zhang", 76, 85, 78 }, {102, "wang", 83,
92, 86} };
students[0] 101 Zhang 76 85 78
struct student{
int num;
/* 学号 */
char name[10];
/* 姓名 */
int computer, english, math; /* 三门课程成绩 */
double average;
/* 个人平均成绩 */
};
struct student s1,s2;
第十二页,编辑于星期三:五点 四十五分。
int main(void)
{ int course, i, n, num, pos, score;
struct student students[50]; /* 定义结构数组 */ … /* 输入n个学生信息 */
在我们的实际生活中,一个较大的实体可能由多个成 员构成,而这些成员中有些又有可能是由一些更小的 成员构成。
C语言程序设计实例教程第2版习题答案作者李红第9章结构体和共用体.doc
9.4课后习题9.4.1项目练习一.练习目的1.进一步巩固结构体类型和共用体类型的定义与引川2.进一步复习链表的建立过程3.进一步巩固枚举类型的定义与枚举元索的引用方法二.练习内容1.用结构体变量表示平面上的一个点(横坐标和纵坐标),输入两个点,求两点Z间的距离。
#include "stdio.h"include "math.h"struct pin{float x;float y;}a,b;main(){printfC*请输入a点的横纵坐标:“);scanf("%f%f"/&a.x,&a.y);printfC'Xn");printf("请输入b点的横纵坐标scanf(,,%f%f"/&b.x,&b.y);printf("\n n);printff"输出a、b 两点之间的距离是:%f",sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));getch();}2.16个同学围成一-圈,从笫1个人开始按1、2、3的顺序报号,凡报到3者退出圈子。
找出最后昭在圈子中的人原来的序号。
ttinclude "stdio.h"#include "stdlib.h"#define LEN sizeof(struct game)struct game{int num;struct game *next;};struct game *creat(){ struct game *head,*p;head=p=(struct game *) malloc(LEN);p->num=l;int i=2;while(i<=16){ p・>next=(struct game *) malloc(LEN);p->next-:>nu m=i;i++;p=p->n ext; }p->next=head; return(head);} struct game *delete(struct game *head) { struct game*pl=head,*p2=head,*x; int k=l;while(pl->next!=pl) {if(k==3) {x=pl; pl=pl->next;p2・>n ext=pl; free(x); x=NULL; k=0;} else {P2=pl; pl=pl->next;}pl->next=NULL;return(pl);}void print(struct game *head){ struct game *p;p=head;while(p!=NULL) {printf("%d\t",p->num);p=p->n ext;}printfCAn");}main(){ struct game *pt,*p;pt=creat();p=delete(pt);print(p);free(p);getch();}3.建立一个链表,每个结点包含的成员为:职工号、工资。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、定义两个日期结构体变量(包括年、月、日)。
输入两个日期值,比较两个日期的大小(越靠后越大),输出较大的日期。
2、将1题中输入的日期进行验证,保证日期的正确性。
(1)不可为负数;(2)年份1900-2056之间,月份在1-12之间;(3)日期在1-31日以内(注意各月份的日期数判断及闰年的判断)(Year % 4 ==0 && Year % 100 !=0 || Year % 400 ==0)3、输入两个日期,编程交换两个日期值,保证第一个日期是较大的日期(日期的大小比较用函数表达)。
4、计算某日期是一年中的第几天。
5、计算两日期间相差的天数。
6、利用基姆拉尔森计算公式:W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7,计算任意日期是星期几。
说明:1)在公式中d表示日期中的日数,m表示月份数,y表示年数。
2)注意:在公式中有个与其他公式不同的地方:把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
7、打印出任意月份的日历表。
8、输入5位同学的一组信息(结构数组),包括学号、姓名、数学成绩、计算机成绩,求得每位同学的平均分和总分,然后按照总分从高到低排序。
9、有一批图书(利用结构数组),每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据,希望输入后按书名的字母顺序将各书的记录排列好,供以后查询。
今输入一本书的书名,如果查询到库中有此书,打印出此书的书名,作者,编号和出版日期。
如果查不到此书,则打印出“无此书”。
10、利用指针重做9题:分别设计函数(1)结构数组的数据输入;(2)结构数组的输出;(3)数组排序;(4)查询;关于链表:11、参考第8题,编写函数,建立动态链表,输入几位同学的信息(学号、姓名、数学、计算机、平均分、总分),然后在屏幕上输出这些数据。
12、将11题中,各同学的总分与平均分计算出来,并输出所有数据;13、建立函数,为上题中的链表添加一个新的节点。
14、建立按姓名查找某同学记录的函数,找到返回该节点的地址,未找到返回NULL;15、在某个同学纪录之前插入一个新的节点。
(某同学记录之后插入一个新的节点)16、删除找到的某个同学记录的节点。
17、单向链表逆置;.18、对单链表按照数学成绩从高到低排序;(只交换除指针成员next之外的其他成员变量的值)19、对两个链表进行连接;两个有序链表合并(保持有序);20、利用指针,交换链表中任意两个节点;(p,q为需要交换的两个节点,首先保证p<=q,并作为传递的参数,函数中分为几种情形:21、利用20题函数,重写链表的排序;(以下例题开始使用带头节点的链表,可以减小编程的难度)22、利用链表完成习题:有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数,凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。
问此人原来的位置是多少号?23、利用插入法,每输入一个节点数据就按顺序插入到链表的某个位置,输入完成即链表排序完成,输出链表的各节点数据。
24、编写程序,建立环形链表及双向链表(带头节点),并正向、反向输出双向链表中所有节点数据;25、编写双向链表的节点插入、删除、交换、排序函数26、编写一个完整、简易的成绩管理系统:说明:1)结构体定义:Student——学号num,姓名name,班级classes,语文chinese,数学math,英语english,总分sum;2)系统功能:a.成绩录入; b.添加数据(在链表的末尾添加);c.删除某生成绩数据;d.成绩修改;e.成绩排序(第一关键字班级,第二关键字总分);f.成绩输出(指定班级输出或全部输出,要输出一项人数信息);27、参考答案第2题:main(){struct Date{int year;int month;int day;}d1;printf("input date 1(year-month-day):\n");scanf("%d-%d-%d",&d1.year,&d1.month,&d1.day);if(yzyear(d1.year)&&yzmonth(d1.month)&&yzday(d1.year,d1.month,d1.day)) printf("yes");elseprintf("no");getch();}yzyear(int year){if(year<1900||year>2056)return 0;return 1;}yzmonth(int month){if(month<1||month>12)return 0;return 1;}yzday(int year,int month,int day){switch (month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day>=1&&day<=31)return 1;break;case 4:case 6:case 9:case 11:if(day>=1&&day<=30)return 1;break;case 2:if((year%4==0&&year%100!=0||year%400==0)&&day>=1&&day<=29) return 1;else if(!(year%4==0&&year%100!=0||year%400==0)&&day>=1&&day<=28) return 1;break;}return 0;}第3题:struct Date{int year,month,day;};int main(void){struct Date d1,d2,tmp;int x;printf("input d1(yyyy-mm-dd):\n");scanf("%d-%d-%d",&d1.year,&d1.month,&d1.day);printf("input d2(yyyy-mm-dd):\n");scanf("%d-%d-%d",&d2.year,&d2.month,&d2.day);x=later(d1,d2);if(x<0){tmp=d1;d1=d2;d2=tmp;}printf("%d-%d-%d",d1.year,d1.month,d1.day);printf(" %d-%d-%d",d2.year,d2.month,d2.day);getch();return 0;}later(struct Date d1,struct Date d2){if(d1.year!=d2.year)return d1.year-d2.year;else if(d1.month!=d2.month)return d1.month-d2.month;else if(d1.day!=d2.day)return d1.day-d2.day;elsereturn 0;}第4题:struct Date{int year;int month;int day;};int main(void){struct Date d1;int n;printf("input date 1(year-month-day):\n");scanf("%d-%d-%d",&d1.year,&d1.month,&d1.day);n=daysInYear(d1);printf("from %d-1-1 to %d-%d-%d,%d days",d1.year,d1.year,d1.month,d1.day,n); getch();return 0;}int daysInYear(struct Date d){int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int i,sum=0;if(leapyear(d.year))m[2]=29;for(i=1;i<d.month;i++)sum+=m[i];sum+=d.day;return sum;}int leapyear(int year){if(year%4==0&&year%100!=0||year%400==0)return 1;return 0;}第5题:(利用前几题的函数)struct Date{int year;int month;int day;};int main(void){struct Date d1,d2,tmp;int n;printf("input date 1(year-month-day):\n");scanf("%d-%d-%d",&d1.year,&d1.month,&d1.day);printf("input date 2(year-month-day):\n");scanf("%d-%d-%d",&d2.year,&d2.month,&d2.day);if(later(d1,d2)<0){tmp=d1;d1=d2;d2=tmp;}n=datediff(d1,d2);printf("from %d-%d-%d to %d-%d-%d,%ddays",d2.year,d2.month,d2.day,d1.year,d1.month,d1.day,n); getch();return 0;}int datediff(struct Date d1,struct Date d2){int i,sum=0;for(i=d2.year;i<d1.year;i++){if(leapyear(i))sum+=366;elsesum+=365;}sum-=daysInYear(d2);sum+=daysInYear(d1);return sum;}第6题:(0:星期天 1:星期一…………)int weekday(struct Date d1){int y=d1.year,m=d1.month,d=d1.day,w;if(m==1||m==2){m+=12;y--;}w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7;return (w+1)%7;}第7题:calendar(struct Date d1){struct Date d2=d1;int y=d1.year,m=d1.month,d=d1.day,w,i;int mm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(leapyear(y))mm[2]=29;d2.day=1;w=weekday(d2);printf("SUN\tMON\tTRU\tWEN\tTHU\tFRI\tSAT\n");for(i=0;i<w;i++)printf("\t");for(i=1;i<=mm[m];i++){if(i==d){textcolor(YELLOW);clreol();printf("%d\t",i);normvideo();clreol();}elseprintf("%d\t",i);if((i+w)%7==0)printf("\n");}}第8题:struct Student{int num;char name[20];int math;int computer;float aver;int sum;};int main(void){struct Student stu[5],tmp;int i,j;printf("input student infomation:\n");for(i=0;i<5;i++){printf("----------STUDENT %d--------\nSID:",i+1); scanf("%d",&stu[i].num);printf("NAME:");scanf("%s",stu[i].name);printf("MATH:");scanf("%d",&stu[i].math);printf("COMPUTER:");scanf("%d",&stu[i].computer);}for(i=0;i<5;i++){stu[i].sum=stu[i].math+stu[i].computer;stu[i].aver=stu[i].sum/2;}for(i=0;i<5;i++){for(j=i+1;j<5;j++){if(stu[i].sum<stu[j].sum){tmp=stu[i];stu[i]=stu[j];stu[j]=tmp;}}}for(i=0;i<5;i++){printf("----------STUDENT %d--------\nSID:",i+1); printf("%d\t",stu[i].num);printf("NAME:");printf("%s\t",stu[i].name);printf("MATH:");printf("%d\t",stu[i].math);printf("COMPUTER:");printf("%d\t",stu[i].computer);printf("AVER:");printf("%f\t",stu[i].aver);printf("SUM:");printf("%d\t\n",stu[i].sum);}getch();return 0;}第10题:#include "Stdio.h"#include "Conio.h"#define N 2struct Date{int year,month,day;};struct Book{char name[30];char author[20];int num;struct Date pubdate;};int main(void){struct Book books[10],*p;int i;p=books;inputbook(p,N);sort(p,N);outputbook(p,N);inputname(p);window(1,1,80,25);normvideo();clrscr();getch();return 0;}inputname(struct Book *p){char ch[30],*q;int i;q=ch;while(1){window(20,8+N+3,60,8+N+5);textbackground(WHITE);textcolor(BLACK);clrscr();gotoxy(2,1);cprintf("your found:(*)");gets(q);if(strcmp(q,"*")==0)break;i=found(q,p,N);gotoxy(2,2);clreol();if(i>=0){printf("%s\t%s\t%d\t%d-%d-%d",(p+i)->name,(p+i)->author,(p+i)->num,(p+i)->pubdate.year,(p+i)->pubdate.month,(p+i)->pubdate.day); }elseprintf("not found!!!");getch();}}found(char *q,struct Book *p,int n){int i;for(i=0;i<n;i++){if(strcmp(q,(p+i)->name)==0)return i;}return -1;}inputbook(struct Book *p,int n){int i;for(i=0;i<n;i++){window(20,5,50,10);textbackground(WHITE);textcolor(BLACK);clrscr();gotoxy(8,1);cprintf("--BOOK INFOMATION--\n");gotoxy(2,2);cprintf("book name:");gets(p->name);gotoxy(2,3);cprintf("author:");gets(p->author);gotoxy(2,4);cprintf("num:");scanf("%d",&(p->num));gotoxy(2,5);cprintf("pubdate(yyyy-mm-dd):");scanf("%d-%d-%d",&(p->pubdate.year),&(p->pubdate.month),&(p->pubdate.day)); getchar();p++;}}outputbook(struct Book *p,int n){int i;window(20,12,60,12+N+2);textbackground(WHITE);textcolor(BLACK);clrscr();gotoxy(6,1);printf("book infomation\n");gotoxy(2,2);printf("name\tauthor\tnum\tpubdate\n");for(i=0;i<n;i++){gotoxy(2,i+3);printf("%s\t%s\t%d\t%d-%d-%d\n",p->name,p->author,p->num,p->pubdate.year,p->pubdate.month,p->pubdate.day);p++;}}sort(struct Book *p,int n){int i,j;struct Book tmp;for(i=0;i<n;i++){for(j=i+1;j<n;j++){if(strcmp((p+i)->name,(p+j)->name)>0) {tmp=*(p+i);*(p+i)=*(p+j);*(p+j)=tmp; }}}}第11题:#include "Stdio.h"#include "Conio.h"#define LEN sizeof(struct Student)struct Student {int num;char name[20];int math,computer;float aver;int sum;struct Student *next;};int n;int main(void){struct Student *create();struct Student *head;head=create();outputstu(head);getch();return 0;}struct Student *create(){struct Student *p1,*p2,*head;char yn;p1=p2=head=NULL;n=0;while(1){n++;p1=(struct Student *)malloc(LEN);inputstu(p1);if(n==1)head=p1;elsep2->next=p1;p2=p1;printf("continue?(Y/N)");yn=getchar();if(yn=='Y'||yn=='y')continue;elsebreak;}p2->next=NULL;return head;}outputstu(struct Student *head){struct Student *p;int i=0;p=head;printf("num\tname\tmath\tcomputer\n");while(i<n){printf("%d\t%s\t%d\t%d\n",p->num,p->name,p->math,p->computer); p=p->next;i++;}}inputstu(struct Student *p){printf("num:");scanf("%d",&p->num);getchar();printf("name:");gets(p->name);printf("math:");scanf("%d",&p->math);printf("computer:");scanf("%d",&p->computer);getchar();}第12题:count(struct Student *head) {struct Student *p;p=head;while(p!=NULL){p->sum=p->math+p->computer;p->aver=(float)p->sum/2;p=p->next;}}outputall(struct Student *head){struct Student *p;p=head;printf("num\tname\tmath\tcomput\taver\tsum\n");while(p!=NULL){printf("%d\t%s\t%d\t%d\t%5.2f\t%d\n",p->num,p->name,p->math,p->computer,p->aver,p->sum);p=p->next;}}第13题:addone(struct Student *head){struct Student *p,*q;p=head;while(p->next!=NULL)p=p->next;q=(struct Student *)malloc(LEN);inputstu(q);p->next=q;q->next=NULL;count(q);}第14、15题:(14题:find函数,15题:insertone函数,另对前几题中函数稍做了些调整,下面把所有函数完整列出)#include "Stdio.h"#include "Conio.h"#define LEN sizeof(struct Student)struct Student {int num;char name[20];int math,computer;float aver;int sum;struct Student *next;};int n;int main(void){struct Student *create();struct Student *newone();struct Student *find(struct Student *head,char *ch);struct Student *insertone(struct Student *head,char *ch);struct Student *head,*f;char c[20],*ch;int xx;head=create();outputstu(head);ch=c;getchar();printf("where you insert:");gets(ch);head=insertone(head,ch);if(head!=NULL)outputstu(head);elseprintf("not found!");getch();return 0;}struct Student *insertone(struct Student *head,char *ch){ struct Student *p,*q,*r;q=newone();p=find(head,ch);if(p==NULL){printf("not found!!!\n");return head;}if(p!=head){r=head;while(r->next!=p)r=r->next;r->next=q;q->next=p;return(head);}else{head=q;q->next=p;return(head);}}printhead(int n){if(n==0)printf("num\tname\tmath\tcompute\n");elseprintf("num\tname\tmath\tcomput\taver\tsum\n"); }printbody(struct Student *p,int n){if(n==0)printf("%d\t%s\t%d\t%d\n",p->num,p->name,p->math,p->computer);elseprintf("%d\t%s\t%d\t%d\t%5.2f\t%d\n",p->num,p->name,p->math,p->computer,p->aver,p->sum);}outputone(struct Student *p){printhead(0);printbody(p,0);}struct Student *find(struct Student *head,char *ch){struct Student *p;p=head;while(p){if(strcmp(p->name,ch)==0)return(p);p=p->next;}return(NULL);}struct Student *create(){struct Student *p1,*p2,*head;char yn;p1=p2=head=NULL;n=0;while(1){n++;p1=newone();if(n==1)head=p1;elsep2->next=p1;p2=p1;printf("continue?(Y/N)");yn=getchar();if(yn=='Y'||yn=='y')continue;elsebreak;}p2->next=NULL;return head;}outputstu(struct Student *head){struct Student *p;p=head;printhead(0);while(p){printbody(p,0);p=p->next;}}inputstu(struct Student *p){printf("num:");scanf("%d",&p->num);getchar();printf("name:");gets(p->name);printf("math:");scanf("%d",&p->math);printf("computer:");scanf("%d",&p->computer);getchar();}count(struct Student *head) {struct Student *p;p=head;while(p!=NULL){p->sum=p->math+p->computer; p->aver=(float)p->sum/2;p=p->next;}}outputall(struct Student *head){struct Student *p;p=head;printhead(1);while(p!=NULL){printbody(p,1);p=p->next;}}addone(struct Student *head){struct Student *p,*q;p=head;while(p->next!=NULL)p=p->next;q=newone();p->next=q;q->next=NULL;count(q);}struct Student *newone(){struct Student *p;p=(struct Student *)malloc(LEN);inputstu(p);return(p);}第16题:struct Student *delone(struct Student *head,char *ch){ struct Student *p,*r;p=find(head,ch);if(!p){printf("not found!!!\n");return head;}if(p==head){head=p->next;free(p);}else{r=head;while(r->next!=p)r=r->next;r->next=p->next;free(p);}return head;}第17题:struct Student *reverselink(struct Student *head){struct Student *p,*q;p=head;q=NULL;while(head!=NULL){head=head->next;p->next=q;q=p;p=head;}return q;}第18题:sort(struct Student *head){struct Student tmp;int t;char ch[20];struct Student *p,*q,*r;p=head;while(p!=NULL){q=p->next;while(q!=NULL){if(p->math>q->math){t=p->num;p->num=q->num;q->num=t;strcpy(ch,p->name);strcpy(p->name,q->name);strcpy(q->name,ch); t=p->math;p->math=q->math;q->math=t;t=p->computer;p->computer=q->computer;q->computer=t;}q=q->next;}p=p->next;}}第19题(第二问):struct Student *join(struct Student *head1,struct Student *head2){struct Student *head3,*p,*q,*r;p=head1;q=head2;r=NULL;if(head1->math < head2 ->math){head3=head1;p=p->next;}else{head3=head2;q=q->next;}r=head3;while(p!=NULL&&q!=NULL){if(p->math < q->math){r->next=p;r=p;p=p->next;}else{r->next=q;r=q;q=q->next;}}if(p!=NULL)r->next=p;if(q!=NULL)r->next=q;return head3;}第20题:struct Student *exchange(struct Student *head,struct Student *p,struct Student *q){ struct Student *findprenode(struct Student *head,struct Student *p);struct Student *p_pre,*p_nex,*q_pre,*q_nex;p_pre=p_nex=q_pre=q_nex=NULL;if(p==q)return head;if(p->next!=q){if(p==head){q_pre=findprenode(head,q);q_nex=q->next;head=q;q->next=p->next;q_pre->next=p;p->next=q_nex;}else{p_pre=findprenode(head,p);p_nex=p->next;q_pre=findprenode(head,q);q_nex=q->next;p_pre->next=q;q->next=p_nex;q_pre->next=p;p->next=q_nex;}}else{if(p==head){q_nex=q->next;head=q;q->next=p;p->next=q_nex;}else{p_pre=findprenode(head,p);q_nex=q->next;p_pre->next=q;q->next=p;p->next=q_nex;}}return head;}struct Student *findprenode(struct Student *head,struct Student *p){struct Student *p_pre;p_pre=head;while(p_pre->next!=p)p_pre=p_pre->next;return p_pre;}第21题:交换结点函数,不需要返回值,将最后的return head去除;为方便交换结点函数的调用,sort1函数中,为链表临时增加一个表头,不参与排序;struct Student *newhead(){struct Student *p;p=(struct Student *)malloc(LEN);p->num=0;strcpy(p->name,"head");p->math=p->computer=0;return(p);}struct Student *sort1(struct Student *head){int t=0;struct Student *p,*q,*nhead,*r;nhead=newhead();nhead->next=head;p=head;q=p->next;while(p!=NULL){q=p->next;while(q!=NULL){if(p->math>q->math){exchange1(nhead,p,q);r=p;p=q;q=r;/*r=p;p=q;q=r->next;*/}q=q->next;}p=p->next;}return nhead->next;}第22题:(使用带头节点的链表)#include "stdio.h"#include "conio.h"#define LEN sizeof(struct Node)struct Node {int num;struct Student *next;};main(){struct Node *create();struct Node *newone(int n);struct Node *newhead();struct Node *delsome(struct Node *head); struct Node *head;head=create();output(head);printf("\n");delsome(head);output(head);getch();}struct Node *delsome(struct Node *head){ struct Node *p,*q;int i=0,del=0;p=head->next;while(del<16){i++;if(i%3==0){q=p;if(p->next==NULL)p=head->next;elsep=p->next;delone(head,q);output(head);printf("\n");del++;}else{if(p->next==NULL)p=head->next;elsep=p->next;}}return head;}delone(struct Node *head,struct Node *p){ struct Student *r;r=head;while(r->next!=p)r=r->next;r->next=p->next;free(p);return head;}struct Node *create(){struct Node *p1,*p2,*head;int n=0;head=newhead();p1=p2=NULL;while(n<17){p1=newone(n);if(n==0)head->next=p1;elsep2->next=p1;p2=p1;n++;}p2->next=NULL;return head;}struct Node *newone(int n){struct Node *p;p=(struct Node *)malloc(LEN);p->num=n;return(p);}output(struct Node *head){struct Node *p;p=head;while(p){printf("%3d",p->num);p=p->next;}}struct Node *newhead(){struct Node *p;p=(struct Node *)malloc(LEN);p->num=-1;return(p);第23题:#define LEN sizeof(struct Node) struct Node{int num;struct Node *next;};int main(void){struct Node *head;struct Node *create();struct Node *newone(int n); head=create();output(head->next);getch();return 0;}output(struct Node *head){struct Node *p;p=head;while(p){printf("%3d",p->num);p=p->next;}}struct Node *create(){struct Node *p,*p1,*p2,*head; int n=0,i=2;p1=p2=head=NULL;n=0;head=newone(-1);printf("No 1:");scanf("%d",&n);if(n!=-1){p=newone(n);head->next=p;}else{printf("its over");return NULL;}while(1){printf("No %d:",i);scanf("%d",&n);if(n==-1){break;}else{/***************************************************p1,p2两个指针一前一后同时移动,p节点插入到p1,p2之间****************************************************/ p=newone(n);p1=head->next;p2=head;while(p1!=NULL){if(p1->num < n){p2=p1;p1=p1->next;}elsebreak;}p2->next=p;p->next=p1;}i++;}return head;}struct Node *newone(int n){struct Node *p;p=(struct Node *)malloc(LEN);p->num=n;p->next=NULL;return(p);}struct Node *create1(){struct Node *p,*p1,*head,*tmp;int n=0,i=2;p=p1=head=NULL;n=0;head=newone(-1);printf("No 1:");scanf("%d",&n);if(n!=-1){p=newone(n);head->next=p;}else{printf("its over");return NULL;}while(1){printf("No %d:",i);scanf("%d",&n);if(n==-1){break;}else{/****************************************************************** 这一段只使用一个指针移动,p节点插入到p1->next与p1之间,tmp是临时使用的******************************************************************/ p=newone(n);p1=head;while(p1->next!=NULL&&n>p1->next->num)p1=p1->next;tmp=p1->next;p1->next=p;p->next=tmp;}i++;}return head;}。