1、9.1 9.1 结构体类型数据结构体类型数据9.2 9.2 共用体类型数据共用体类型数据9.3 9.3 枚举类型数据枚举类型数据9.4 9.4 用用TYPEDEFTYPEDEF定义类型定义类型9.5 9.5 动态存储分配动态存储分配链表链表 “结构结构”是一种构造类型,它是由若干是一种构造类型,它是由若干“成员成员”组组成的。成的。每一个成员可以是一个基本数据类型或者又是一每一个成员可以是一个基本数据类型或者又是一个构造类型。个构造类型。结构既是一种结构既是一种“构造构造”而成的数据类型,而成的数据类型,在说明和使用之前必须先定义它,如同在说明和调用函在说明和使用之前必须先定义它,如同在说明和
2、调用函数之前要先定义函数一样。数之前要先定义函数一样。结构体(结构体(structure)相当于其它高级语言中的相当于其它高级语言中的“记记录录”。10010LiFunM87.518 Beijingnum name sex score age addr定义一个结构的一般形式为:定义一个结构的一般形式为:struct 结构名结构名 成员表列成员表列;struct stuint num;char name20;char sex;float score;成员名的命名应符合标识符的成员名的命名应符合标识符的书写规定。例如:书写规定。例如:对每个成员也必须作类型说明,其形式为:对每个成员也必须作类型说明
3、,其形式为:类型说明符类型说明符 成员名成员名;1)先定义结构体类型再定义结构体变量)先定义结构体类型再定义结构体变量例:例:struct student int num;char name20;char sex;int age;float score;char addr30;struct student x1,x2;则则 x1,x2为为student 结构型变量,结构型变量,x1,x2可存放可存放student类类型数据。型数据。类型标识符类型标识符结构体变量定义结构体变量定义:例:例:struct student int num;char name20;char sex;int age;c
4、har addr30;x1,x2;成员表列成员表列 变量名表列;变量名表列;2)2)在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量:定义形式定义形式 struct 结构体名结构体名定义形式定义形式 struct 成员表列成员表列 变量名表列;变量名表列;不出现结构体类型名不出现结构体类型名3.3.直接定义结构类型变量直接定义结构类型变量如如:struct int num char name20;char sex;int age;char addr30;x1,x2;1.类型名与变量名是不同的概念类型名与变量名是不同的概念2.每一个成员的作用如同该类型的变量每一个成员的作用如同该类型
5、的变量3.成员名与程序中的变量名可相同但意义不同成员名与程序中的变量名可相同但意义不同几点几点说明说明:struct date int month;int day;int year;补充:结构补充:结构体体的嵌套定义的嵌套定义 x1或或x2numname sex agebirthdaymonth dayyearaddrstruct student int num;char name20;char sex;int age;struct date birthday;char addr30;x1,x2;结构的初始化就是指结构变量的初始化;先结构的初始化就是指结构变量的初始化;先定义结构,在定义结构变
6、量时对每个成员赋初值定义结构,在定义结构变量时对每个成员赋初值 struct student x1=8906,Li Ming,M,85.5;如:如:struct student unsigned No;char name20;char sex;float score;;若若 x1 的起始的起始地址为地址为2000,则,则 x1 在内存中占有在内存中占有的存储单元为:的存储单元为:共用共用27个字节个字节的连续单元的连续单元8906No2000200220212022name20LiMingM85.50 2023sexscore2026结构定义与变量定义及初始化合二为一:结构定义与变量定义及初始
7、化合二为一:struct exp int a;float b;char yn8;x=1234,56.7,test;但不能这样写:但不能这样写:struct exp int a=1234;float b=56.7;char yn8=test;x;如如:x1为为struct student型变量,则型变量,则 x1.No:表示表示x1的学号的学号 x1.name:表示表示x1的名字的名字 访问结构变量实质上是引用其成员访问结构变量实质上是引用其成员;有两种有两种运算符可访问结构成员运算符可访问结构成员1)圆点运算符圆点运算符注意:注意:1.1.只能用变量的成员,不可用结构变量名直接运算。只能用变量
8、的成员,不可用结构变量名直接运算。2.2.每一个成员的作用与其同类型的简单变量的引用每一个成员的作用与其同类型的简单变量的引用相同。相同。2 2)箭头运算符:箭头运算符:例:例:struct student char name 10;char sex;int age;float score;char addr20;x1;struct student p;则则p为结构指针变量,它可用来存为结构指针变量,它可用来存放放student型变量的地址型变量的地址令令 p=&x1;则则 p为为x1的首地址的首地址.namesexaddrpx1agescore访问结构成员:访问结构成员:pname 表示表示
9、x1的姓名;等价于的姓名;等价于(*p).name或或x1.namepage 表示表示x1的年的年龄龄;等价于;等价于(*p).age或或x1.age若有若有 struct student h;则:则:scanf(%s,&h);printf(%s,h);错误错误原因:原因:结构体变量中包含有多个不同类型的数据项。结构体变量中包含有多个不同类型的数据项。正确方法:正确方法:对结构体变量各成员的值进行输入对结构体变量各成员的值进行输入/输出。输出。如如上例上例:scanf(%d%s,&h.num,&h.name);printf(%d%s,h.num,h.name);只能对结构变量的成员进行输入只能
10、对结构变量的成员进行输入/输出输出 结构数组的定义方法和结构变量相似(也有三种方结构数组的定义方法和结构变量相似(也有三种方法),只需说明它为数组类型即可。例如:法),只需说明它为数组类型即可。例如:struct stuint num;char*name;char sex;float score;boy5;struct stuint num;char*name;char sex;float score;struct stu boy5;struct int num;char*name;char sex;float score;boy5;对外部结构数组或静态结构数组可以作初始化赋值,例对外部结构数
11、组或静态结构数组可以作初始化赋值,例如:如:struct stuint num;char*name;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58 ;注:当对全部元素作初始注:当对全部元素作初始化赋值时,也可不给出数化赋值时,也可不给出数组长度。组长度。main()int i,c=0;float ave,s=0;for(i=0;i5;i+)s+=boyi.score;if(boyi.score60)
12、c+=1;printf(s=%fn,s);ave=s/5;printf(average=%fncount=%dn,ave,c);struct tree int x;char*s;t;void fun(struct tree a)printf(%d,%sn,a.x,a.s);#include main()t.x=6;t.s=minicomputer;fun(t);结果:结果:6,minicomputer一个指针变量当用来指向一个结构变量时,称之为结一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量构指针变量。结构指针变量中的值是所指向的结构变量的首地址
13、。的首地址。结构指针变量说明的一般形式为:结构指针变量说明的一般形式为:struct 结构名结构名*结构指针变量名结构指针变量名例如,在前面的例题中定义了例如,在前面的例题中定义了stu这个结构,如要说明这个结构,如要说明一个指向一个指向stu的指针变量的指针变量pstu,可写为:可写为:struct stu*pstu;当然也可在定义当然也可在定义stu结构时同时说明结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。也必须要先赋值后才能使用。赋值是把结构变量的首地址赋予该指针变量,不赋值是把结构变量的首地址赋予
14、该指针变量,不能把结构名赋予该指针变量。如果能把结构名赋予该指针变量。如果boy是被说明为是被说明为stu类型的结构变量,则:类型的结构变量,则:pstu=&boy是正确的,是正确的,而:而:pstu=&stu是错误的。是错误的。其访问的一般形式为:其访问的一般形式为:(*结构指针变量结构指针变量).成员名成员名或为:或为:结构指针变量结构指针变量-成员名成员名例如:例如:(*pstu).num 或者:或者:pstu-num应该注意应该注意(*pstu)两侧的括号不可少,因为成员符两侧的括号不可少,因为成员符“.”的优先级高于的优先级高于“*”。如去掉括号写作。如去掉括号写作*pstu.num
15、则等则等效于效于*(pstu.num),这样,意义就完全不对了。这样,意义就完全不对了。指针变量可以指向一个结构数组,这时结构指针变指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。该结构数组元素的首地址。设设ps为指向结构数组的指针变量,则为指向结构数组的指针变量,则ps也指向该也指向该结构数组的结构数组的0号元素,号元素,ps+1指向指向1号元素,号元素,ps+i则指向则指向i号元素。这与普
16、通数组的情况是一致的。号元素。这与普通数组的情况是一致的。例例 用指针用指针变量输出结构数组。变量输出结构数组。main()struct stu*ps;printf(NotNametttSextScoretn);for(ps=boy;psnum,ps-name,ps-sex,ps-score);struct stu int num;char*name;char sex;float score;boy5=101,Zhou ping,M,45,102,Zhang ping,M,62.5,103,Liou fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M
17、,58,;应该注意的是,一个结构指针变量虽然可以用来访问应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指结构变量或结构数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。予它。因此,下面的赋值是错误的。ps=&boy1.sex;而只能是:而只能是:ps=boy;(赋予数组首地址赋予数组首地址)或者是:或者是:ps=&boy0;(赋予赋予0号元素首地址号元素首地址)什么是共用体?它是几个不同的变量共同占用同什么是共用体?它是几个不同的变量共同占用同一
18、段内存空间的结构。这几个不同的变量可以具有一段内存空间的结构。这几个不同的变量可以具有不同的类型,但具有相同的指针(地址)。不同的类型,但具有相同的指针(地址)。定义共用体定义共用体 union 共用体名共用体名 成员表列成员表列;例如:例如:union data int x;char y;float z;共用体变量的说明和结构变量的说明方式相同,共用体变量的说明和结构变量的说明方式相同,也也有三种形式。有三种形式。union data int x;char y;float z a,b;union /*无类型名无类型名*/int x;char y;float z a,b;union data
19、int x;char y;float z ;union data a,b;(1)虽然共用体变量可以存储几种不同类型的成员,)虽然共用体变量可以存储几种不同类型的成员,但在在同一时刻,只能存储其中的一个,即只能有一但在在同一时刻,只能存储其中的一个,即只能有一个成员起作用。个成员起作用。(2)共用体变量中起作用的是最后一次存放的成员,)共用体变量中起作用的是最后一次存放的成员,以前存放的成员皆失效。例如顺序执行以前存放的成员皆失效。例如顺序执行 a.x=12;a.y=A;a.z=23.5;语句后,只有成员语句后,只有成员a.z 有效。有效。(3)共用体变量的地址和它的各成员的地址都相同。)共用体
20、变量的地址和它的各成员的地址都相同。即即&a、&a.、&a.、&a.的地址都相同。的地址都相同。(4)不能单独引用共用体变量名,也不能在定义共)不能单独引用共用体变量名,也不能在定义共用体变量时对其初始化。用体变量时对其初始化。例如:例如:union data int x;char y;float z a=12,E,12.5;a=12;m=a;都是错误的。都是错误的。(5)在结构体类型的定义中可以有共用体类型的成)在结构体类型的定义中可以有共用体类型的成员;也可定义共用体类型的数组。反之亦然。员;也可定义共用体类型的数组。反之亦然。例例 建立学生与教师的简表,内容有:建立学生与教师的简表,内容
21、有:name、job、class、position。表中前表中前2项一样,第项一样,第3项采用共用体数项采用共用体数据:即据:即job为为s(学生)时,第学生)时,第3项采用项采用class(班级);班级);job为为t(教师)时,第教师)时,第3项采用项采用position(职务)。职务)。Struct char name20;char job;union int class;char position10;cat;person10;main()()int n;for(n=0;n10;n+)scanf(“%s%c”,personn.name,&personn.job););if(person
22、n.job=s)scanf(“%d”,&personn.cat.class););else scanf(“%s”,personn.cat.position);printf(“n”););for(n=0;n sun)if(workday=sun)不能把一个整数直接赋予枚举变量。例如:不能把一个整数直接赋予枚举变量。例如:workday=2;是错误的,是错误的,原因在于它们类型不一致,可通过强制类型转换把原因在于它们类型不一致,可通过强制类型转换把一个整数直接赋予枚举变量,例如:一个整数直接赋予枚举变量,例如:workday=(enum weekday)2;是可行的。是可行的。严格的说,枚举变量和
23、常量是不能做算术运算的,例严格的说,枚举变量和常量是不能做算术运算的,例如如workday+、weekend=workday+wed是不允许的,但有是不允许的,但有些系统采用警告的方式,但不禁止,也就是说系统将按枚些系统采用警告的方式,但不禁止,也就是说系统将按枚举变量和常量的值做算术运算。举变量和常量的值做算术运算。用用户喜欢的名字来替换这些类型名,再用用户自定用用户喜欢的名字来替换这些类型名,再用用户自定义这些类型名去定义相关的变量。例如:义这些类型名去定义相关的变量。例如:typedef int INTEGER;/*用用INTEGER 代替代替int 类型类型*/typedef floa
24、t REAL;/*用用REAL代替代替float 类型类型*/INTEGER a,b;/*定义整型变量定义整型变量a,b*/REAL x,y /*定义实型变量定义实型变量x,y*/typedef int INTEGER;INTEGER m,n;typedef float REAL;REAL x,y;typedef char CHARACTER;CHARACTER c,d;typedef int*INT_POINTER;INT_POINTER p1,p2;(;(整型指针)整型指针)typedef char*CH_P;CH_P pa,pb20;(;(字符型指针)字符型指针)typedef int
25、NUM8;NUM a,b;(;(含含8个元素的整型数组)个元素的整型数组)typedef char(*CP)10;CP pn;(;(指向一维数组的指针)指向一维数组的指针)typedef float(*PFUN)();)();PFUN fp;(;(指向函数的指针)指向函数的指针)typedef struct int day;int month;int year;DATE;DATE birthday,rest;(;(结构体)结构体)typedef union char a;int b;float c;DATA;DATA x,y,z;(;(共用体)共用体)typedef enumred,green
26、,blueCOLOR;COLOR tv;(;(枚举类型)枚举类型)1、设有如下定义:、设有如下定义:struct sk int a;float b;data,*p;若有若有p=&data;,则对则对data中的中的a域的正确引用是域的正确引用是_.A)(*p).data.a B)(*p).a C)pdata.a D)p.data.a2、以下对枚举类型名的定义中正确的是以下对枚举类型名的定义中正确的是_.A)enum a=one,two,three;B)enum aone=9,two=-1,three;C)enum a=“one”,”two”,”three”;D)enum a“one”,”two
27、”,”three”;3、变量、变量a所占的内存字节数是所占的内存字节数是_.A)4 B)5 C)6 D)8 union U char st4;int i;long l;struct A int c;union U u;a;4、下列程序的输出结果是、下列程序的输出结果是_.#includemain()union int k;char i2;*s,a;s=&a;(*s).i0=0 x39;(*s).i1=0 x38;printf(“%xn”,(*s).k);A)3839 B)3938 C)380039 D)3900385、以下程序的输出结果是、以下程序的输出结果是_.main()union cha
28、r i2;int k;r;r.i02;r.i1=0;printf(“%dn”,r.k);A)2 B)1 C)0 D)不确定不确定6、以下程序、以下程序#include struct stu int num;char name10;int age;void fun(struct stu*p)printf(“%sn”,(*p).name);main()struct stu student3=9801,”Zhang”,20,9802,”Wang”,19,9803,”Zhao”,18;fun(student+2);输出结果是输出结果是_.A)Zhang B)Zhao C)Wang D)187、下面程序
29、的输出为、下面程序的输出为_.struct st int x;int*y;*p;int dt4=10,20,30,40;struct st aa4=50,&dt0,60,&dt1,70,&dt2,80,&dt3;main()p=aa;printf(“%dn”,+p-x);printf(“%dn”,(+p)-x);printf(“%dn”,+(*p-y);A)10 B)50 C)51 D)60 20 60 60 70 20 21 21 31 8、以下各项企图说明一种新的类型名,其中正、以下各项企图说明一种新的类型名,其中正确的是确的是_.A)typedef v1 int;B)typedef v2
30、=int;C)typedef int v3;D)type v4;int;9、设有以下语句设有以下语句 typedef struct S int f;char h;T;则下面叙述正确的是则下面叙述正确的是_.A)可用可用S定义结构变量定义结构变量 B)可用可用T定义结构变量定义结构变量C)S是是struct类型的变量类型的变量 D)T是是struct类型的变类型的变量量链表是一种常见的重要的数据结构。它是动态地进链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。行存储分配的一种结构。首指针首指针数数 据据 指指 针针 数数 据据 指指 针针 数数 据据 指指 针针 数数 据据 N
31、ULL 链表是一种由首指针和若干结点组成的数据链,形式如下:链表是一种由首指针和若干结点组成的数据链,形式如下:A B C D 链表的特点是:链表的特点是:其中首指针是不能少的,它含有结点其中首指针是不能少的,它含有结点A的起始地址,只有通过的起始地址,只有通过它才能找到后面各结点。且首指针千万不能丢失,否则链表将丢它才能找到后面各结点。且首指针千万不能丢失,否则链表将丢失。失。各结点是链接在一起的,结点各结点是链接在一起的,结点A的指针域包含结点的指针域包含结点B的起始地址的起始地址,结点,结点B的指针域包含结点的指针域包含结点C的起始地址,依此类推。的起始地址,依此类推。最后一个结点最后一
32、个结点D又称又称“表尾表尾”,表尾的指针域包含数据,表尾的指针域包含数据NULL,表示是空地址,链表到此结束。表示是空地址,链表到此结束。由于结点中指针域的存在,各结点在内存中占用的存储空间不由于结点中指针域的存在,各结点在内存中占用的存储空间不要求必须是连续排列的。这是一个很重要的特点。要求必须是连续排列的。这是一个很重要的特点。链表结点含有二个域:数据域和指针域。数链表结点含有二个域:数据域和指针域。数据域可以包含用户的各种类型的数据;指针域是一据域可以包含用户的各种类型的数据;指针域是一个指向下一个结点的指针变量。由此看出结点采用个指向下一个结点的指针变量。由此看出结点采用结构体类型的数
33、据结构最合适。例如:结构体类型的数据结构最合适。例如:struct student int num;float score;struct student*next;;其中:变量其中:变量num和和score是数据域的用户数据。是数据域的用户数据。变量变量next是指针域的指针变量,用于指向下一个结是指针域的指针变量,用于指向下一个结点。点。#include /*含含NULL的定义的定义*/main()()struct student a,b,c,*head,*p;a.num=1001;a.score=89;/*建立结点数据域建立结点数据域*/b.num=1002;b.score=90;c.nu
34、m=1003;c.score=86;head=&a;/*建立首指针变量建立首指针变量*/a.next=&b;/*指向下一个结点指向下一个结点*/b.next=&c;c.next=NULL;/*最后结点指针域为空指针最后结点指针域为空指针*/for(p=head;p!=NULL;p=pnext)printf(“%ld%5.1fn”,pnum,pscore););注:我们此处建立的链表是一个注:我们此处建立的链表是一个“静态链表静态链表”,其特点是:,其特点是:各个结点是在程序中预先以变量的形式开辟出来的,用完后也不各个结点是在程序中预先以变量的形式开辟出来的,用完后也不会主动释放所占存储空间。这
35、对于需要大量链表的程序来说,无会主动释放所占存储空间。这对于需要大量链表的程序来说,无疑是一种极大的存储空间浪费。疑是一种极大的存储空间浪费。struct student long num;float score;struct student*next;例例 建立一个由建立一个由3个学生的数据为结点的链表。个学生的数据为结点的链表。1malloc函数函数 函数原型:函数原型:void *malloc(unsigned int size););功能:在内存的动态存储区,分配一个长度为功能:在内存的动态存储区,分配一个长度为size个字节的个字节的连续存储空间;并返回一个指针,该指针就是已分配的存
36、储空间连续存储空间;并返回一个指针,该指针就是已分配的存储空间的起始地址的起始地址(基类型是基类型是void)。若函数调用失败,例如内存空间不若函数调用失败,例如内存空间不足,则返回空指针足,则返回空指针(NULL)。此函数常用于为链表的结点开辟存此函数常用于为链表的结点开辟存储空间,例如:储空间,例如:struct student long num;float score;struct student*next;main()()struct student *head,*p;p=(struct student*)malloc(sizeof(struct student););head=p;p
37、num=1001;pscore=99;2calloc函数函数 函数原型:函数原型:void *calloc(unsigned n,unsigned size););功能:在内存的动态存储区,分配功能:在内存的动态存储区,分配n个长度为个长度为size个字个字节的连续存储空间;并返回一个指针,该指针就是已分配节的连续存储空间;并返回一个指针,该指针就是已分配的存储空间的起始地址(基类型是的存储空间的起始地址(基类型是void)。)。若函数调用失若函数调用失败,例如内存空间不足,则返回空指针(败,例如内存空间不足,则返回空指针(NULL)。)。此函此函数常用于为一维数组分配连续存储空间,例如:数常
38、用于为一维数组分配连续存储空间,例如:main()()int*p;p=(int*)calloc(10,sizeof(int););/*指针指针p 指向一个含有指向一个含有10个元素的整型个元素的整型数组数组*/3free函数函数 函数原型:函数原型:void free(void*p););功能:其作用是释放由指针变量功能:其作用是释放由指针变量p指向的内存空间。指向的内存空间。p是最近一次调用是最近一次调用 malloc或或 calloc函数时返回的指针。函数时返回的指针。free无返回值。无返回值。例如:例如:free(p););/*释放指针变量释放指针变量p指向的内存空间指向的内存空间*/
39、注:函数注:函数sizeof()()的参数可以是变量名或某种类型名,的参数可以是变量名或某种类型名,其返回值是参数的长度(以字节为单位)。其返回值是参数的长度(以字节为单位)。4realloc函数函数 函数原型:函数原型:void *realloc(void*ptr,unsigned int size););功能:其作用是使已分配的空间改变大小,即重新功能:其作用是使已分配的空间改变大小,即重新分配。将分配。将ptr指向的存储区(是原先用指向的存储区(是原先用malloc函数分配的)函数分配的)的大小改为的大小改为size个字节。可以使原先分配区扩大也可以个字节。可以使原先分配区扩大也可以缩小
40、。它的函数返回值是一个指针,即新的存储区的首缩小。它的函数返回值是一个指针,即新的存储区的首地址。应指出,新的首地址不一定与原来地址相同,因地址。应指出,新的首地址不一定与原来地址相同,因为为了增加空间,存储区会进行必要的移动。为为了增加空间,存储区会进行必要的移动。1 1、建一个动态链表、建一个动态链表#include#define NULL 0#define LEN sizeof(struct student)struct student long num;float score;struct student*next;int n;首指针首指针数数 据据 指指 针针 数数 据据 指指 针针
41、 数数 据据 指指 针针 数数 据据 NULL struct student*creat(void)struct student*head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;p2=p1;p1=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);p2-next=NULL;r
42、eturn(head);numscorenextp1p2head struct student*creat(void)struct student*head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;p2=p1;p1=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);p2-ne
43、xt=NULL;return(head);numscorenextnextnumscorep1p2head struct student*creat(void)struct student*head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;p2=p1;p1=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1
44、-num,&p1-score);p2-next=NULL;return(head);numscorenextnextnumscorep1p2head struct student*creat(void)struct student*head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;p2=p1;p1=(struct student*)malloc(LE
45、N);scanf(“%ld,%f”,&p1-num,&p1-score);p2-next=NULL;return(head);numscorenextnextnextnumscorenumscorep2p1head struct student*creat(void)struct student*head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;p2
46、=p1;p1=(struct student*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);p2-next=NULL;return(head);numscorenextnextnextnumscorenumscorep1headp2 2、输出链表 void print(struct student*head)struct student*p;p=head;if(head!=NULL)do printf(“%ld%5.1f”,p-num,p-score);p=p-next;while(p!=NULL);numscorenextnextnextnum
47、scorenumscoreheadp 2、输出链表 void print(struct student*head)struct student*p;p=head;if(head!=NULL)do printf(“%ld%5.1f”,p-num,p-score);p=p-next;while(p!=NULL);numscorenextnextnextnumscorenumscoreheadp 3、对链表的删除struct student*del(struct student*head,long num)struct student*p1,*p2;if(head=NULL)printf(“list
48、 null!n”);goto end;p1=head;while(num!=p1-num&p1-next!=NULL)p2=p1;p1=p1-next;if(num=p1-num)if(p1=head)head=p1-next;else p2-next=p1-next;printf(“delete:%dn”,num);n=n-1;else printf(“%ld not been found!n”,num);end;return(head);numscorenextnextnextnumscorenumscoreheadp2p14、对链表的插入struct student*insert(str
49、uct student*head,struct student*stud)struct student*p0,*p1,*p2;p1=head;p0=stud;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;p0-next=p1;else p1-next=p0;p0-next=NULL;return(head);1、有以下结构类型说明和变量定义,且如下图、有以下结构类型
50、说明和变量定义,且如下图所示,其中指针所示,其中指针p指向变量指向变量a,指针指针q指向变量指向变量b,不能把节点不能把节点b连接到节点连接到节点a之后的语句是之后的语句是_.struct node char data;struct node*next;a,b,*p=&a,*q=&b;A)a.next=q;B)p.next=&b;C)p-next=&b;D)(*p).next=q;abdata nextdata nextpq2、若有以下定义:、若有以下定义:struct link int data;struct link*next;a,b,c,*p,*q;且变量且变量a和和b之间已有如上图所示