版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、制作人:制作人: 黄黄 荧荧制作人单位:河师大数学与信息科学学院制作人单位:河师大数学与信息科学学院第十一章 结构体与共用体本章内容本章内容u结构体变量与结构体变量与的定义、引用和初始化的定义、引用和初始化(重点重点)u结构体变量和数组做为函数的参数结构体变量和数组做为函数的参数 (重点重点)u动态数据结构链表动态数据结构链表(难点难点)u共用体共用体u枚举类型枚举类型u用用 typedef定义类型定义类型11.1 - 11.4 结构体概述及结构体变量的定义、引用、初始化结构体概述及结构体变量的定义、引用、初始化& 结构体是结构体是一种一种数据类型数据类型& 结构体变量可以包含一组结构体变量可
2、以包含一组的数据的数据如如: : 存储学生信息存储学生信息学生的信息包含:学号、姓名,姓别、年龄、分数、地址。学生的信息包含:学号、姓名,姓别、年龄、分数、地址。numnumnamenamesexsexageagescorescore addr addr1001010010李军李军M M181887.587.5北京北京一般形式一般形式: : 类型标识符类型标识符 成员名成员名; ; 类型标识符类型标识符 成员名成员名; ; . .;一一 结构体结构体定义定义: : int int num; num; char name20; char name20; char sex; char sex; i
3、nt int age; age; float score; float score; char addr30; char addr30; ;一一 结构体结构体定义定义:(:( 如,如, student student int int num; char name20; num; char name20; char sex; int char sex; int age; age; float score; char addr30; float score; char addr30; ;namenumsexagescoreaddr2 2字节字节2 2字节字节2020字节字节1 1字节字节4 4字节
4、字节3030字节字节.二二 结构体类型的结构体类型的定义定义: : 一般形式一般形式: : struct struct 如,如, ; ;方式方式1:1: ;方式方式2:2: 方式方式3:3:三三 结构体变量的结构体变量的例例 11.1 11.1 结构体变量的初始化结构体变量的初始化 #include stdio.h#include void main() void main() long num; long num; char name20; char name20; char sex;char sex; char addr20;char addr20; =, , , ,;/=/= print
5、f(NO.:%ldn printf(NO.:%ldn name: %sn, name: %sn, ,);); printf(sex:%cn printf(sex:%cn address: %sn, address: %sn, ,);); 四四 结构体变量的结构体变量的 结构体成员的表示方法:结构体成员的表示方法: 结构体变量名结构体变量名. .成员名成员名 成员成员( (分量分量) )运算符运算符优先级优先级: : 1 1结合性结合性: :从左向右从左向右如如, , stu1.num=123stu1.num=123;关于结构体类型和变量的几点说明关于结构体类型和变量的几点说明:(1-4):(1
6、-4)1) 1) 特别注意特别注意: :和和!num name sex ageBirthdayaddrmonth dayyear4) 4) 可以和程序中的变量名可以和程序中的变量名相同相同, ,二者互不干扰二者互不干扰, ,代表不同的对象代表不同的对象. .如如, , char num10;char num10; char name20; char name20; char sex; char sex; int int age; age; float score; float score; char addr30; char addr30; , , ;结构体结构体的定义的定义: : 是用来是用
7、来的的及其及其. .结构体结构体的定义的定义: :是用来定义是用来定义数据的数据的. .2) 2) 与数组的元素一样与数组的元素一样相当于相当于. .3) 3) 也可以是一个也可以是一个.(.(结构体类型的嵌套结构体类型的嵌套) )如如, , date date int int year; year; int int month; month; int int day; day; ; ; student student intint num; num; char name20; char name20; char sex; char sex; int int age; age; float s
8、core; float score; birthday; birthday; char addr30; char addr30; ;关于结构体变量的引用规则说明关于结构体变量的引用规则说明:(1-5):(1-5)1) 1) 将结构体变量整体输入输出将结构体变量整体输入输出 如如,printf(%d,%s,%fn,stu,printf(%d,%s,%fn,stu); ); X X scanf(%d%s%f,&stu scanf(%d%s%f,&stu ); ); X X printf(%d,%s,%fn,stu.num,,stu.scre printf(%d,%s,%fn,stu
9、.num,,stu.scre); ); scanf(%d%s%f,&stu.num,,&stu.scre scanf(%d%s%f,&stu.num,,&stu.scre ); ); 2) 2) 结构体嵌套时应该逐级引用结构体嵌套时应该逐级引用 如如, , stu1.birthday.month=12;stu1.birthday.month=12;3) 3) 结构体变量成员可以象普通变量一样进行各种运算结构体变量成员可以象普通变量一样进行各种运算 如如, stu1.score=stu2.score;, stu1.score=stu2.score;
10、 sum=stu1.score+stu2.score; sum=stu1.score+stu2.score; stu1.age+; stu1.age+; +stu1.age; +stu1.age;4) 4) 可以引用结构体变量成员的地址可以引用结构体变量成员的地址, ,也可以引用结构体变量的地址也可以引用结构体变量的地址 如如, scanf(%d,&stu.num, scanf(%d,&stu.num ); ); printf(“%dn”,&stu printf(“%dn”,&stu); ); /输出输出stustu首地址首地址5) 5) 可以将一个结构体变量可以将一个结构体变量给另一个结构体
11、变量给另一个结构体变量 如如: stu2=stu1; : stu2=stu1; 11.5 11.5 结构体数组的定义、初始化和使用结构体数组的定义、初始化和使用结构体数组的结构体数组的每个元素每个元素都是都是一一 结构体数组的定义结构体数组的定义structstruct student student int int num num; char name20char name20; char sexchar sex; intint age age; float scorefloat score; char addr30char addr30; ;structstruct student stu
12、dent stuN0stuN0;structstruct student student int int num num; char name20char name20; char sexchar sex; intint age age; float scorefloat score; char addr30char addr30; stuN0stuN0; structstruct int int num num; char name20char name20; char sexchar sex; intint age age; float scorefloat score; char add
13、r30char addr30; stuN0stuN0;stu0stu1stu2stu3stuN0-1.stustructint num;char name20;char sex;int age;float score;char addr30; stu3= 10101,李林李林,M,18,87.5,北京路北京路 103 , 10102,张奋张奋,M,19,99,上海路上海路 130 , 10104,王敏王敏,F,20,78.5, 中山路中山路 1010 ;二二 结构体数组的初始化结构体数组的初始化 10101李林M 18 87.5103 北京路 10102张奋M 19 99130 上海路三三 结
14、构体数组的应用举例结构体数组的应用举例例例11.2 11.2 选票的统计程序选票的统计程序: :三个候选人三个候选人,10,10个选民个选民. .#include stdio.h#include #include string.h#include /定义统计选票的数组定义统计选票的数组structstruct person person char name20; char name20; int int count; count;leader3=leader3=Li,0,Li,0,zhang,0,zhang,0,Fu,0Fu,0;void main()void main() int i,j i
15、nt i,j; ; char leader_name20; char leader_name20;/”/”投票投票”和统计票数和统计票数 for(ifor(i=1;i=10;i+)=1;i=10;i+) printfprintf(请投出你神圣的一票请投出你神圣的一票:n);:n); scanf(%s,leader_name scanf(%s,leader_name);); for(j for(j=0;j3;j+) =0;j3;j+) if( if(strcmp(leader_name,strcmp(leader_name,)=0)=0) ) le
16、aderj leaderjcountcount+;+; /输出结果输出结果 printf(nprintf(n);); for(i for(i=0;i3;i+)=0;i”: (“-”:优先级为优先级为1!)1!)例例11.3 11.3 利用指针法输出一个结构体变量利用指针法输出一个结构体变量#include stdio.h#include #include string.h#include #define FORMAT #define FORMAT No:%ldn name:%sn sex:%cn No:%ldn name:%sn sex:%cn score:%.2fnn score:%.2fn
17、nvoid main()void main() structstruct student student long num; long num; char name20; char name20; char sex; char sex; float score; float score; struct student stu struct student stu, ,; ; stu.num stu.num=89101; =89101; strcpy(,LiLi strcpy(,LiLi);); stu.sex=m; stu.score stu.sex=m; st
18、u.score=89.5;=89.5;printf(FORMAT,printf(FORMAT,stu.numstu.num,,stu.sex,stu.score,,stu.sex,stu.score););printf(FORMATprintf(FORMAT, ,( (* *p).nump).num,(,(* *p).name,(p).name,(* *p).sex,(p).sex,(* *p).scorep).score););printf(FORMAT,printf(FORMAT,p-nump-num,p-name,p-sex,p,p-name,p-sex,
19、p-score);-score); 练习练习: :分析下列运算的含义分析下列运算的含义: :1 1 p-n p-n2 2 p-n+ p-n+3 3 +p-n +p-n( p-n)+p-n)+ +(p-n) +(p-n)二二 用指针移动法访问结构体数组用指针移动法访问结构体数组stu0stu1stu2stu3stuN0-1.stu p-例例11.4 11.4 利用指针移动法利用指针移动法结构体数组结构体数组#include stdio.h#include #define FORMAT %-5d%-20s%2c%4dn#define FORMAT %-5d%-20s%2c%4dnstructstr
20、uct student student int int num; num; char name 20; char name 20; char sex; char sex; int int age; age; stu3=stu3=10101,LiLin,M,1810101,LiLin,M,18, , 10102,Zhang Fun,M,1910102,Zhang Fun,M,19, , 10104,Wang Min,F,2010104,Wang Min,F,20;/主函数主函数void main()void main() * *p; p; printf(No printf(No. Name se
21、x agen); . Name sex agen); for( for(; ; ; ;) ) printf(FORMAT,p-num,p-name,p-sex,p printf(FORMAT,p-num,p-name,p-sex,p-age);-age); 三三 结构体指针作为函数参数结构体指针作为函数参数 P292P292传递结构体变量的值有三种情况传递结构体变量的值有三种情况: :1 1 结构体变量结构体变量作实参作实参 通常是通常是: :简单变量简单变量, ,值传递值传递2 2 结构体结构体作实参作实参 通常是通常是: : 结构体变量结构体变量, ,值传递值传递 费时费内存资源费时费内存
22、资源, ,通常不用此方法通常不用此方法. .可以用指针变量传递结构体变量可以用指针变量传递结构体变量的地址的地址3 3 结构体结构体名作实参名作实参 通常是通常是: : 或或, ,地址传递地址传递例例11.511.5结构体变量结构体变量stustu内含学号、姓名、三门成绩。在主函数中赋值,在函内含学号、姓名、三门成绩。在主函数中赋值,在函数中输出。数中输出。( (结构体结构体作为形参作为形参: :结构体变量中的所有数据结构体变量中的所有数据) )#include stdio.h#include #include #include structstruct student student int
23、 int num; char name20;float score3; ; num; char name20;float score3; ; void print( void print(); ); /函数说明函数说明 struct student stustruct student stu; ; stu.numstu.num=12345;strcpy(stu.Name,Li Li);=12345;strcpy(stu.Name,Li Li); stu.score0=67.5; stu.score1=89; stu.score0=67.5; stu.score1=89; stu.score2=
24、78.6; stu.score2=78.6; print( print();); /函数功能函数功能: : 输出一个结构体变量输出一个结构体变量/入口参数入口参数: : 结构体变量结构体变量 ( (值传递值传递!)!) int int i; i; printf( %dn %sn ,stu.num, printf( %dn %sn ,stu.num,);); for (i=0;i3;i+)printf( %4.1f, for (i=0;i3;i+)printf( %4.1f, stu.scoreistu.scorei );); printf(nn printf(n
25、n ); ); 例例11.6 11.6 结构体变量结构体变量stustu内含学号、姓名、三门成绩。在函数中输出。内含学号、姓名、三门成绩。在函数中输出。 ( (结构体结构体变量作为形参变量作为形参: :一个结构体变量的地址一个结构体变量的地址) )#include stdio.h#include #include #include structstruct student student int int num; num; char name20; char name20; float score3; ; float score3; ; void print( void print(); );
26、 /函数说明函数说明 structstruct student student ; ; print( print();); /函数功能函数功能: : 输出一个结构体变量输出一个结构体变量/入口参数入口参数: : 结构体变量的地址结构体变量的地址 ( (用用来传递地址来传递地址!) !) intint i; i; printf( %dn %sn printf( %dn %sn , , p-num,pp-num,p-name)-name); ; for (i=0;i3;i+)printf( %4.1f, for (i=0;iscoreip-scorei );); printf(nn printf(
27、nn ); ); #define N0 3#include /- /结构体类型的定义struct student long num; char name20; int age; float score; 例例 学生信息数组的输入输出学生信息数组的输入输出( (用指针处理用指针处理) )/- /- /函数功能函数功能: : 输入一个结构体数组的数据输入一个结构体数组的数据/入口参数入口参数: :传递传递和和/返回值返回值: : 无无/-/-void inputa(void inputa(,int,int n) n) struct struct student student * *p;p; pr
28、intf printf(请输入请输入%d%d个学生的信息个学生的信息:n:n,n,n);); printfprintf(学号学号 姓名姓名 年龄年龄 分数分数n);n); for( for(; ; ;) ) scanf(%ld%s%d%f scanf(%ld%s%d%f, , );); /函数功能函数功能: : 输出一个结构体数组的数据输出一个结构体数组的数据/入口参数入口参数: : 和和/返回值返回值: : 无无/-/-void outputa(void outputa(,int,int n) n) struct struct student student * *p;p; printf p
29、rintf(学生的信息学生的信息:n);:n); printf printf(学号学号 姓名姓名 年龄年龄 分数分数n);n); for( for(; ; ;) ) printf(%8ld%8s%6d%7.1fn, printf(%8ld%8s%6d%7.1fn, p-num ,p-name , p-num ,p-name , p-age ,p-score); p-age ,p-score); 例例 学生信息数组的输入输出学生信息数组的输入输出/-/-主函数主函数void main()void main() struct struct student stuN0; student stuN0;
30、 inputa( inputa(, N0);, N0); outputa( outputa(,N0);,N0); 作业:作业:P318P318 ex 11.3 ( ex 11.3 (用移动指针的方法处理用移动指针的方法处理, ,分数门数改为分数门数改为6.) 6.) 11.7 11.7 链表链表-stu0stu1stu2stu3stuN0-1.stuP-P-放第一个放第一个结点的地址结点的地址A AB BC CD D00T T headhead链表的特点链表的特点: :1 1 与数组一样与数组一样, ,链表能放多个数据链表能放多个数据. .2 2 链表的链表的”长度长度”( (结点个数结点个数
31、) )是不固定的是不固定的. .需要放数据就需要放数据就建立一个结点建立一个结点, ,不需要的数据马上释放掉不需要的数据马上释放掉, ,机动灵活机动灵活, ,. .3 3 链表的链表的”元素元素”结点结点的的. .是是”哪有空间哪有空间就塞哪就塞哪”. .东一个结点东一个结点, ,西一个结点西一个结点. .4 4 链表的链表的”元素元素”结点是用指针连接起来的结点是用指针连接起来的. .链表是一串用链表是一串用联系指针联系指针连起来的连起来的结点结点(元素)(元素)一一 链表概述链表概述链表是一串用链表是一串用联系指针联系指针连起来的连起来的结点结点(元素)(元素)结点通常是一个结构结点通常是
32、一个结构体类型的变量体类型的变量是放的是下一个结是放的是下一个结点的点的地址地址,程序就是通过它来,程序就是通过它来依次找到下一个结点的依次找到下一个结点的链表结点的结构体类型的定义链表结点的结构体类型的定义例例: : 放学生学号、姓名、成绩的结点的类型定义放学生学号、姓名、成绩的结点的类型定义: :structstruct student student int int num; num; char name20; char name20; 三个数据域三个数据域 flaotflaot score; score; 联系指针域联系指针域 空指针,标志着空指针,标志着链表的尾部链表的尾部放第一个放
33、第一个结点的地址结点的地址A AB BC CD D00T T headhead: :放第一放第一个结点的地址个结点的地址二二 简单链表简单链表 #include stdio.h#include #define NULL 0#define NULL 0structstruct student student /结点结构体类型结点结构体类型 long num; float score; long num; float score; ;void main()void main() struct student a,b,c struct student a,b,c; ; struct struct s
34、tudent student , ,* *p; p; /=/=建立链表建立链表 a.num=99101; a.scorea.num=99101; a.score=89.5;=89.5; b.num=99103; b.scoreb.num=99103; b.score=90;=90; c.num=99107; c.score c.num=99107; c.score=85; =85; /=/=输出链表输出链表 p=head; p=head; do do printf(%ld %5.1fn,p-num,pprintf(%ld %5.1fn,p-num,p-score);-score); p=p-n
35、ext;p=p-next; while(pwhile(p!=NULL);!=NULL); & &a head headA AB BC C89.589.5&b&b99101991019090&c&c9910399103858509910799107例例11.7 11.7 建立并输出由三个学生信建立并输出由三个学生信息结点构成的链表。学生信息包息结点构成的链表。学生信息包括:学号,成绩。括:学号,成绩。算法分析:算法分析:1 1)定义链表结点的类型)定义链表结点的类型2 2)建立链表:建立结点,)建立链表:建立结点,赋值,连接。赋值,连接。3 3)输出链表:依次逐个结)输出链表:依次逐个结点输出。
36、点输出。三三 处理动态链表所需的函数处理动态链表所需的函数1 1 申请空间的两个函数申请空间的两个函数 void void指针类型指针类型 申请申请sizesize个字节的存储空间个字节的存储空间所申请存储空间的首地址所申请存储空间的首地址, ,申请不成功返回申请不成功返回NULLNULL. .如:如:structstruct student student * *p;p; len len= =(struct(struct student); student);或或: : (struct(struct student) student) , , 申请申请n n个大小为个大小为sizesize字
37、节的存储空间字节的存储空间所申请存储空间的首地址所申请存储空间的首地址, ,申请不成功返回申请不成功返回NULLNULL. .2 2 释放空间的函数释放空间的函数 释放指针释放指针p p所指向的结点所占的空间。所指向的结点所占的空间。四四 建立动态链表建立动态链表A AB BC CD D0T T headhead例例11.8 11.8 写一个函数建立一个有写一个函数建立一个有3 3名学生的单向动态链表名学生的单向动态链表. .( (学生信息包括学号和分数学生信息包括学号和分数.).)算法分析算法分析: :1 1 建立结点的结构体类型建立结点的结构体类型2 2 构造链表构造链表: : 1) 1)
38、 建立头指针建立头指针 为新结点申请空间为新结点申请空间 给新结点的数据域赋值给新结点的数据域赋值 连接新结点连接新结点/3 /3 输出链表输出链表( (下一个例题下一个例题) )head=NULL (head=NULL (建立空链表建立空链表) )为为申请空间申请空间输入学号和分数输入学号和分数(p1,p2(p1,p2指向它指向它) ) p1-num0p1-num0n+;n+;新结点新结点p2=p1;(p2=p1;(使得使得p2p2指向表尾指向表尾) )建立新结点建立新结点: :1)1)为结点申请空间为结点申请空间( (mallocmalloc() () 2)2)输入学号和分数输入学号和分数
39、将将NULLNULL放入放入的连接指针域的连接指针域例例11.8 11.8 建立链表的函数建立链表的函数#include stdio.h#include #include malloc.h#include #define NULL 0#define NULL 0#define LEN #define LEN sizeof(structsizeof(struct student) student)#define #define /-/-定义链表的结点类型定义链表的结点类型STUNODESTUNODE long num; long num; float score; float score; ST
40、UNODE STUNODE * *next;next;/-/-intint n; n; /全局变量,放结点个数全局变量,放结点个数建立链表的函数:建立链表的函数:/函数功能函数功能: :建立学生信息的链表建立学生信息的链表/入口参数入口参数: :无无/返回值返回值: : 链表的头指针链表的头指针STUNODE STUNODE * *create(voidcreate(void) ) STUNODESTUNODE * *head,head,* *p1,p1,* *p2; p2; n=0; n=0; head=NULL; head=NULL; p1=p2=(STUNODE p1=p2=(STUNO
41、DE * *)malloc(LEN)malloc(LEN ); ); while (while (!=0)!=0)p2=p1; p2=p1; p1=(STUNODE p1=(STUNODE * *)malloc(LEN)malloc(LEN ); ); return return; ; head=NULL (head=NULL (建立空链表建立空链表) )为为申请空间申请空间输入学号和分数输入学号和分数(p1,p2(p1,p2指向它指向它) ) p1-num0p1-num0n+;n+;新结点新结点p2=p1;(p2=p1;(使得使得p2p2指向表尾指向表尾) )建立新结点建立新结点: :1)1
42、)为结点申请空间为结点申请空间( (mallocmalloc() () 2)2)输入学号和分数输入学号和分数将将NULLNULL放入放入的连接指针域的连接指针域五五 输出链表输出链表A AB BC CD D0T T headheadp p p p/函数功能函数功能: :输出学生信息的链表输出学生信息的链表/入口参数入口参数: : 链表的头指针链表的头指针/返回值返回值: : 无无 /-/-void print(void print(STUNODESTUNODE * *head)head)STUNODE STUNODE * *p;p; printf printf(学号学号 分数分数 n); n)
43、; /表头表头 p=head;p=head; while(pwhile(p!=NULL)!=NULL) / / 主函数主函数void main ()void main () STUNODE STUNODE * *head;head; head=create( ); head=create( ); print(head print(head);); 算法思想:算法思想:1 p1 p指向表头:指向表头:p=head;p=head; 输出输出p p所指向的结点:所指向的结点:* *p p 前进指针:前进指针:p=p-next;p=p-next;4 4 重复重复2 2,3 3直到直到p=NULL.p=
44、NULL.六六 对链表的删除操作对链表的删除操作: (: (先定位先定位, ,再删除再删除.).)A AB BC CD D0T T headheadp2p2p1p1 所删结点不在表头所删结点不在表头(p1head):(p1head): 欲删结点在表头欲删结点在表头(p1=head):(p1=head):A AB BC CD D0T T headheadp1p1六六 对链表的删除操作对链表的删除操作: (: (先定位先定位, ,再删除再删除.).)A AB BC CD D0T T headheadp2p2p1p11 1 表为空表表为空表(head=NULL):(head=NULL):不用删不用删
45、. .2 2 当表不空时当表不空时: : a) a)定位定位: :使使p1p1指向欲删结点指向欲删结点,p2,p2指向指向它的前一个结点它的前一个结点. . b) b)删除删除: (: (两种可能情况两种可能情况) ) 欲删结点在表头欲删结点在表头(p1=head):(p1=head): head=p1-next;free(p1); head=p1-next;free(p1); 所删结点不在表头所删结点不在表头(p1head):(p1head): p2-next=p1-next;free(p1); p2-next=p1-next;free(p1); return head return hea
46、dreturn headreturn head输出信息输出信息: :没有找到该学生没有找到该学生的信息的信息p1-num=nump1-num=num真真 假假p1=head(p1=head(定位定位) )head=NULLhead=NULL真真 假假删除链表结点的函数删除链表结点的函数: :/函数功能函数功能: : 删除链表中指定学号的结点删除链表中指定学号的结点/入口参数入口参数: : 和和/返回值返回值: : 链表的头指针链表的头指针/-/-STUNODE STUNODE * *del(STUNODEdel(STUNODE * *head, long num)head, long num)
47、 STUNODESTUNODE * *p1,p1,* *p2; p2; if(head=NULL) printfif(head=NULL) printf(这是一个空表这是一个空表!n); !n); return head; return head; p1=head; p1=head; while(while(num(num!=p1-num)!=p1-num)&(p1-next!=NULL)(p1-next!=NULL) )if(numif(num=p1-num) =p1-num) free(p1); n-; free(p1); n-; printf(%ld printf(%ld 被删除了被删除
48、了.n,num.n,num);); else printfelse printf(没有找到指定学号没有找到指定学号:%ld n,num:%ld n,num););return head; return head; return headreturn head输出信息输出信息: :没有找到该没有找到该学生信息学生信息p1-num= num真 假p1=headhead=NULL真 假七七 对链表的对链表的保序插入保序插入操作操作 ( (从小到大。先定位,后插入从小到大。先定位,后插入) ) A AB BC CD D0T T headheadp2p2p0p0p1p1 插到中间插到中间: : 插到表头
49、插到表头: :插到表尾:插到表尾:A AB BC CD D0T T headheadp0p0p1p10p0p0p1p1A AB BC CD DT T headhead七七 对链表的对链表的保序插入保序插入操作操作 ( (从小到大。先定位,后插入从小到大。先定位,后插入) ) A AB BC CD D0T T headheadp2p2p0p0p1p11 1 表为空表表为空表, ,表头指针指向新结点表头指针指向新结点p0: head=p0; p0-next=NULL;p0: head=p0; p0-next=NULL;2 2 当表不空时当表不空时: : a) a)定位定位: : 使得使得,p2,p
50、2指向它前面指向它前面的结点的结点. . b) b)插入插入: (: () ) 当当p0p0要插到表头要插到表头(p1=head):(p1=head): head=p0; p0-next=p1; head=p0; p0-next=p1; 当新结点是插到表的中部当新结点是插到表的中部: : p2-next=p0; p0-next=p1; p2-next=p0; p0-next=p1; 当新结点是插到表尾当新结点是插到表尾: : p1-next=p0; p0-next=NULL; p1-next=p0; p0-next=NULL;例例11.11 11.11 保序插入给定结点的函数:保序插入给定结点
51、的函数:/函数功能函数功能: : 保序插入给定的结点保序插入给定的结点/入口参数入口参数: : 和和/返回值返回值: : 链表的头指针链表的头指针STUNODE STUNODE * *insert(STUNODE insert(STUNODE * *head,STUNODEhead,STUNODE * *stud)stud) STUNODE STUNODE * *p0,p0,* *p1,p1,* *p2 ;p2 ; p1=head; p1=head;if(headif(head=NULL) =NULL) /表为空表表为空表 head=p0;p0-next=NULL;head=p0;p0-nex
52、t=NULL; else else /表不空表不空 while (while (p0-nump1-num)(p0-nump1-num)&(p1-next!=NULL)(p1-next!=NULL) ) p2=p1;p1=p1 p2=p1;p1=p1-next; next; if(p0-numnum) if(p0-numnum) elsep1-next=p0;p0-next=NULL; elsep1-next=p0;p0-next=NULL; n+; return head; n+; return head; 1 1 表为空表表为空表, ,表头指针指向新结点表头指针指向新结点p0: p0: he
53、ad=p0; p0-next=NULL;head=p0; p0-next=NULL;2 2 当表不空时当表不空时: : a) a)定位定位: : 使得使得,p2,p2指向它前面的指向它前面的结点结点. . b) b)插入插入: (: () ) 当当p0p0要插到表头要插到表头(p1=head):(p1=head): head=p0; p0-next=p1; head=p0; p0-next=p1; 当新结点是插到表的中部当新结点是插到表的中部: : p2-next=p0; p0-next=p1; p2-next=p0; p0-next=p1; 当新结点是插到表尾当新结点是插到表尾: : p1-
54、next=p0; p0-next=NULL; p1-next=p0; p0-next=NULL;对链表的综合操作对链表的综合操作 将前边将前边4 4个函数放在一个函数放在一个个c c程序中,再加上一个程序中,再加上一个主程序就可以实现对链表主程序就可以实现对链表的综合处理的综合处理: :void main()void main() STUNODE STUNODE * *head, head, ; ; long del_num long del_num; ; printf(n printf(n 输入学生记录输入学生记录:n);:n); head=create();head=create(); p
55、rint(headprint(head);); /-/-删除操作删除操作 printf(nprintf(n 输入要删除学生的学号输入要删除学生的学号:n);:n); scanf(%ld,&del_num scanf(%ld,&del_num);); head=del(head,del_numhead=del(head,del_num);); print(head print(head); ); /-/-插入操作插入操作 printf(nprintf(n输入要插入学生的记录输入要插入学生的记录:n);:n); scanf(%ld%f,&stu.num,&stu.score scanf(%ld%f
56、,&stu.num,&stu.score);); head=insert(head,&stuhead=insert(head,&stu);); print(headprint(head);); 八八 对链表的多个结点删除与插入:对链表的多个结点删除与插入:void main()void main() STUNODE STUNODE * *head, head, ; ; long del_num long del_num; ;printfprintf (n (n 输入学生记录输入学生记录:n);:n);head=create();head=create(); print (head);print
57、 (head);/=/=多个结点的删除多个结点的删除printf(nprintf(n 输入要删除学生的学号输入要删除学生的学号:);:);scanf(%ld,&del_numscanf(%ld,&del_num);); print(head print(head); ); printf(n printf(n 输入要删除学生的学号输入要删除学生的学号:):); ; scanf(%ld,&del_num scanf(%ld,&del_num);); /=/=多个结点的插入多个结点的插入printf(nprintf(n 输入要插入学生的记录输入要插入学生的记录:n);:n);scanf(%ld%f,
58、&stu-num,&stuscanf(%ld%f,&stu-num,&stu-score);-score); print (head); print (head); printf(n printf(n输入要插入学生的记录输入要插入学生的记录:n);:n); stu=(STUNODE stu=(STUNODE* *)malloc(LEN)malloc(LEN); ); scanf(%ld%f,&stu-num,&stu scanf(%ld%f,&stu-num,&stu-score);-score); 1 编写一个建立学生信息编写一个建立学生信息(包含学号和分数包含学号和分数)链表的程序链表的程
59、序,包包含两个函数:含两个函数: 1)建立链表的函数建立链表的函数:要求在建立链表时要求在建立链表时,将将. 2)输出链表的函数输出链表的函数另外在主函数中调用它们另外在主函数中调用它们.2 P318 ex11.12 (逆序逆序,思路与题目思路与题目1类似类似) 3 ex11.11(删除指定年龄的结点,删除多结点的情况。删除指定年龄的结点,删除多结点的情况。)11.8 共用体共用体 (也叫联合体也叫联合体)union union 共用体共用体类型类型名名 类型标识符类型标识符 成员名成员名; ; 类型标识符类型标识符 成员名成员名; ; . .;如, union data int i; cha
60、r ch; float f; a,b,c;b.ch=a; 共用体变量的成员的引用与结构体成员的引共用体变量的成员的引用与结构体成员的引用形式上一样用形式上一样: : 共用体定义的一般形式:& 共用体是构造数据类型& 使几个不同类型的变量(相互覆盖)当然当然! !sizeof(unionsizeof(union data)=4 data)=4关于共用体类型的几点说明关于共用体类型的几点说明:(1-6):(1-6)1 1 共用体类型变量的成员共用体类型变量的成员, ,每一时刻只能有一个成员的值每一时刻只能有一个成员的值存放在其中存放在其中2 2 最后一次存放共用体成员的值将覆盖掉其他成员的值最后一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026银行笔试面试题目及答案
- 2026银行类经济面试题及答案
- 2026应变反应面试题及答案
- 2026应急局组织面试题及答案
- 曹雪芹《金兰契互剖金兰语风雨夕闷制风雨词》(节选)阅读答案
- (2026版)《不良事件报告奖惩机制》
- 2026催化师培训面试题及答案
- (2026年)世界无烟日活动总结
- 小学五年级德育《讲文明懂礼仪 争做文明小使者》主题班会教学设计
- 初中八年级英语上册Units 3~4中考一轮复习教学设计
- 中医情志护理操作指南
- 2026磁流变抛光材料精密加工领域技术替代可能性报告
- 客户订单台账
- 油罐区(油罐车、油站设备)着火应急处置方案培训课件
- 2025年深圳非高危安全管理员和企业负责人习题有(含答案)
- 湖南省郴州市苏仙区2024-2025学年九年级上学期期中考试化学试题(含答案)
- 《保险基础知识》人保财险系统新员工上岗资格考试题库及答案
- 中考语文语基考点:语法知识(词性、短语结构、句子成分、复句)
- 《逻辑学》(第三版)课件 第6章 传统归纳逻辑
- 老师家访培训课件
- 2025年江苏国信电力笔试题目及答案
评论
0/150
提交评论