程序设计基础-课件

上传人:仙*** 文档编号:241625349 上传时间:2024-07-10 格式:PPTX 页数:59 大小:517.30KB
返回 下载 相关 举报
程序设计基础-课件_第1页
第1页 / 共59页
程序设计基础-课件_第2页
第2页 / 共59页
程序设计基础-课件_第3页
第3页 / 共59页
点击查看更多>>
资源描述
Slide 1-1第第7章章 结构结构2024/7/10程序设计基础程序设计基础Programming FundamentalsSlide 1-2第第7章章 结构结构一一个对象往往有多个属性个对象往往有多个属性。描述。描述一个学生基本信息时一个学生基本信息时,需要,需要学号、姓名、性别、出生日期、家庭地址等属性,这些属性学号、姓名、性别、出生日期、家庭地址等属性,这些属性之间是相关的,但数据类型不同,共同构成一个之间是相关的,但数据类型不同,共同构成一个有机整体,有机整体,所以所以不能用数组来不能用数组来表示。也表示。也不宜用多个独立变量来表示各个不宜用多个独立变量来表示各个属性属性,这样,这样将失去整体性,难以反映出这些属性之间的内在将失去整体性,难以反映出这些属性之间的内在联系。在这种情况下,联系。在这种情况下,C C语言提供了复合数据类型:结构语言提供了复合数据类型:结构。结构是具有相同数据类型或不同数据类型的一组相关变量的结构是具有相同数据类型或不同数据类型的一组相关变量的集合,其中的每个变量都有不同的名字和相应的数据类型,集合,其中的每个变量都有不同的名字和相应的数据类型,这些变量为结构成员这些变量为结构成员。结构结构有两条基本性质:数据是无序的,不能通过下标来访问有两条基本性质:数据是无序的,不能通过下标来访问某个结构成员;数据是异质的,结构成员的数据类型可以相某个结构成员;数据是异质的,结构成员的数据类型可以相同,也可以不同。同,也可以不同。引言引言2024/7/10Slide 1-3第第7章章 结构结构结构类型结构类型声明结构类型的声明结构类型的一般形式为:一般形式为:struct 结构名 类型名 结构成员名1;类型名 结构成员名2;类型名 结构成员名n;;例如例如:struct student int number;/*学学号号*/char name8;/*姓名姓名*/char sex;/*性别性别*/double score3;/*3门课成绩门课成绩*/;结构的定义以分号结束,结构的定义以分号结束,被看作一条语句被看作一条语句 关键字关键字struct和它后面和它后面的结构名一起组成一个的结构名一起组成一个新的数据类型新的数据类型名,称为名,称为结构标记结构标记 Slide 1-4第第7章章 结构结构结构类型结构类型(续续)嵌套结构嵌套结构类型:类型:struct date int year;int month;int day;struct student int number;char name8;char sex;struct date birthday;double score3;嵌套结构类型:嵌套结构类型:struct student int number;char name8;char sex;struct date int year;int month;int day;birthday;double score3;Slide 1-5第第7章章 结构结构声明结构类型的目的是定义一个由已有数据类型构成的新的声明结构类型的目的是定义一个由已有数据类型构成的新的数据类型。数据类型。一旦定义完这个新的数据类型,就可以用该数据类型来定义一旦定义完这个新的数据类型,就可以用该数据类型来定义结构变量。结构变量。结构变量结构变量2024/7/10Slide 1-6第第7章章 结构结构三种定义结构变量的方式三种定义结构变量的方式:struct point/*结构类型结构类型*/double x;double y;struct point point1,point2;/*结构变量结构变量*/typedef struct/*类型定义结构类型别名类型定义结构类型别名*/double x;double y;POINT;POINT point1,point2;/*结构变量结构变量*/结构变量结构变量(续续)2024/7/10Slide 1-7第第7章章 结构结构三种定义结构变量的方式三种定义结构变量的方式:struct point /*在声明结构类型的同时声明结构在声明结构类型的同时声明结构变量变量*/double x;double y;point1,point2;struct /*匿名结构类型匿名结构类型*/double x;double y;point1,point2;结构变量结构变量(续续)2024/7/10Slide 1-8第第7章章 结构结构在在声明结构变量时,可以使用结构初始化式给结构成员赋初声明结构变量时,可以使用结构初始化式给结构成员赋初始值。结构初始化式是一个用花括号始值。结构初始化式是一个用花括号 和和 括起来的常量表达括起来的常量表达式列表,常量表达式之间用逗号进行分隔。式列表,常量表达式之间用逗号进行分隔。struct point point1=1.25,3.58;在在声明了结构变量后,通过成员选择运算符声明了结构变量后,通过成员选择运算符“.”.”来访问该来访问该结构变量中的结构成员,一般形式如下:结构变量中的结构成员,一般形式如下:结构变量名结构变量名.结构成员结构成员名名struct point point1;point1.x=1.25;point1.y=3.58;结构变量结构变量(续续)2024/7/10Slide 1-9第第7章章 结构结构访问嵌套结构类型声明的结构变量中的结构成员。访问嵌套结构类型声明的结构变量中的结构成员。struct student student1=10001,张三张三,M,1994,7,10,78.0,83.0,75.0;等价于:等价于:struct student student1;student1.number=10001;strcpy(student1.name,张三张三);student1.sex=M;student1.birthday.year=1994;student1.birthday.month=7;student1.birthday.day=10;student1.score0=78.0;student1.score1=83.0;student1.score2=75.0;结构变量结构变量(续续)2024/7/10Slide 1-10第第7章章 结构结构两两个同类型的结构变量之间可以使用赋值运算符直接整体复个同类型的结构变量之间可以使用赋值运算符直接整体复制。制。struct point point1=1.25,3.58,point2;point2=point1;等价等价于:于:point2.x=point1.x;point2.y=point1.y;除了除了可以使用赋值运算符实现两个同类型的结构变量之间的可以使用赋值运算符实现两个同类型的结构变量之间的整体复制外,其他运算符均不能用于两个结构变量之间的整整体复制外,其他运算符均不能用于两个结构变量之间的整体运算体运算。结构变量结构变量(续续)2024/7/10Slide 1-11第第7章章 结构结构可以可以声明指向结构变量的指针,简称结构指针声明指向结构变量的指针,简称结构指针。可以使用取地址运算符可以使用取地址运算符“&”&”得到结构变量的地址,该地址得到结构变量的地址,该地址实际上是结构变量中第一个成员的地址实际上是结构变量中第一个成员的地址。将将结构变量的地址赋给结构指针,这样就可以通过结构指针结构变量的地址赋给结构指针,这样就可以通过结构指针访问结构变量中的各个成员。访问结构变量中的各个成员。struct point double x;double y;struct point point1=1.25,3.58,*pointPtr;pointPtr=&point1;结构和指针结构和指针2024/7/10Slide 1-12第第7章章 结构结构通过通过结构指针和成员选择运算符结构指针和成员选择运算符“.”.”来访问结构成员来访问结构成员。(*pointPtr).x=5.32;等价于:等价于:point1.x=5.32;成员选择运算符成员选择运算符“.”.”的左边应该是一个结构变量而不是结构的左边应该是一个结构变量而不是结构指针。指针。*pointPtrpointPtr表示结构指针表示结构指针pointPtrpointPtr所指向的结构变量,所指向的结构变量,也就是也就是point1point1。成员成员选择运算符选择运算符“.”.”的优先级高于解引用运算符的优先级高于解引用运算符“*”“*”,*pointPtrpointPtr外的外的“()”()”必不可少。如果缺少必不可少。如果缺少“()”()”,*pointPtr.xpointPtr.x等价于等价于*(pointPtr.x)(pointPtr.x),语义发生了变化,就会产,语义发生了变化,就会产生错误生错误。结构和指针结构和指针(续续)2024/7/10Slide 1-13第第7章章 结构结构通过通过结构指针和成员选择运算符结构指针和成员选择运算符“-”-”来访问结构成员来访问结构成员。pointPtr-x=5.32;等价于:等价于:point1.x=5.32;成员选择运算符成员选择运算符“-”-”的左边应该是一个结构指针而不是结构的左边应该是一个结构指针而不是结构变量。通过结构指针访问结构成员时,通常使用成员选择运算变量。通过结构指针访问结构成员时,通常使用成员选择运算符符“-”-”。结构和指针结构和指针(续续)2024/7/10Slide 1-14第第7章章 结构结构一个结构变量只能表示一个实体的信息,如果有许多相同类一个结构变量只能表示一个实体的信息,如果有许多相同类型的实体,就需要使用结构型的实体,就需要使用结构数组。与数组。与普通数组的不同之处在普通数组的不同之处在于结构数组每个于结构数组每个数组元素都是一个结构类型的数组元素都是一个结构类型的数据。数据。struct point pointArray4;在在声明了结构数组后,通过数组下标和成员选择运算符声明了结构数组后,通过数组下标和成员选择运算符“.”.”来访问结构数组元素中的结构来访问结构数组元素中的结构成员:成员:结构结构数组名数组名下标下标.结构成员名结构成员名pointArray0.x=1.25;pointArray0.y=3.58;pointArray1.x=2.34;pointArray1.y=3.28;结构和数组结构和数组2024/7/10Slide 1-15第第7章章 结构结构结构结构数组名就是结构数组第一个元素地址。可以将结构数组数组名就是结构数组第一个元素地址。可以将结构数组名赋给结构指针,通过结构指针访问结构数组各元素。名赋给结构指针,通过结构指针访问结构数组各元素。struct point pointArray4;struct point*pointPtr=pointArray;pointPtr-x=1.25;pointPtr-y=3.58;(pointPtr+1)-x=2.34;(pointPtr+1)-y=3.28;结构和数组结构和数组(续续)2024/7/10Slide 1-16第第7章章 结构结构【例例7.17.1】编写程序,要求用户从键盘输入编写程序,要求用户从键盘输入n n(3n503n50)个学)个学生的姓名和语文、数学、英语成绩,计算每个学生的平均分,生的姓名和语文、数学、英语成绩,计算每个学生的平均分,输出平均分最高的学生姓名和平均分(保留输出平均分最高的学生姓名和平均分(保留2 2位小数)位小数)。使用结构编写程序使用结构编写程序2024/7/10#include#define ARRAY_SIZE 50struct student/*结构类型结构类型*/char name8;double chinese,math,english;double average;int main(void)struct student studentArrayARRAY_SIZE;/*结构数组结构数组*/struct student maxAverage;/*结构变量结构变量*/int i,n;printf(输入学生人数输入学生人数:);scanf(%d,&n);printf(输入学生的姓名和语文、数学、英语成绩输入学生的姓名和语文、数学、英语成绩:n);Slide 1-17第第7章章 结构结构使用结构编写程序使用结构编写程序(续续)2024/7/10 for(i=0;i n;+i)printf(学生学生%d:,i+1);scanf(%s%lf%lf%lf,studentArrayi.name,&studentArrayi.chinese,&studentArrayi.math,&studentArrayi.english);studentArrayi.average=(studentArrayi.chinese+studentArrayi.math+studentArrayi.english)/3;maxAverage=studentArray0;for(i=1;i n;+i)if(maxAverage.average studentArrayi.average)maxAverage=studentArrayi;printf(平均分最高的学生平均分最高的学生:n);printf(%s 平均分平均分%.2fn,maxAverage.name,maxAverage.average);return 0;Slide 1-18第第7章章 结构结构程序运行过程中,结构数组程序运行过程中,结构数组studentArraystudentArray和结构变量和结构变量maxAveragmaxAverag的的逻辑结构如下:逻辑结构如下:使用结构编写程序使用结构编写程序(续续)2024/7/10Slide 1-19第第7章章 结构结构【例例7.27.2】编写编写程序,要求用户从键盘输入程序,要求用户从键盘输入n n(3n503n50)个学生)个学生的姓名和语文、数学、英语成绩,计算每个学生的总分,按总分的姓名和语文、数学、英语成绩,计算每个学生的总分,按总分从高到低的顺序输出学生的成绩信息从高到低的顺序输出学生的成绩信息。使用结构编写程序使用结构编写程序(续续)2024/7/10#include#include#define ARRAY_SIZE 50struct student/*结构类型结构类型*/char name8;double score3;double total;int comp(const void*p,const void*q)/*比较函数比较函数*/return(struct student*)q)-total-(struct student*)p)-total;int main(void)struct student studentArrayARRAY_SIZE;int i,n;printf(输入学生人数输入学生人数:);Slide 1-20第第7章章 结构结构使用结构编写程序使用结构编写程序(续续)2024/7/10 scanf(%d,&n);printf(输入学生的姓名和语文、数学、英语成绩输入学生的姓名和语文、数学、英语成绩:n);for(i=0;i n;+i)printf(学生学生%d:,i+1);scanf(%s%lf%lf%lf,studentArrayi.name,&studentArrayi.score0,&studentArrayi.score1,&studentArrayi.score2);studentArrayi.total=studentArrayi.score0+studentArrayi.score1+studentArrayi.score2;qsort(studentArray,n,sizeof(struct student),comp);/*排序排序*/printf(按总分从高到低排序按总分从高到低排序:n);for(i=0;i n;+i)printf(%s%8.2f%8.2f%8.2f%8.2fn,studentArrayi.name,studentArrayi.score0,studentArrayi.score1,studentArrayi.score2,studentArrayi.total);return 0;Slide 1-21第第7章章 结构结构【例例7.37.3】编写编写程序,要求用户从键盘输入程序,要求用户从键盘输入n n(3n503n50)个学生)个学生的学号、姓名和成绩,计算并输出学生的成绩等级和不及格人数。的学号、姓名和成绩,计算并输出学生的成绩等级和不及格人数。学生的成绩等级分为:学生的成绩等级分为:9090100100为为A A级,级,80808989为为B B级,级,70707979为为C C级,级,60606969为为D D级,级,0 05959为为E E级。级。使用结构编写程序使用结构编写程序(续续)2024/7/10#include#define ARRAY_SIZE 50struct student/*结构类型结构类型*/int number;char name8;int score;char grade;int main(void)struct student studentArrayARRAY_SIZE,*studentPtr;/*结构指针结构指针*/int i,n,count=0;printf(输入学生人数输入学生人数:);scanf(%d,&n);Slide 1-22第第7章章 结构结构使用结构编写程序使用结构编写程序(续续)2024/7/10 printf(输入学生的学号、姓名和成绩输入学生的学号、姓名和成绩:n);for(i=0;i n;+i)printf(学生学生%d:,i+1);scanf(%d%s%d,&studentArrayi.number,studentArrayi.name,&studentArrayi.score);switch(studentArrayi.score/10)case 0:case 1:case 2:case 3:case 4:case 5:studentArrayi.grade=E;+count;break;case 6:studentArrayi.grade=D;break;case 7:studentArrayi.grade=C;break;Slide 1-23第第7章章 结构结构使用结构编写程序使用结构编写程序(续续)2024/7/10 case 8:studentArrayi.grade=B;break;case 9:case 10:studentArrayi.grade=A;break;/*使用结构指针访问结构数组使用结构指针访问结构数组*/for(studentPtr=studentArray;studentPtr number,studentPtr-name,studentPtr-grade);printf(不及格人数不及格人数:%dn,count);return 0;Slide 1-24第第7章章 结构结构【例例7.47.4】编写编写程序程序,用户,用户从键盘输入年、月、日,计算并输出从键盘输入年、月、日,计算并输出该日是该日是该年的第几天该年的第几天。要求定义和调用函数:。要求定义和调用函数:int int dayOfYear(struct date d)dayOfYear(struct date d),datedate是一个包含年、月、日的结构,是一个包含年、月、日的结构,用用结构变量作为结构变量作为函数参数,函数返回某日是函数参数,函数返回某日是该年的该年的第几天。第几天。结构变量可以作为函数参数。结构变量作为函数参数时,结构实结构变量可以作为函数参数。结构变量作为函数参数时,结构实参和结构形参之间是值传递,需要将结构实参的每个结构成员的参和结构形参之间是值传递,需要将结构实参的每个结构成员的值复制给结构形参对应的结构成员,效率不高值复制给结构形参对应的结构成员,效率不高。结构指针也可以作为函数参数。结构指针作为函数参数时,结构结构指针也可以作为函数参数。结构指针作为函数参数时,结构实参和结构形参之间是引用传递或共享传递,仅仅把结构变量的实参和结构形参之间是引用传递或共享传递,仅仅把结构变量的地址传递给形参,而不用传递整个结构变量的值,节省时间和空地址传递给形参,而不用传递整个结构变量的值,节省时间和空间,效率较高。间,效率较高。结构和函数结构和函数2024/7/10Slide 1-25第第7章章 结构结构结构和结构和函数函数(续续)2024/7/10#include/*例例7.4*/struct date int year;int month;int day;int dayOfYear(struct date d);int main(void)struct date d;printf(输入日期输入日期:);scanf(%d%d%d,&d.year,&d.month,&d.day);printf(该日期是该日期是%d年第年第%d天天n,d.year,dayOfYear(d);return 0;int dayOfYear(struct date d)/*结构变量作为函数参数结构变量作为函数参数*/int i,leapYear,day;Slide 1-26第第7章章 结构结构结构和结构和函数函数(续续)2024/7/10 int dayTable213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 ;leapYear=(d.year%4=0)&(d.year%100!=0)|(d.year%400=0);day=d.day;for(i=1;i d.month;+i)day+=dayTableleapYeari;return day;Slide 1-27第第7章章 结构结构结构和结构和函数函数(续续)2024/7/10#include/*例例7.4的另一种解决方法的另一种解决方法*/truct date int year;int month;int day;int dayOfYear(const struct date*p);int main(void)struct date d;printf(输入日期输入日期:);scanf(%d%d%d,&d.year,&d.month,&d.day);printf(该日期是该日期是%d年第年第%d天天n,d.year,dayOfYear(&d);return 0;int dayOfYear(const struct date*p)/*结构指针作为参数结构指针作为参数*/int i,leapYear,day;Slide 1-28第第7章章 结构结构结构和结构和函数函数(续续)2024/7/10 int dayTable213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 ;leapYear=(p-year%4=0)&(p-year%100!=0)|(p-year%400=0);day=p-day;for(i=1;i month;+i)day+=dayTableleapYeari;return day;Slide 1-29第第7章章 结构结构前面前面为了表示学生的出生日期,声明了如下结构类型:为了表示学生的出生日期,声明了如下结构类型:struct date int year;int month;int day;由于年、月、日都是很小的数,将它们按整型处理会浪费内由于年、月、日都是很小的数,将它们按整型处理会浪费内存空间。存空间。C语言的结构还提供了一种声明位域的机制,使程序员在需要时语言的结构还提供了一种声明位域的机制,使程序员在需要时可以将几个结构成员压缩存放,这是一种数据压缩表示方式可以将几个结构成员压缩存放,这是一种数据压缩表示方式。结构中的位域结构中的位域2024/7/10Slide 1-30第第7章章 结构结构将结构成员声明为位域有两个附加的规定将结构成员声明为位域有两个附加的规定:成员:成员的数据类型的数据类型只能是只能是整型或整型或无符号无符号整型;在整型;在每个位域的后面要指定它所占每个位域的后面要指定它所占用的二进制位数,每个位域占用的二进制位数不能超过整型用的二进制位数,每个位域占用的二进制位数不能超过整型长度。长度。struct date unsigned int year:14;/*能够能够容纳容纳9999*/unsigned int month:4;/*能够容纳能够容纳12*/unsigned int day:5;/*能够容纳能够容纳31*/;可以采用如下方式简化位域的声明。可以采用如下方式简化位域的声明。struct date unsigned int year:14,month:4,day:5;结构中的位域结构中的位域(续续)2024/7/10Slide 1-31第第7章章 结构结构位域的使用方式与其他结构成员的使用方式类似。位域的使用方式与其他结构成员的使用方式类似。struct date birthday;birthday.year=2012;birthday.month=3;birthday.day=15;声明了结构变量声明了结构变量birthday,其三个成员将总共占用,其三个成员将总共占用23位,其中位,其中year占用占用14位,位,month占用占用4位,位,day占用占用5位。假设位。假设int类型的值类型的值占占4个字节(个字节(32位),这样原来用位),这样原来用96位表示的年、月、日,压缩位表示的年、月、日,压缩到用到用32位来表示,节省了内存空间位来表示,节省了内存空间。位域的一个重要限制就是没有地址,因此,不允许将取地址运位域的一个重要限制就是没有地址,因此,不允许将取地址运算符算符&用于位域。用于位域。scanf(%d,&birthday.year);/*错误错误*/结构中的位域结构中的位域(续续)2024/7/10Slide 1-32第第7章章 结构结构联合类型联合类型声明联合类型的声明联合类型的一般形式为:一般形式为:union 结构名 类型名 联合成员名1;类型名 联合成员名2;类型名 联合成员名n;;例如:例如:union data int i;double d;联合的联合的定义以分号结束,定义以分号结束,被看作一条语句被看作一条语句 关键字关键字union和和它后面它后面的的联合联合名名一起组成一个一起组成一个新的数据类型新的数据类型名,称为名,称为联合标记联合标记 Slide 1-33第第7章章 结构结构和和结构变量类似,声明联合结构变量类似,声明联合变量也有三变量也有三种方式种方式。union data int i;double d;union data u1,u2;联合变量联合变量2024/7/10typedef union int i;double d;DATA;DATA u1,u2;union data int i;double d;u1,u2;union int i;double d;u1,u2;Slide 1-34第第7章章 结构结构在在声明联合变量时,可以给联合成员赋初始值,但只能给第声明联合变量时,可以给联合成员赋初始值,但只能给第一个成员赋初始值一个成员赋初始值。union int i;double d;u=0;将联合变量将联合变量u u的成员的成员i i初始化为初始化为0 0。联合变量联合变量(续续)2024/7/10Slide 1-35第第7章章 结构结构联合联合与结构的差异在于它们的表示方式不同。在一个结构变与结构的差异在于它们的表示方式不同。在一个结构变量里,每个成员顺序排列,都有自己独立的内存空间。而一量里,每个成员顺序排列,都有自己独立的内存空间。而一个联合变量的所有成员共享同一个内存空间,因此一个联合个联合变量的所有成员共享同一个内存空间,因此一个联合变量在某一时刻只能保存其中一个成员的值。变量在某一时刻只能保存其中一个成员的值。union int i;double d;u;联合和结构的差异联合和结构的差异2024/7/10Slide 1-36第第7章章 结构结构联合变量的使用方式与结构变量一样。联合变量的使用方式与结构变量一样。u.i=88;u.d=54.8;由于联合变量的成员共享同一个内存空间,改变一个成员的值由于联合变量的成员共享同一个内存空间,改变一个成员的值就会使之前存储在其他成员中的值丢失。因此,如果把就会使之前存储在其他成员中的值丢失。因此,如果把54.8赋赋值给值给u.d,那么先前存储在,那么先前存储在u.i中的中的88就会丢失。同样,改变就会丢失。同样,改变u.i也也会影响会影响u.d。联合变量的使用联合变量的使用2024/7/10Slide 1-37第第7章章 结构结构移位运算符用于将整型或字符型数据的二进制值整体向左或移位运算符用于将整型或字符型数据的二进制值整体向左或向右向右移动。两移动。两个移位运算符:左移位运算符个移位运算符:左移位运算符“”。左移位运算的规则是:将左移位运算符左侧操作数的每一个左移位运算的规则是:将左移位运算符左侧操作数的每一个二进制位向左移动,左端移出的位被丢弃,右端空出的位被二进制位向左移动,左端移出的位被丢弃,右端空出的位被置为置为0 0。unsigned short int a,b;/*假假设无符号短整型占无符号短整型占16位位*/a=9;/*a值二二进制表示:制表示:0000000000001001*/b=a 2;/*a值不不变,b值36,二,二进制表示:制表示:0000000000100100*/a 2;/*a值不不变,b值2,二,二进制表示:制表示:0000000000000010*/a=2;/*a值9,二,二进制表示:制表示:0000000000001001*/移位运算符的优先级低于算术运算符,高于关系运算符移位运算符的优先级低于算术运算符,高于关系运算符。如。如,a 2+1等同于等同于a (2+1),而不是,而不是(a”来访问该存储空间中的结点成员来访问该存储空间中的结点成员num和和next。head-num=88;head-next=NULL;链表链表(续续)2024/7/10Slide 1-50第第7章章 结构结构建立建立和遍历链表和遍历链表编写编写程序,输入若干个正整数,输入程序,输入若干个正整数,输入-1时输入结束,用单向时输入结束,用单向链表组织输入的正整数。定义和调用函数:链表组织输入的正整数。定义和调用函数:struct node*createList(void),建立单向链表,返回指向链表头结点的指,建立单向链表,返回指向链表头结点的指针。定义和调用函数:针。定义和调用函数:void printList(const struct node*head),输出单向链表,输出单向链表。若若输入:输入:1 2 3 4 5-1链表链表(续续)2024/7/10Slide 1-51第第7章章 结构结构链表链表(续续)2024/7/10#include/*例例7.5*/#includestruct node unsigned int num;/*存放正整数存放正整数*/struct node*next;/*指向下一结点指向下一结点*/;struct node*createList(void);void printList(const struct node*head);int main(void)struct node*head=NULL;head=createList();/*建立链表建立链表*/printList(head);/*遍历链表遍历链表*/return 0;Slide 1-52第第7章章 结构结构链表链表(续续)2024/7/10struct node*createList(void)/*建立单向链表建立单向链表*/struct node*head=NULL,*tail,*t;int num;unsigned int size=sizeof(struct node);printf(输入正整数输入正整数:n);scanf(%d,&num);while(num 0)t=(struct node*)malloc(size);t-num=num;t-next=NULL;if(head=NULL)head=t;else tail-next=t;tail=t;scanf(%d,&num);return head;Slide 1-53第第7章章 结构结构指针指针head指向链表的头结点,被称为头指针,对链表的操作指向链表的头结点,被称为头指针,对链表的操作都是从头指针开始的。指针都是从头指针开始的。指针tail指向链表的尾结点。指针指向链表的尾结点。指针t指指向新结点。一开始,指针向新结点。一开始,指针head为为NULL。链表链表(续续)2024/7/10建立头结点建立头结点 head=t;tail=t;建立其余结点建立其余结点 tail-next=t;tail=t;Slide 1-54第第7章章 结构结构链表链表(续续)2024/7/10/*输出单向链表输出单向链表*/void printList(const struct node*head)struct node*p=NULL;for(p=head;p!=NULL;p=p-next)printf(%u,p-num);printf(n);执行执行p=p-next前前执行执行p=p-next后后Slide 1-55第第7章章 结构结构有序链表有序链表如果链表的结点是有序的(按结点中的数据排序),该链表如果链表的结点是有序的(按结点中的数据排序),该链表是有序链表。是有序链表。编写编写程序,输入若干个正整数,输入程序,输入若干个正整数,输入-1时输入结束,用单向时输入结束,用单向链表组织输入的正整数。定义和调用函数:链表组织输入的正整数。定义和调用函数:struct node*createSortList(void),建立单向链表,要求链表按照结点中,建立单向链表,要求链表按照结点中整数值的大小从小到大排序,返回指向链表头结点的指针整数值的大小从小到大排序,返回指向链表头结点的指针。若输入若输入:3 1 5 2-1链表链表(续续)2024/7/10Slide 1-56第第7章章 结构结构链表链表(续续)2024/7/10struct node*createSortList(void)/*建立单向有序链表建立单向有序链表*/struct node*head=NULL,*p,*q,*t;int num;unsigned int size=sizeof(struct node);printf(输入正整数输入正整数:n);scanf(%d,&num);while(num 0)t=(struct node*)malloc(size);/*建立新结点建立新结点*/t-num=num;p=head;while(p!=NULL&p-num next;Slide 1-57第第7章章 结构结构链表链表(续续)2024/7/10 if(p=head)head=t;else q-next=t;t-next=p;scanf(%d,&num);return head;指针指针head指向链表的头结点,被称为头指针,对链表的操作都指向链表的头结点,被称为头指针,对链表的操作都是从头指针开始的。指针是从头指针开始的。指针p指向链表中新结点插入的位置。指指向链表中新结点插入的位置。指针针q指向指向p的前一结点。指针的前一结点。指针t指向新结点。新结点插入在指向新结点。新结点插入在q和和p之间。一开始,指针之间。一开始,指针head为为NULL。Slide 1-58第第7章章 结构结构链表链表(续续)2024/7/10建立建立第一第一个结点个结点新结点插入新结点插入在当前头结点在当前头结点之前之前新结点插入新结点插入在指针在指针p所所指向的结点指向的结点之前,指针之前,指针q所指向的所指向的结点结点之后之后Slide 1-59第第7章章 结构结构2024/7/10课后作业课后作业阅读教材阅读教材第第7章章;准备教材准备教材第第7章章习题,下次课堂提问;习题,下次课堂提问;准备准备实验实验7。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!