《C语言第8章结构体和其他构造类型》由会员分享,可在线阅读,更多相关《C语言第8章结构体和其他构造类型(121页珍藏版)》请在金锄头文库上搜索。
1、第第8章章 结构体和其他构造类型结构体和其他构造类型8.1 结构体类型变量的定义和使用结构体类型变量的定义和使用8.2 结构体和函数调用结构体和函数调用8.3 提高部分提高部分8.1 8.1 结构体类型变量的定义和使用结构体类型变量的定义和使用P241P2418.1.1 8.1.1 结构体类型的概念和声明结构体类型的概念和声明8.1.2 8.1.2 结构体类型变量的定义和使用结构体类型变量的定义和使用8.1.1 8.1.1 结构体类型的概念和声明结构体类型的概念和声明 迄今为止,已介绍了基本类型迄今为止,已介绍了基本类型(或称简单类型或称简单类型)的变量的变量(如整型、实型、字符型变量等如整型
2、、实型、字符型变量等),也介绍了一种构,也介绍了一种构造类型数据造类型数据数组,数组中的各元素是属于同一数组,数组中的各元素是属于同一个类型的。个类型的。但是只有这些数据类型是不够的。有时需要将不同类但是只有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。些组合在一个整体中的数据是互相联系的。C语言允语言允许用户自己指定这样一种数据结构,它称为结构体许用户自己指定这样一种数据结构,它称为结构体(structure)。它相当于其他高级语言中的。它相当于其他高级语言中的“记录记录”。
3、8.1.1 8.1.1 结构体类型的概念和声明结构体类型的概念和声明 结构体类型的概念结构体类型的概念 :把不同类型的数据组合在一个类型之把不同类型的数据组合在一个类型之中,作为一个整体进行处理中,作为一个整体进行处理 结构体类型结构体类型 。v要表示日期要表示日期struct date int year, month, day; ; v要表示学生情况要表示学生情况 struct student char name20, number9; float s1,s2,s3; ;结构体类型结构体类型 2.结构体类型的声明结构体类型的声明 结构体类型声明的一般形式为:结构体类型声明的一般形式为:str
4、uct 结构体名结构体名类型名类型名1 成员名表成员名表1;类型名类型名2 成员名表成员名表2; 类型名类型名n 成员名表成员名表n; ; 关关键键字字 也称也称“域域” ; 8.1.2 8.1.2 结构体类型变量的定义和使用结构体类型变量的定义和使用P242 P242 【例【例8.1】 假设学生基本情况包括学号假设学生基本情况包括学号和两门课成绩,编写程序计算某学生和两门课成绩,编写程序计算某学生两门课的平均成绩,并输出该学生的两门课的平均成绩,并输出该学生的有关信息有关信息 。编程点拨编程点拨 v声明结构体类型。声明结构体类型。 struct ex1 long int num; float
5、 s1; float s2; ; 等价于等价于float float s1,s2;s1,s2;v在主函数中定义在主函数中定义“struct ex1”类类型变量型变量wang和和“float”类型变量类型变量ave 。main( ) float ave; struct ex1 wang ;就像就像floatfloat、int int 型一样使用。型一样使用。v计算平均成绩并通过变计算平均成绩并通过变量量wangwang输出有关信息。输出有关信息。 main( ) float ave; struct ex1 wang ;wang.num =1000101;wang.s1 =89.5;wang.s2
6、=90;ave= (wang.s1+ wang.s2)/2;printf (%10ld%8.1f%8.1f%8.1fn, wang.num,wang.s1,wang.s2, ave);?ave占四个字节,占四个字节,wang占多少字节占多少字节 main( ) float ave; struct ex1 wang ;wang.num =1000101;wang.s1 =89.5;wang.s2=90;ave= (wang.s1+ wang.s2)/2;printf (%10ld%8.1f%8.1f%8.1fn, wang.num,wang.s1,wang.s2, ave);wangnums1s
7、24字节字节4字节字节4字节字节1000101 89.5 90.0 1212字节字节main( ) float ave; struct ex1 wang ;wang.num =1000101;wang.s1 =89.5;wang.s2=90;ave= (wang.s1+ wang.s2)/2;printf (%10ld%8.1f%8.1f%8.1fn, wang.num,wang.s1,wang.s2, ave);wangnums1s21000101 89.5 90.0 等价于等价于struct ex1 wang = 1000101, 89.5, 90.0; main( ) float ave
8、; struct ex1 wang ;wang.num =1000101;wang.s1 =89.5;wang.s2=90;ave= (wang.s1+ wang.s2)/2;printf (%10ld%8.1f%8.1f%8.1fn, wang.num,wang.s1,wang.s2, ave);scanf(“ , &wang.num, &wang.s1, &wang.s2);%ld%f%f【例【例8.2】假设学生基本情况包括】假设学生基本情况包括学号和多门课成绩,计算某学生学号和多门课成绩,计算某学生的平均成绩的平均成绩 。#define N 3struct ex2 long int nu
9、m; float sN; ; 要处理的成绩较多时要处理的成绩较多时 main( ) struct ex2 wang, *p ; float ave, sum=0,x; int i; p=&wang; scanf (%ld, &(*p).num); for ( i = 0; i num); for ( i = 0; i si; printf(%8.1f, p-si); printf( n ); ave= sum/N; printf(平均成绩:平均成绩:%.1f, ave); 等价于等价于(*p).num等价于等价于(*p).siwangnums0s1s2p(*p)结构体变量名结构体变量名 . 成
10、员名成员名(*指针变量名指针变量名) . 成员成员名名指针变量名指针变量名 - 成员名成员名1000101 89.5 90.0 79.0 “.”、“-”分别是结构体成员运算符分别是结构体成员运算符和指向结构体成员运算符。和指向结构体成员运算符。在在c语言的所有运算符中,这些运算符的语言的所有运算符中,这些运算符的优先级最高。优先级最高。(*p).num写成写成*p.num,由于,由于“.”的优先的优先级高于级高于“*”,因此相当于,因此相当于*(p.num)形形式。式。【例【例8.3】设有】设有5名学生,而且每位学名学生,而且每位学生基本情况都包括学号和多门课成生基本情况都包括学号和多门课成绩
11、,计算各学生绩,计算各学生3门课平均成绩门课平均成绩 。#define N 3struct ex2 long int num; float sN; ; main( ) struct ex2 stu5 ; float ave, sum, k; int i, j; for (i = 0; i 5; i+) scanf (%ld, &stui.num); for ( j = 0; j N; j+ ) scanf (%f, &k); stui.sj=k; for (i = 0; i 5; i+) printf( %10ld, stui.num); sum=0; for ( j = 0; j N; j+
12、 ) printf( %8.1f, stui.sj); sum = sum + stui.sj; ave= sum/N; printf(%8.1f n, ave); 注此行的位置注此行的位置 100010189.590.079.0100010268.080.055.0100010356.559.077.0100010481.088.074.0100010590.595.089.0stu0stu1stu2stu3stu4num s0 s1 s2 各学生平均分:各学生平均分:86.2、67.7、64.2、81.0、91.5 【例【例8.4】假设学生基本情况包括学】假设学生基本情况包括学号和五门课成
13、绩,找出某学生五号和五门课成绩,找出某学生五门课成绩中的最高成绩。门课成绩中的最高成绩。struct ex3 char n10; float s5; ; 将学号定义为字符串将学号定义为字符串 main( ) struct ex3 wang=1000101, 89.5, 90.0, 79.0 , 99.0, 69.0; float max; int i; max=0; for( i=0; i5; i+ ) if ( maxwang.si ) max=wang.si; printf(“%s号学生,号学生,%5.1f, wang.n , max); scanf(“%s”, wang.n); 功能?功
14、能?gets(wang.n);功能?功能?strcpy(wang.n, 1000101);功能?功能?puts(wang.n);功能?功能?【例【例8.5】假设学生基本情况包括学号】假设学生基本情况包括学号和英语、和英语、C程序设计、数学三门课成程序设计、数学三门课成绩,输出五个学生中,数学成绩最高绩,输出五个学生中,数学成绩最高的学生所有信息。的学生所有信息。 struct ex4 char n10; float s3; ; main( ) struct ex4 stu5=1000101,89.5,90.0,79.0, 1000102,68.0,80.0,55.0, 1000103,56.5
15、,59.0,77.0, 1000104,81.0,88.0,74.0, 1000105,90.5,95.0,89.0; int i, k=0; for ( i = 1; i 5; i+ ) if( stuk.s2 stui.s2 ) k=i; printf(“%s号学生号学生n, stuk.n ); for ( i= 0; i 3; i+ ) printf(%5.1f , stuk.si ); 1000105 号学生号学生90.5 95.0 89.0 8.2 8.2 结构体和函数调用结构体和函数调用 P249 P249v 结构体类型变量的成员作实参。结构体类型变量的成员作实参。【例【例8.6】
16、结构体类型变量的成员】结构体类型变量的成员 作实参示例作实参示例 。struct ex2 long int num; float s3; ; main( ) struct ex2 wang=1000101, 89.5, 90.0, 79.0 ;myfun1( wang.num, wang.s );long型型实型数组名实型数组名void myfun1( long int num, float *p ) int i;wangnumspnum*p *(p+1) *(p+2)1000101 1000101 89.5 90.0 79.0 printf(学号:学号:%ld,成绩:成绩:, num );f
17、or ( i=0 ; i 3; i+ ) printf(%5.1f, *(p+i) );printf(n ); 1000101 89.5 90.0 79.0wangnumspnum*p *(p+1) *(p+2)main( ) struct ex2 wang=1000101, 89.5, 90.0, 79.0 ;myfun1( wang.num, wang.s );1000101void myfun1( long int num, float *p ) int i;v结构体类型变量作实参结构体类型变量作实参 。【例【例8.7】 结构体变量作实参的示例。结构体变量作实参的示例。 struct e
18、x2 long int num; float s3; ; void myfun2( struct ex2 xiaowang ) xiaowang.num=1000105;xiaowang.s2=95.5;main( ) struct ex2 wang=1000101, 89.5, 90.0, 79.0 ;int i;myfun2(wang);printf(学号:学号:%ld,成绩:成绩:, wang.num );for( i=0; inum = 1000105;p-s2 = 95.5;main( ) struct ex2 wang=1000101, 89.5, 90.0, 79.0 ;int
19、i;myfun3(&wang);printf(学号:学号:%ld,成绩:成绩:, wang.num );for( i=0; i3; i+)printf(%5.1f , wang.si );printf(n);myfun3(&wang);void myfun3( struct ex2 *p )p100010595.5v结构体类型数组名作实参。结构体类型数组名作实参。 【例【例8.9】结构体类型数组名作实参的示例。】结构体类型数组名作实参的示例。 struct ex2 long int num; float s3; ; void myfun4 ( struct ex2 *p ) int i; fl
20、oat k; struct ex2 *q; for ( q=p; q num); for( i=0; isi=k; main( ) int i, j; struct ex2 stu5 ; myfun4 ( stu ); for ( i=0; i5; i+) printf(%ld 号学生成绩是:号学生成绩是:, stui.num); for ( j= 0; j birthday.d = 5; p(*p).birthday.d = 5; ymds0s1s2LiLan1982122588.075.085.5name birthday s 要输入值要输入值pscanf ( %d, &p - birth
21、day.d ); scanf ( %d, &(*p).birthday.d ); 声明可改为:声明可改为: struct student char name10; struct int y , m, d; birthday; float s3; ; 【例【例8.11】内嵌结构体类型为】内嵌结构体类型为 本结构体类型的示例。本结构体类型的示例。#include struct lst intnum; struct lst * next ; ; 能指向能指向 struct lst 类型变量类型变量 abcnum nextnum nextnum nexta.num = 1;a.next = &b;b.
22、num = 2;b.next = &c;c.num = 3;c.next = NULL;p = &a;printf (%4d, p - num );main( ) struct lst a, b, c, *p;1230p1abcnum nextnum nextnum nexta.num = 1;a.next = &b;b.num = 2;b.next = &c;c.num = 3;c.next = NULL;p = &a;printf (%4d, p - num );main( ) struct lst a, b, c, *p;p = p - next;printf (%4d, p - num
23、 );1230p12abcnum nextnum nextnum nexta.num = 1;a.next = &b;b.num = 2;b.next = &c;c.num = 3;c.next = NULL;p = &a;printf (%4d, p - num );p = p - next;printf (%4d, p - num );main( ) struct lst a, b, c, *p;p = p - next;printf (%4d, p - num );1230p123p = p - next;能改为能改为p+; ?8.3.2 8.3.2 链表链表 P256 P256链表的概
24、念链表的概念 head空链表结构空链表结构头结点头结点0非空链表结构非空链表结构 head头结点头结点 结点结点1结点结点2尾结点尾结点0链表的概念链表的概念 8.3.2 8.3.2 链表链表 P256 P256 链表特点:链表特点: 所有结点为相同结构体类型;所有结点为相同结构体类型; 至至少少一一个个成成员员为为指指针针,该该指指针针基基类类型型与链表结点的类型相同。与链表结点的类型相同。 需解决问题:需解决问题:(1)建立链表;)建立链表;(2)输出链表中各结点的值;)输出链表中各结点的值;(3)在链表中插入一个结点;)在链表中插入一个结点;(4)删除链表中的一个结点)删除链表中的一个结
25、点 。动态开辟和释放函数动态开辟和释放函数 malloc、calloc、realloc 动态开辟函数:动态开辟函数:释放函数:释放函数:free#include 【例【例8.12】动态开辟和释放存储单元的示例】动态开辟和释放存储单元的示例 。#include #include main( ) int *p;p = (int *) malloc (2);if ( p != NULL )printf (%4d, *p );free ( p );p*p6*p = 6;6【例【例8.12】动态开辟和释放存储单元的示例。】动态开辟和释放存储单元的示例。 #include #include main( )
26、 int *p;p = (int *) malloc (2);if ( p != NULL )printf (%4d, *p );free ( p );p = (int *) malloc ( sizeof(int) );if ( p != NULL )printf (%4dn, *p );free ( p );p38*p = 6;6*p = 38;38*p(int *)sizeof需创建的单向链表结构需创建的单向链表结构 head头结点头结点 结点结点1结点结点2尾结点尾结点101103105 0动态链表动态链表 【例【例8.13】调用函数完成链表的建立、输出各结点】调用函数完成链表的建立、
27、输出各结点的值、插入或删除一个结点的功能。的值、插入或删除一个结点的功能。具体要求:具体要求:v调用调用mycreat函数,建立链表;函数,建立链表;v调用调用myinsert函数,插入一个结点;函数,插入一个结点;v调用调用mydelete函数,删除值为函数,删除值为m的结点;的结点;v调用调用myprint函数,输出各结点。函数,输出各结点。(1)声明结构体类型:)声明结构体类型: struct lst int num; struct lst *next; ; typedef struct lst LST; 可用可用LST代替代替struct lst (2)编写主函数,并先用空函数占被调函
28、)编写主函数,并先用空函数占被调函数的位置后测试数的位置后测试 。#include #include typedef struct lst int num; struct lst *next; LST; LST *mycreat( ) void myprint ( ) void myinsert ( ) int mydelete ( ) main( ) LST *head; int k, m, choose; head = mycreat( ); printf (新建链表为:新建链表为: ); myprint ( head ); printf (“请选择:请选择:1.插入插入 2.删除删除 ”
29、); scanf(%d, &choose ); switch ( choose ) case 1: printf (插入点插入点: ); scanf(%d, &m );myinsert ( head, m );printf (“插入点后插入点后: ” ); myprint ( head );break;case 2: printf (删除点删除点: ); scanf(%d,&m);k = mydelete ( head , m );if ( k = 1 ) printf(删除点后删除点后: ); myprint ( head ); else printf ( “不存在不存在n );break;
30、(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点numnext开辟头结点,并用头指针开辟头结点,并用头指针head指向它指向它 。head = (LST *) malloc ( sizeof (LST) ); (3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点qnumnext使指针变量使指针变量q也指向该头结点。也指向该头结点。 q = head; (3)编写)编写mycreat( )函数,并用此函数函
31、数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点qpnumnext结点结点1numnext开辟新的结点,并使指针变量开辟新的结点,并使指针变量p指向它指向它 。p = (LST *) malloc ( sizeof (LST) ); (3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点qnumnext结点结点1numnext连接新结点和当前链表的最后结点。连接新结点和当前链表的最后结点。 q - next = p; p(3)编写)编写mycreat( )函数
32、,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点qnumnext结点结点1numnext将数据赋予新结点的将数据赋予新结点的num成员。成员。 p - num = m; 101p(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点qnumnext结点结点1numnext使使q指向新链表的最后一个结点。指向新链表的最后一个结点。 101p(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函
33、数后运行程序。 head头结点头结点qnumnext结点结点1numnext使使q指向新链表的最后一个结点。指向新链表的最后一个结点。 q = p; 101p(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点numnext结点结点1numnext新结点新结点numnext开辟新的结点,并使指针开辟新的结点,并使指针变量变量p指向它。指向它。 101pq(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点nu
34、mnext结点结点1numnext新结点新结点numnext开辟新的结点,并使开辟新的结点,并使指针变量指针变量p指向它。指向它。 101pqp = (LST *) malloc ( sizeof (LST) ); (3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点numnext结点结点1numnext新结点新结点numnext连接新结点和当前连接新结点和当前链表的最后结点链表的最后结点 。q - next = p; 101qp(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替
35、对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点numnext结点结点1numnext新结点新结点numnext将数据赋予新结将数据赋予新结点的点的num成员成员 。p - num = m; 101q103p(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点numnext结点结点1numnext新结点新结点numnext使使q指向新链表的指向新链表的最后一个结点。最后一个结点。 101q103p(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空
36、函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点numnext结点结点1numnext新结点新结点numnext使使q指向新链表的指向新链表的最后一个结点。最后一个结点。 q = p; 101q103p(3)编写)编写mycreat( )函数,并用此函数函数,并用此函数代替对应的空函数后运行程序。代替对应的空函数后运行程序。 head头结点头结点numnext结点结点1numnext新结点新结点numnext链表的最后一个结链表的最后一个结点设为尾结点。点设为尾结点。 q - next = NULL; 101q103p0(3)编写)编写mycreat( )函数,并用此函数函数
37、,并用此函数代替对应的空函数后运行程序代替对应的空函数后运行程序 。返回链表头结点返回链表头结点的地址的地址 。return head ; head头结点头结点numnext结点结点1numnext新结点新结点numnext101q103p0LST *mycreat ( ) int m;LST *head, *p, *q;head = (LST*)malloc ( sizeof (LST) );q = head ;printf (建立链表,请输入数值:建立链表,请输入数值:n );printf (Input m: );scanf (%d, &m );while (m != -1 ) p = (
38、LST*)malloc ( sizeof (LST) );q - next = p;p - num = m;q = p;printf (Input m: ); scanf (%d, &m );q - next = NULL;return head ;(4)编写)编写myprint ( )函数,并用此函函数,并用此函数代替对应的空函数后运行程序。数代替对应的空函数后运行程序。 head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105使指针使指针p指向链表中结点指向链表中结点1 。pp = head - next; head头结点头结点 结点结点1结点结点2尾结点尾结点01011
39、03105输出输出p所指结点的所指结点的num成员值。成员值。 pprintf (%5d, p - num ); 101 head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105移动移动p,即使,即使p指向下一个结点。指向下一个结点。 p head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105移动移动p,即使,即使p指向下一个结点。指向下一个结点。 pp = p - next; head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105输出输出p所指结点的所指结点的num成员值。成员值。 pprintf (%5d, p - num ); 1
40、03 head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105移动移动p,即使,即使p指向下一个结点。指向下一个结点。 p head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105移动移动p,即使,即使p指向下一个结点。指向下一个结点。 pp = p - next; head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105输出输出p所指结点的所指结点的num成员值。成员值。 pprintf (%5d, p - num ); 105移动移动p,即使,即使p指向下一个结点。指向下一个结点。 head头结点头结点 结点结点1结点结点2尾结点尾结点
41、0101103105p head头结点头结点 结点结点1结点结点2尾结点尾结点0101103105移动移动p,即使,即使p指向下一个结点。指向下一个结点。 不存在,所以不存在,所以 p=NULLp = p - next; void myprint (LST *head ) LST *p; p = head - next; if ( p = NULL ) printf ( 链表为空表链表为空表! ); else do printf ( %5d, p - num ); p = p - next; while ( p != NULL ); printf ( n ); (5)编写)编写myinsert
42、 ( )函数,并用此函函数,并用此函数代替对应的空函数后运行程序。数代替对应的空函数后运行程序。 head头结点头结点结点结点1尾结点尾结点结点结点2新结点新结点s 1011031050指针指针s去开辟需去开辟需插入的结点。插入的结点。 s = (LST*)malloc ( sizeof (LST) ); head头结点头结点结点结点1尾结点尾结点结点结点2新结点新结点s 1011031050104需插入的数值赋予新需插入的数值赋予新结点的结点的num成员。成员。 s - num = m; head头结点头结点结点结点1尾结点尾结点结点结点2新结点新结点s 1011031050104qpq指向
43、头结点。指向头结点。 q = head; p指向结点指向结点1p = head - next; head头结点头结点结点结点1尾结点尾结点结点结点2新结点新结点s 1011031050104qp判断是否找到插入点。判断是否找到插入点。 if ( p - num next; p head头结点头结点结点结点1尾结点尾结点结点结点2新结点新结点s 1011031050104qq、p都移到下一个结点。都移到下一个结点。 q = q - next; p = p - next; p head头结点头结点结点结点1尾结点尾结点新结点新结点s 1011031050104q判断是否找到插入点。判断是否找到插入
44、点。 if ( p - num next; head头结点头结点结点结点1尾结点尾结点结点结点2新结点新结点s 1011031050104pq、p都移到下一个结点。都移到下一个结点。 q = q - next; p = p - next; q head头结点头结点结点结点1尾结点尾结点结点结点2新结点新结点s 1011031050104判断是否找到插入点。判断是否找到插入点。 if ( p - num next = p; pq - next = s; qvoid myinsert ( LST *head, int m ) LST *p, *q, *s; s = (LST*)malloc ( s
45、izeof (LST) ); s - num = m; q = head; p = head - next; while( p != NULL) if ( p - num next; p = p - next; else break; s - next = p; q - next = s; (6)编写)编写mydelete ( )函数,并用此函函数,并用此函数代替对应的空函数后运行程序。数代替对应的空函数后运行程序。 head头结点头结点结点结点1尾结点尾结点结点结点2p101103105 0q指向头结点,指向头结点,p指向结点指向结点1。 qq = head; p = head-next;
46、head头结点头结点结点结点1尾结点尾结点结点结点2101103105 0判断是否找到需删结点。判断是否找到需删结点。 qif ( m != p - num ) p head头结点头结点结点结点1尾结点尾结点结点结点2p101103105 0q、p都移到下一个结点。都移到下一个结点。 q head头结点头结点结点结点1尾结点尾结点结点结点2p101103105 0q、p都移到下一个结点都移到下一个结点 。qq = q - next; head头结点头结点结点结点1尾结点尾结点结点结点2p101103105 0q、p都移到下一个结点。都移到下一个结点。 qq = q - next; p = p
47、- next; head头结点头结点结点结点1尾结点尾结点结点结点2101103105 0判断是否找到需删结点。判断是否找到需删结点。 if ( m != p - num ) pq head头结点头结点结点结点1尾结点尾结点结点结点2101103105 0删除结点删除结点 q - next = p - next; pq释放该结点释放该结点 free (p); int mydelete ( LST *head, int m ) LST*p, *q; q = head; p = head -next; while ( p != NULL ) if ( m != p - num) q = q - next; p = p-next; else break; if ( p = NULL ) return 0; q - next = p - next; free (p); return 1; 8.3.5 8.3.5 实例的部分程序实例的部分程序 P268P268【实例【实例12】用结构体类型数据,编写实现】用结构体类型数据,编写实现电子通讯录功能的程序。电子通讯录功能的程序。 演演 示示 shili12.exe