《C语言课件(第九章)》由会员分享,可在线阅读,更多相关《C语言课件(第九章)(54页珍藏版)》请在金锄头文库上搜索。
1、第九章 结构体与共用体目的要求: 掌握结构体和共用体定义和引用方式 学习用结构体和共用体处理数据 掌握链表的创建方式和基本应用重点难点: 结构体的定义 结构体数组的使用 链表的应用9.1 结构体&结构体是一种构造数据类型&用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体例 struct student int num; char name20; char sex; int age; float score; char ad
2、dr30; ; namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节.结构体类型定义描述结构的组织形式,不分配内存例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 9.2 结构体变量的定义先定义结构体类型,再定义结构体变量v一般形式: struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;struct 结构体名 变量名表列;例 #define STUDENT struct
3、student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2; 定义结构体类型的同时定义结构体变量一般形式:struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .变量名表列;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 直接定义结构体变量一般形式:struct 类型标识符 成员名; 类型标识符
4、成员名; .变量名表列;例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 用无名结构体直接定义变量只能一次说明v结构体类型与结构体变量概念不同l类型:不分配内存; 变量:分配内存l类型:不能赋值、存取、运算; 变量:可以v结构体可嵌套v结构体成员名与程序中变量名可相同,不会混淆例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birt
5、hday; stu;numnamebirthdaymonthdayyear例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyear9.3 结构体变量的引用引用规则v 结构体变量不能整体引用,只能引用变量成员v可以将一个结构体变量赋值给另一个结构体变量v结构体嵌套时逐级引用成员(分量)运算符优先级: 1结合性:从左向右引用方式: 结构体变量名.成员名例 struct student int num; char
6、name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ()例
7、 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct student int num; char name20; ch
8、ar sex; int age; float score; char addr30; stu1,stu2; if(stu1=stu2). ()9.4 结构体变量的初始化形式一:struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;struct 结构体名 结构体变量=初始数据;例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;形式二:struct 结构体名 类型标识
9、符 成员名; 类型标识符 成员名; .结构体变量=初始数据;例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式三:struct 类型标识符 成员名; 类型标识符 成员名; .结构体变量=初始数据;例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;
10、 9.5 结构体数组结构体数组的定义三种形式:形式一: struct student int num; char name20; char sex; int age; ;struct student stu2;形式二: struct student int num; char name20; char sex; int age; stu2;形式三: struct int num; char name20; char sex; int age; stu2;numnamesexagenumnamesexagestu0stu125B结构体数组初始化例 struct int num; char nam
11、e20; char sex; int age; stu =,;顺序初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 例 struct student int num; char name20; char sex; int age; stu =,;分行初始化: struct student int num; char name20; char sex; int a
12、ge; ;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化时维数可省结构体数组引用引用方式: 结构体数组名下标.成员名 struct student int num; char name20; char sex; int age; str3;stu1.age+;strcpy(stu0.name,”ZhaoDa”);例 统计后选人选票struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;
13、 main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0) leaderj.count+; for(i=0;i成员名结构体变量名.成员名指向运算符优先级: 1结合方向:从左向右例 指向结构体的指针变量main() struct student long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.nu
14、m=89101; strcpy(stu_1.name,Li Lin); p-sex=M; p-score=89.5; printf(nNo:%ldnname:%snsex:%cnscore:%fn, (*p).num,p-name,stu_1.sex,p-score);例 int n; int *p=&n; *p=10; n=10struct student stu1;struct student *p=&stu1;stu1.num=101; (*p).num=101指向结构体数组的指针例 指向结构体数组的指针struct student int num; char name20; char
15、sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1用指向结构体的指针作函数参数v用结构体变量的成员作参数-值传递v用指向结构体变量或数组的指针作参数-地址传递v用结构体变量作参数-多值传递,效率低struct data int a, b, c; ;main() void func(struct data); s
16、truct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process
17、.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Return.n);arga :27b: 3c :30(main)(func)parma :27b: 3c :30copyarga :27b: 3c :30(main)(func)parma :18b: 5c :90arga :27b: 3c :30(main)arga :27b: 3c :30(main)例 用结构体变量作函数参数struct data int a
18、, b, c; ;main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(&arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm) printf(parm-a=%d parm-b=%d
19、 parm-c=%dn,parm-a,parm-b,parm-c); printf(Process.n); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); printf(Return.n);arga :18b: 5c :90(main)arga :27b: 3c :30(main)例 用结构体指针变量作函数参数arga :27b: 3c :30(main)(func)parm*arga :18b: 5c :90(main)(func)p
20、arm*9.7 共用体&构造数据类型,也叫联合体&用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:union 共用体名 类型标识符 成员名; 类型标识符 成员名; .;例 union data int i; char ch; float f; ;fchi类型定义不分配内存形式一: union data int i; char ch; float f; a,b;形式二: union data int i; char ch; float f; ; union data a,b,c,*p,d3;形式三: union int i; char ch; float f; a,b,
21、c;共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在共用体变量引用v引用方式:例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (编译通过,运行结果不对) v引用规则l不能引用共用体变量,只能引用其成员共用体指针名-成员名共用体变量名.成员名(*共用体指针名).成员名union data int i; char ch; float f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d
22、0.ch d0.fl共用体变量中起作用的成员是最后一次存放的成员例 union int i; char ch; float f; a; a=1; () l不能在定义共用体变量时初始化例 union int i; char ch; float f; a=1,a,1.5; () l可以用一个共用体变量为另一个变量赋值例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; ()例 将一个整数按字节输出01100001 01000001低字节高字节0100000101100001ch0c
23、h1运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1);结构体与共用体v区别: 存储方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在v联系: 两者可相互嵌套例 结构体
24、中嵌套共用体 name numsexjobclasspositionLiWang10112086FMST501prof循环n次读入姓名、号码、性别、职务job=s真真假假读入class读入position输出“输入错”循环n次job=s真假输出:姓名,号码,性别,职业,班级输出:姓名,号码,性别,职业,职务job=tstruct int num; char name10; char sex; char job; union int class; char position10; category;person2;例共用体中嵌套结构体,机器字数据与字节数据的处理 00010010 0011010
25、0低字节高字节0011010000010010lowhigh0x123400010010 11111111低字节高字节1111111100010010lowhigh0x12ffstruct w_tag char low; char high;union u_tag struct w_tag byte_acc; int word_acc;u_acc;word_accbyte_acc.lowbyte_acc.highu_acc共用体变量的应用1.#include 2.struct student3. int type; /* 0表示学生,1表示老师 */4. union5. char stuID1
26、0,teachID10; /* 学号、编号 */6. number;7. char name12;8.a;9.main()10. printf(Input the members type(0 is student,1 is teacher):n);11. scanf(%d,&a.type);12. if(a.type)13. printf(Input the teachers No:n); scanf(%s,a.number.teachID);14. else15. printf(Input the students No:n); scanf(%s,a.number.stuID);16. 1
27、7. printf(Input the name:n); scanf(%s,a.name);18. if(a.type) /*输出变量成员信息*/19. printf(No:%s Name:%s n,a.number.stuID,a.name);20. else21. printf(No:%s Name:%s n,a.number.teachID,a.name);22.9.8、枚举类型1、概述 P291 所谓“枚举”,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 枚举类型也是用户自定义的数据类型,用此种类型声明的变量只能取指定的若干值之一。2、定义枚举类型一般形式enum
28、cnred,yellow,blue,while,black;enum daysun,mon,tue,wed,thu,fri,sat; 0 , 1 , 2 , 3, 4, 5 (有值常量)花括号中间的数据项称“枚举元素”或“枚举常量”,是用户定义的标识符。3、枚举型变量的声明 enum cn a,b,c; enum day x,y,z; 亦可在定义类型时同时声明枚举型变量: enum cnred,yellow,blue,white,black a,b,c;【注意】枚举元素为有值常量,默认为0,1,2,3 但定义时不能将 enum cnred,yellow,blue,while,black; 写成
29、 enum cn0,1,2,3,4; 也不能对元素直接赋值,如red=3; 应先进行强制类型转换才能赋值。见P292 a=2; a=(enum cn)2 或 x=(enum day)(5-3); 但可在定义时改变其值。示例一、以下程序的运行结果是什么?main() enum colorred,green=4,blue,white=blue+10; printf(%d,%d,%dn,red,blue,white);二、以下正确的枚举类型定义是 。A) enum a=“sun”,”mon”,”tue”; B) enum bsun=7,mon=-1,tue;C) enum c 7,1,2; 结果:结
30、果: 0 0,5 5,1515答案:答案:B B示例main() enum colorred,green,blue,white; enum color fc; clrscr(); printf(请输入色号:); scanf(%d,&fc); switch (fc) case red:printf(红色!);break; case green:printf(绿色!);break; case blue:printf(蓝色!);break; case white:printf(白色!);break; default:printf(其他颜色!); 9.9 typedef类型定义类型定义在C语言中,除了
31、提供标准的类型和自定义的结构体、共用体和枚举类型外,也可使用typedef定义新的类型名来代替已有的类型名。新的类型名与标准的类型名一样,可以定义相应的变量。使用typedef的目的,一个是给数据类型一个易记住的名子,另一个是简化一些比较复杂的类型声明。typedef语句的一般形式为: typedef 原数据类型原数据类型 新的类型名新的类型名;如: typedef char CHARACTER; typedef int INTEGER;typedef类型定义类型定义经上述定义后,CHARACTER就与char等价,INTEGER与int等价,例如: char k; int i;与 CHAEA
32、CTER k; INTEGER i;是等价的。上述的定义类型名的别名是为了更好给变量一个易记且有意义的名子,也可以简化一些复杂的类型声明,如声明结构体类型: typedef struct char name12,sex; int age; STUDENT;typedef类型定义类型定义声明了新的类型名STUDENT,代表上面指定一个结构体类型。这时也这样定义结构体变量: STUDENT stu1,stu2;则stu1和stu2都属于结构体类型变量,等价于: struct student char name12,sex; int age; stu1,stu2;这样就简化了结构体变量的声明。typ
33、edef类型定义类型定义同样typedef也可以定义数组类型和指针类型,定义的方法与上述的方法相类似。如以下例子中: typedef struct student char name12,sex; int age; STUDENT, *STU;STUDENT,与*STU是等价的,都代替了结构体类型struct student,则STUDENT *stu1, *stu2;与STU stu1, stu2等价。值得注意的是,typedef只能对已存在的类型增加一个类型名,并没有定义的新的类型,而且typedef只能用来定义各种类型名,而不可定义变量。同时建议读者把用typedef定义的类型名用大写字
34、母表示,以区别系统提供的标准类型。10.8 本章小结本章小结通过本章对结构体和共用体的学习,了解了结构体和共用体的特点和各种使用方法,以及共用体与结构体的区别,同时也学习了链表这一动态进行存储分配的数据结构。读者在对本章的学习中,应注意如下几点:(1)结构体的定义形式为: struct 结构体名 类型标识符 成员1; 类型标识符 成员2; 类型标识符 成员n; ;本章小结本章小结(2)结构体变量有三种定义形式:先定义结构体类型,后定义结构体变量;定义结构体类型的同时定义结构体变量;不定义结构体类型名,直接定义结构体变量。(3)C语言一般不允许对结构体变量的整体引用,所以对结构体的引用只能是对分
35、量的引用,结构体变量中的任一分量可以表示为:结构体变量名成员名。(4)C语言中数组的成员可以是结构体变量,结构体变量的成员也可以是数组。结构体数组有三种定义形式:先定义结构体类型,后定义结构体数组;定义结构体类型的同时定义结构体数组;不定义结构体类型名,直接定义结构体变量。(5)结构体变量中的成员可以是指针变量,也可以定义指向结构体的指针变量,指向结构体的指针变量的值是某一结构体变量在内存中的首地址。结构体指针的定义形式: struct 结构体类型名结构体类型名 *结构体指针变量名结构体指针变量名;本章小结本章小结(6)结构体的成员可以是指针类型,且这个指针类型就是本结构体类型的,这样可以构造
36、出一种动态数据结构成为链表。(7)结构体变量的成员可以作函数的参数、指向结构体变量的指针也可以作函数的参数。(8)共用体是用同一段内存存放不同类型的数据,所以在每一时刻内存只有一个成员,共用体变量存放的数据是最后放入的数据。共用体变量的长度是最大的成员的长度共用体变量的地址和它所有成员的地址都是相同的。(9)不能对共用体进行初始化,也不能对共用体变量进行赋值。可以用指向共用体变量的指针作为函数的参数,但不能用共用体变量名作为函数的参数。本章小结本章小结(10)枚举类型仅适用于取限值有限的变量。(11)typedef只能对已存在的类型增加一个类型名,并没有定义的新的类型,而且typedef只能用
37、来定义各种类型名,而不可定义变量。重点:结构体及结构体类型的定义,结构体类型变量,结构体数组,指向结构体的指针。难点:结构体数组,链表的概念及操作,结构体变量成员与共用体变量成员在内存分布形式。9.8 链表链表的概念链表的概念链表是利用结构体和指针构造的一种常见的数据结构,它是由若干个结点串连在一起的,可以进行动态地存储分配,链表的长度不固定,可以随时增加或删除。链表可分为单向链表、双向链表、循环链表等。在本节中,只讨论单向链表。一个链表由头指针、若干个结点和一表尾组成,链表的中每个结点包括两个部分,即数据元素信息和指针元素信息,数据元素信息存放用户所用到的信息,元素信息存放指向下一个结点地址
38、的信息。特点:按需分配内存不连续存放有一个“头指针”(head)变量每个结点中应包括一个指针变量,用它存放下一结点的地址。最后一个结点的地址部分存放一个“NULL” (空地址)。链表结点定义形式定义形式: struct student int number; char name6; struct student *next; ;链表操作常用技术语句p=p-next 在链表结点间顺序移动指针 将p原来所指结点中next的值赋给p,而p-next值即下一结点起始地址,故p=p-next 的作用是使p指向下一结点起始地址。 p2-next=p1 将新结点添加到现在链表中 如果p2是链表中的末结点,p
39、1指新建结点,此句的功能是使p1所指新结点变成链表中的新的末结点。 p2-next=NULL 让p2所在结点成为链表中最后结点示例若已建立下面的链表结构,指针p指向某单向链表的首结点,如下图所示。struct node int data; struct node *next; *p;以下语句能正确输出该链表所有结点的数据成员data的是 。 A) for ( ;p!=NULL;p+) printf(“%7d,”,p-data); B) for ( ;!p;p=p-next) printf(“%7d,”,(*p).data); C) while (p) printf(“%7d,”,(*p).da
40、ta); p=p-next; D) while (p!=NULL) printf(“%7d,”, p-data); p+; 答案:C链表指针p+表示什么?main() struct stu int num; char *name; int age; st=12,ABC,100,*p=&st; clrscr(); printf(%pn,p+); printf(%pn,p+); printf(%pn,p+); printf(%pn,p+); printf(%dn,sizeof(st); 结果: FFDA FFE0 FFD6 FFEC 6结论: 若p指向某个结构体变量,则 p+ 的功能是将指针p 移
41、到本结点后的存储单元,而不是本结点的下一个成员处。所以链表中不能用p+进行结点间的跳转。 静态链表的建立 P274 例11.7#define NULL 0struct student long num; float score; struct student *next;main() struct student a,b,c,*head,*p; a.num=99101;a.score=89.5; b.num=99103;b.score=90; c.num=99107;c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head;
42、do printf(%ld,%.1fn,p-num,p-score); p=p-next; while(p!=NULL);注意有关技巧:结点是如何定义的?结点是如何建立的?如何使诸结点形成链表?最后一个结点如何建立?如何从一个结点转到下一结点?如何遍历所有结点?内存分配函数1、“动态内存分配”的概念 使用户程序能在运行期间动态地申请和释放内存空间,从而更有效地利用内存并提高程序设计的灵活性。 如,为了保证程序的通用性,最大需要建立一个1000个元素的字符数组,每个数组元素占30个字符,共需30000个字节存储空间。但程序某次运行时,可能只使用30个数组元素,于是就有29100个字节的已分配存储
43、空间被浪费。 此时,可通过动态内存分配技术,将程序设计成运行时才向计算机申请内存,并在用完时立即释放占用的内存空间。 使用动态内存分配技术建立的链表称为“动态链表”。2、动态内存分配函数 P275/P387 以下函数在malloc.h或stdlib.h中定义(n,x为无符号整数,p为指针变量):void *malloc(x) 分配一个长度为x字节的连续空间,分配成功返回起始地址指针,分配失败(内存不足)返回NULLvoid *calloc(n,x) 分配n个长度为x字节的连续空间(成败结果同上)void *realloc(p,x) 将p所指的已分配空间大小调整为x个字节void free(p)
44、 将由以上各函数申请的以p为首地址的内存空间全部释放动态内存分配函数使用示例#include stdlib.hmain( ) char *p; p=(char *)malloc(17); if (!p) printf(内存分配出错); exit(1); strcpy(p,This is 16 chars); /*如果超过16个字符,可能破坏程序其他部分*/ p=(char *)realloc(p,18); if (p=NULL) printf(内存分配出错); exit(1); strcat(p,.); printf(p); free(p);结果:结果:This is 16 chars.Thi
45、s is 16 chars.动态链表的建立和遍历示例(后进先出的数据结构,即所谓“栈”)#define NULL 0 struct info int data; struct info *next; ;main() struct info *base,*p; int n; base=NULL; for(n=0;n10;n+) for(n=0;ndata=n+1; p-data=n+1; p-next=base; p-next=base; base=p; base=p; while (p!=NULL) while (p!=NULL) printf(%4d,p-data); printf(%4d,
46、p-data); p=p-next; p=p-next; 结果:10 9 8 7 6 5 4 3 2 1 动态链表的建立和遍历示例(以建立P274链表为例)#define NULL 0 struct info long num; int score; struct info *next; ;main() struct info *head,*p1,*p2; int n=1; clrscr(); head=p1=p2=(struct info *)malloc(sizeof(struct info); head=p1=p2=(struct info *)malloc(sizeof(struct
47、info); printf( printf(请输入第请输入第%d%d个同学的学号和成绩个同学的学号和成绩:,n+);:,n+); scanf(%ld,%d,&p1-num,&p1-score); scanf(%ld,%d,&p1-num,&p1-score); while(p1-num!=0) while(p1-num!=0) p1=(struct info *)malloc(sizeof(struct info); p1=(struct info *)malloc(sizeof(struct info); if(!p1) if(!p1) printf( printf(内存分配出错内存分配出错
48、! ); exit();! ); exit(); printf( printf(请输入第请输入第%d%d个同学的学号和成绩个同学的学号和成绩:,n+);:,n+); scanf(%ld,%d,&p1-num,&p1-score); scanf(%ld,%d,&p1-num,&p1-score); p2-next=p1; p2-next=p1; p2=p1; p2=p1; p2-next=NULL; p2-next=NULL; p1=head; p1=head; while(p1-next!=NULL) while(p1-next!=NULL) printf(%ld,%dn,p1-num,p1-
49、score); printf(%ld,%dn,p1-num,p1-score); p1=p1-next; p1=p1-next; 对链表的删除操作 参见P279struct student *del(struct student *head,long num) struct student *p1,*p2; if (head=NULL) printf(n空链表!n); goto end; p1=head; while (num!=p1-num&p1-next!=NULL) p2=p1;p1=p1-next; /*非所找结点且非未结点后移*/ if(num=p1-num) /*找到了*/ if
50、(p1=head) head=p1-next; /*为首结点*/ else p2-next=p1-next; /*非首结点*/ printf(delete:%ldn,num); n=n-1; else printf(“%ld not been found!n”,num); /*未找到*/end: return(head);对链表的插入操作 参见P282struct student *insert(struct student *head,struct student *stud) struct student *p0,*p1,*p2; p1=head; /*p1指向第一个结点*/ p0=stud; /*p0指向要插入的结点*/ if(head=NULL) /*如为空链表*/ head=p0;p0-next=NULL; else while (p0-nump1-num)&(p1-next!=NULL) p2=p1; p1=p1-next; /*寻找位置*/ if(p0-numnum) if(head=p1) head=p0; /*如最小插在第一个结点前*/ else p2-next=p0; /*否则插在p1所指结点前*/ p0-next=p1; else p1-next=p0;p0-next=NULL; /*未找到插在最后*/ n=n+1; return(head);