1 / 87

THE C PROGRAMMING LANGUAGE

THE C PROGRAMMING LANGUAGE. 计算中心 - NEU Computer Center 高克宁 -gaokening E_mail:chengxusheji01@necmail.neu.edu.cn. 0. 本章内容. 结构的概念 定义 使用 结构与数组 结构与指针 链表 公用体的基本概念. 1. 结构概念. C 语言允许将一组逻辑上联系的不同类型的数据组织起来作为一个整体使用 保证了数据之间的内在联系 用同一个名字引用的相关变量的集合 提供了将相关信息组合在一起的一种手段 C语言提供了一种新的称为结构的构造型数据类型 概念

keona
Download Presentation

THE C PROGRAMMING LANGUAGE

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. THE C PROGRAMMING LANGUAGE 计算中心- NEU Computer Center 高克宁-gaokening E_mail:chengxusheji01@necmail.neu.edu.cn

  2. 0.本章内容 • 结构的概念 • 定义 • 使用 • 结构与数组 • 结构与指针 • 链表 • 公用体的基本概念

  3. 1.结构概念 • C语言允许将一组逻辑上联系的不同类型的数据组织起来作为一个整体使用 • 保证了数据之间的内在联系 • 用同一个名字引用的相关变量的集合 • 提供了将相关信息组合在一起的一种手段 • C语言提供了一种新的称为结构的构造型数据类型 • 概念 • 结构是一组相关的不同类型的数据的集合 • 结构类型为处理复杂的数据提供了便利的手段 • 结构体类型的变量可以拥有不同数据类型的成员 • 是不同数据类型成员的集合

  4. 例如:学生成绩表由下面的项目组成: 班级 学号 姓名 操作系统 数据结构 C程序设计 网络工程 (字符串) (长整) (字符串) (实型) (实型) (实型) (实型) 通讯录有下列数据项组成: 姓名 工作单位 家庭住址 邮编 电话号码 E_mail (字符串) (字符串) (字符串) (长整) (字符串或长整) (字符串) 1.结构概念 成绩表: struct score {char grade[20];/*班级*/ long number ; /*学号*/ char name[20];/*姓名*/ float os; /*操作系统*/ float datastru; /*数据结构*/ float cprog; /*C语言程序设计*/ float compnet; /*网络工程*/ }; 通讯录表: struct addr {char name[20]; /*姓名*/ char department[30];/*部门*/ char f_address[50];/*家庭住址*/ long box; /*邮编*/ long phone; /*电话*/ char email[20];/*Email*/ } ;

  5. 1.结构概念 • 结构体与数组 • 组成方式 • 都是由若干分量组成的 • 数组是由相同类型的数组元素组成 • 结构的分量可以是不同类型的 • 结构中的分量称为结构的成员 • 访问方式 • 数组中的分量(元素)是通过数组的下标 • 访问结构中的成员是通过成员的名字 • 结构体的成员可以分别引用 • 利用结构体可以组织复杂的紧凑的数据结构 • 如:链表、队列、堆栈和数等

  6. 2.结构的定义 • 在程序中使用结构之前,必须做的工作 • 定义结构体类型 • 建立一个可用于定义结构类型变量的模型 • 其组成的各个要素称为结构体的成员 • 结构的定义说明了该结构的组成成员,以及每个成员的数据类型 • 变量在计算机中的存在格式 • 定义结构体变量 • 要使用该结构就必须说明结构类型的变量 • 根据结构体类型为所定义的变量分配内存空间 • 提示 • 不同的问题有不同数据成员,即不同描述的结构体类型 • 可以理解为结构体类型根据所针对的问题不同而使得其结构体的成员是不同的 • 可以有任意多的结构体类型描述 • 使得C语言可以解决的问题范围扩大

  7. 2.结构的定义 struct 结构类型名称{ 数据类型 成员名1;数据类型 成员名2; ……数据类型 成员名n; }; • 结构定义的形式 • 说明 • struct为关键字 • 结构的标识符 • 结构类型名称是所定义的结构的类型标识 • 由用户自己定义 • { }中包围的是组成该结构的成员项 • 每个成员的数据类型既可以是简单的数据类型,也可以是复杂的数据类型 • 整个定义作为一个完整的语句用分号结束 • 提示 • 结构体类型的说明只是列出了该结构的组成情况 • 标志这种类型的结构模式已存在 • 编译系统并没有因此而分配存储空间

  8. 2.结构的定义 例:定义一个日期结构体类型 struct date { int year; int mouth; int day;}; • 结构定义的形式 • 例 • 当一个成员项是一个结构体时,就形成了结构体的嵌套 • 在数据处理时有时要用到结构体嵌套处理组织复杂的数据集合 • 常见的错误是忘记终止结构定义的“;” 例:定义一个teacher 类型的结构体 struct date { int year; int mouth; int day; }; strcut teacher { char name[20] ; struct date birthday; char depart[20] ; };

  9. 2.结构的定义 • 结构定义的形式 • 提示 • 结构体必须有struct开始 • 结构体的成员可以是基本数据类型,也可以是数组和其它结构类型的变量 • 结构体不能递归定义 • 在结构体类型说明中不能有该结构体变量 • 允许有指向该结构体的指针成员(自引用结构) • 结构的定义可以在一个函数的内部,也可以在所有函数的外部 • 在函数内部定义的结构,仅在该函数内部有效 • 定义在外部的结构,在所有函数中都可以使用 • 定义结构体类型后可以定义该结构体类型的变量 • 通过变量使用该结构,以对不同变量的成员进行引用

  10. 2.结构的定义 • 结构体变量 • 定义的形式 • 先定义结构体类型再定义结构体变量 • 定义结构体类型和结构体变量 • 直接定义结构体变量而不需要定义结构体类型名

  11. 2.结构的定义 struct 结构类型名 { 成员1类型标识 成员1名; 成员2类型标识 成员2名; … 成员n类型标识 成员n名; }; struct 结构体类型名 结构体变量列表; • 结构体变量 • 定义的形式(1) • struct 结构类型名称 结构变量名; • 说明 • 说明结构变量的作用类似于说明一个类型变量一样 • 系统为所说明的结构变量按照结构定义时组成分配存储数据的实际内存单元 • 结构变量的成员在内存中占用连续存储区域,所占内存大小为结构中每个成员的长度之和 • 例:struct date { int year; int mouth; int day; }; struct datetoday,days[20],*day;

  12. 2.结构的定义 • 结构体变量 • 提示 • 在程序中,结构的定义要先于结构变量的说明 • 不能用尚未定义的结构类型对变量进行说明 • 结构的定义和说明可以同时进行 • 被说明的结构变量可直接在结构定义的“ }”后给出 • 例如说明结构变量today可以使用下面的语句 struct date { int year, month, day; } today; • 使用sizeof计算一个结构变量占用内存的实际大小 • 使用的一般形式为:sizeof(变量或类型说明符)

  13. 2.结构的定义 struct teacher { char name[20] ; int age; char sex; char depart[20] ; struct teacher *next; }; • 结构体变量 • 提示 • 结构体类型与结构体变量是两个不同的概念 • 编译系统不为结构体类型分配内存空间,只为结构体变量分配内存空间 • 内存的大小依据结构体类型的定义(结构体类型的变量占内存长度不定长) • 对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。

  14. 2.结构的定义 struct teacher { char name[20] ; int age; char sex; char depart[20] ; struct teacher *next; }; • 结构体变量 • 提示 • 结构体中的成员名可以和程序中的其他变量同名,互不影响,也可以与结构变量名相同 • 但应尽量避免在不同的结构中使用相同的结构名 • 虽然允许,但会造成混淆 • 结构体变量的成员(域)可以单独使用(相当于基本变量) • 成员即可以是一个结构体变量,也可以是指向本结构体类型的指针

  15. 3.使用结构体 • 结构成员的引用 • 结构作为若干成员的集合是一个整体 • 可对结构整体进行操作 • 可访问结构中的每个成员 • 使用结构中成员的方法 • 结构变量名.成员名称 • 运算符“.”的含义是访问结构中的成员 • “.”操作的优先级最高 • 结合性为从左到右 • 指针变量名->成员名 • 在结构体指针变量情况下使用运算符“->”

  16. 3.使用结构体 • 结构成员的引用 • 例 • 对于结构体变量today • 有效的结构体成员是year,month,day • today.year,today.mouth,today.day是对结构体变量today的合法引用 • 打印today的成员year printf(“%d” ,today.year); • 将today的成员 month置为12 today.month=12; struct date { int year; int month; int day; } today,tomorrow;

  17. 3.使用结构体 • 结构成员的引用 • 提示 • 结构的成员可以象一般变量一样参与各种操作和运算 • 进行结构变量的整体操作就有很多限制 • 由于结构中各个成员的逻辑意义不同,类型不同,对结构变量整体的操作的物理意义不是十分明显 • C语言中能够对结构进行整体操作的运算只有赋值“=”和取地址“&”操作 • 例如: struct date day1={1999,10,12}; struct date day2; day2= day1;/*将day1的所有成员值赋值给 day2;*/ • 可以引用结构体成员的地址也可以引用结构体变量的地址 • 主要作用于函数的参数传递(传递结构体的地址)

  18. 3.使用结构体 • 结构成员的引用 • 提示 • C语言不允许将两个结构体变量整体比较,只能是逐个成员之间进行比较 • 例如 struct date d1={1994,11,20},d2;d2=d1; d2.day=7;if (( d1.year= =d2.year )&&( d1.month= =d2.month ) &&( d1.day= =d2.day )) printf(“same day”);else printf(“diffierent day”);

  19. 3.使用结构体 • 结构成员的引用 • 提示 • 对于嵌套定义的结构体成员的引用,要逐级找到最后一级的结构体成员,只能对这个成员进行引用 • 用成员运算符“.”自左向右的将内外层连接起来 • 对中间过程所涉及的成员不能引用 struct date { int year; int mouth; int day;} struct student { int num; char name[20]; char sex; int age; struct date birthday; char addr[30] ;} stud1,stud2; 合法引用一个学生的生日: stud1.birthday.day; stud1.birthday.month; stud1.birthday.year;

  20. 3.使用结构体 • 结构的初始化 • 在结构说明的同时,可以对每个成员置初值,称为结构的初始化 • 结构初始化的一般形式 • 说明 • 初始化数据的个数与结构成员的个数应相同 • 它们是按成员的先后顺序一一对应赋值的 • 每个初始化数据必须符合与其对应的成员的数据类型 • 例如 • struct date nextday={2000,12,27} ; struct 结构类型名 结构变量名={成员1的值,成员2的值,…}

  21. 3.使用结构体 【例】调式程序 struct person { char name[20] ; int age; char sex;} ; void main() { struct person a={“liming” ,23,‘m’}; struct person b; b=a; b.age=21; b.sex=‘f’ ; printf(“%s,%d year old.\n” ,b.name,b.age); if (b.sex= = ‘m’) printf(“%s is a man.\n” ,b.name); else printf(“%s is a woman.\n” ,b.name); } jgt1.c

  22. (3) struct { char name[20] ; int age; char sex; char depart[20] ; } teach[40] ; 4. 结构体与数组 • 结构数组 • 定义 • 结构体数组中的所有元素都具有相同的结构体类型 • 方式 • 先定义结构体类型再定义结构体数组 • 同时定义结构体类型和结构体数组 • 直接定义结构体数组而不需要定义结构体类型名 (1) struct teacher { char name[20] ; int age; char sex; char depart[20] ; }; struct teacher teach[40] ; (2) struct teacher { char name[20] ; int age; char sex; char depart[20] ; } teach[40] ;

  23. teach teach[0] name(20) age(2) 43个 字节 sex(1) depart(20) teach[1] … … teach[39] name(20) age(2) sex(1) depart(20) 4. 结构体与数组 • 结构数组 • 三种方法都实现了一个结构体数组的定义 • 例 • 结构体数组中有40个元素,每个元素的类型为结构体类型struct teacher • 可用teach[0] 、teach[1] 、…teach[39]表示数组元素 在内存中的存放方式:

  24. 4. 结构体与数组 • 结构数组引用 • 指对结构体数组元素的引用 • 由于结构体数组元素相对于结构体变量,因此对结构体变量的引用方法也同样适用与结构体数组元素 • 引用形式 • 提示 • 必须带有下标,以表明要访问结构数组中某个元素对应的结构中的成员 结构体数组名[下标].成员名 例如:struct {char name[20] ; int age; char sex; char depart[20] ; } teach[40] ; 则:teach[2].age表示teach数组的第3个元素的age成员项。

  25. 4. 结构体与数组 • 结构体数组元素的赋值 • ANSI C标准允许将一个结构体数组元素赋值给同一结构体数组的其它元素,或者赋值给同一类型的变量 • 例如:前面的teach结构体数组定义后,可以进行这样的赋值: teach[3]=teach[0] ; • 结构体数组的输入输出 • 不能直接进行输入输出 • 只能对数组元素的单个成员进行输入输出 • 例如:scanf(“%d” ,&teach[3].age); printf(“%c” ,teach[0].sex);

  26. 4. 结构体与数组 • 结构数组的初始化 • C语言规定只能对全局的或静态的结构体数组进行初始化 • 数组中的每个元素都是一个结构体类型 • 要将其成员的值依次放在一对{}中以便区分各个元素 可以看出: 初始化的一般形式: struct 结构名 结构数组名={初始值}; 初值表内的{}的作用主要是区别 不同数组元素的数据,系统会顺序 地按照每对{}将数据赋给每一个 数组元素。有关数组的规定对结构 体数组都适用。 例如: struct depart { int no; char depname; }dp[3] ={{3, “人事处”}, {6, “财务处”}, { 10,“计算中心” } };

  27. 4. 结构体与数组 例题:对4个学生(包括考号、成绩、姓名),求出成绩最好的学生的姓名和成绩。 struct syudent { int num; char name[10] ; floart score ; }stud[4]={{1,“ny” ,89}, {2,“tz” ,91}, {3,“lm” ,75},{4,“sn” ,89} }; main() { float max;int i,k; max=stud[0].score; k=0; for (i=1;i<=4;i++) if (max<stud[i].score ) { max=stud[i].score ;k=i;} printf(“\n name result\n ”); printf(“%6s%8.0f” ,stud[k].name,stud[k].score);}

  28. 4. 结构体与数组 问题1:有如下定义: struct aa { long num ; char name[20] ;}; struct bb { int age ; struct aa first ;}stu[2] ; 问:(1)如何给stu[1]输入18,001011,zhang hua? (2)如何将 ‘z’、‘h’改写为大写? (3)如何将stu[1]的名字复制到stu[0]的位置?

  29. 指针p teach 地址 5. 结构体与指针 • 结构体指针 • 是一个指针变量,指向一个结构体变量 • 指向该变量所分配的存储区域的起始地址 • 一个结构体变量的指针就是该变量所占据的内存空间的起始地址 • 结构体指针变量还可以用来指向结构体数组中的元素 • 对结构体变量的访问 • 即可以通过结构体变量名实现(成员访问运算符),也可以通过结构体指针实现

  30. 5. 结构体与指针 • 结构体指针 • 结构体指针定义方式 • 提示 • 结构体指针在特性和使用方法上与指针完全相同 • 结构体指针的运算也按照 C语言的地址计算规则进行 • 结构体指针自身地址值的增加量取决于它所指向的结构体的数据长度(可以采用 sizeof函数获取) struct 结构体类型名 *结构体指针名; struct teacher {char name[20] ; int age; char sex; char depart[20] ;}; struct teacher teach,*pt; pt是teacher结构体变量的指针变 量,它将指向teacher结构体类型的 变量(不能指向其它结构体类型)。 若令pt= &teach ,则pt将指向相同 结构体类型的变量teach 。

  31. struct teacher {char name[20] ; int age; char sex; char depart[20] ;}; struct teacher teach,*pt; 指针pt 结构体类型 单元长度 &teach.name &teach.age &teach.sex &teach.depart 5. 结构体与指针 • 结构体指针 • 提示 • pt不是结构体变量(是指向结构体变量的指针) • 不能写成成员引用方式pt.age的形式 • 如需要则应写成( *pt ).age的形式(“显示法”) teach

  32. struct teacher {char name[20] ; int age; char sex; char depart[20] ;}; struct teacher teach,*pt; 5. 结构体与指针 • 结构体指针 • 提示 • C语言中引用了一个指向运算符“->” • 用于连接指针变量与其指向的结构体成员 • 如: ( *pt ).age可写成pt ->age的形式 • 下面三种引用方式是等价的 结构体变量名.成员名 (*结构体类型指针).成员名 结构体类型指针->成员名 例如:teach.age<==>(*pt).age< == >pt->age

  33. struct teacher {char name[20] ; int age; char sex; char depart[20] ;}; struct teacher teach,*pt; 5. 结构体与指针 • 结构体指针 • 提示 • pt只能指向一个结构体变量 • 如:pt=&teach; • 不能指向结构体变量的一个成员 • 如:pt=&teach.age;是非法的。 • 虽然&teach.age也有地址,但这个地址存放的数据类型为整型数据而非结构体类型数据 • pt只能指向一个结构体数组的一个元素(相当于变量) • 用->指向运算符取其成员的值 • 而不能直接指向一个数组元素的成员

  34. 5. 结构体与指针 • 结构体指针 • 提示 • ->运算符的优先级最高 例如:struct { int numb; char *name[]; } *p; 则有表达式: ++p->numb:表示numb的值增加1。而不是p指针向下移动。 等价于++(p->numb)。 (++p)->numb:表示p指针增加操作后,再访问其成员numb。 (p++)->numb:先对numb操作,再对指针p加1。 同理: *p->name:是取 name所指向的值; *p->name++:先取name所指向的值,在将name加1。 (*p->name)++:是将name所指向的值加1。 *p++->name:先取name所指向的值,再将指针p加1。

  35. 5. 结构体与指针 • 结构体指针 • 例题:对结构体变量的使用——输入一个结构体变量成员并输出 • 提示 • 程序中使用结构体类型指针引用结构体类型变量的成员 • 通过C语言提供的库函数 malloc()来为指针分配安全的地址 • 函数sizeof()返回值是计算给定数据类型所占内存的字节数 • 指针所指向各个成员的形式为 • studptr->name • studptr->num • studptr->birthday

  36. #include<stdib.h> struct data { int day,month,year;}; struct stud { char name[20]; long num; struct data birthday; }; 5. 结构体与指针 main() { struct stud *studptr; studptr=malloc(sizeof(struct stud)); printf(“input name,number,year,month,day:\n”); scanf(“%s”,studptr->name); scanf(“%ld”,&studptr->num); scanf(“%d%d%d”,&studptr-> birthday.year, &studptr-> birthday.month, &studptr->birthday.day); printf(“\noutput name,number,birthday:\n”); printf(“%20s%10ld%10d//%d//%d”, studptr->name,studptr->num, studptr->birthday.year, studptr->birthday.month, studptr->birthday.day); } jgt3.c

  37. 5. 结构体与指针 • 指向结构体数组的指针的应用 • 定义结构体类型的指针 • 例如:对上例定义成结构体数组以及指向结构体类型的指针 • struct stu student[40],*studptr; • 当 studptr=student时,指针studptr指向了结构体数组student • 对数组元素的引用方法有三种 • 地址法 student+i和studptr +i 均表示数组第i个元素的地址,数组元素 各成员的引用形式为: ( student+i)->name、 ( student+i)->num和 ( studptr +i ) ->name、 ( studptr +i ) ->num等。 student+i和p+i 与&student[i]的意义相同.

  38. 5. 结构体与指针 • 指向结构体数组的指针的应用 • 对数组元素的引用方法有三种 • 指针法 • 若studptr指向某个元素,则studptr ++就是指向其后续元素 • 指针的数组表示法 • 当指针studptr指向了数组student, studptr[i]表示数组的第i个元素 • 其效果与student [i]相同 • 对数组成员的引用描述为: studptr[i].name、 studptr[i].num等 • 提示 • 在结构指针运算符-和>之间插入空格 • 试图只用成员名引用结构的成员。(必须给出结构名) • 在用指针和结构成员运算符引用结构成员时没有() • 就是说*p.name是一种语法错误。

  39. 5. 结构体与指针 【例】利用指向结构体的指针编制一程序,实现输入三个学生的学号、 数学期中和期末成绩,然后计算平均成绩并输出成绩表。 #include <stdio.h> struct student { int num;int mid;int end;int aver;}s[3] ; main() { int i; struct student *p; for (p=s;p<s+3;p++) {scanf(“%d%d%d” ,&(p->num),&(p->mid), &(p->end)); p->aver=(p->mid+p->end)/2;} for (p=s;p<s+3;p++) printf(“%d %d %d %d\n”,p->num,p->mid, p->end,p->aver); } jgt4.c

  40. 5. 结构体与函数 • 结构体变量定义范围 • 与普通变量一样,结构变量在函数内部定义时为局部的 • 其值只在本函数范围内有效 • 不会影响其它函数 • 结构体作为函数参数 • 将结构传递给函数的方式有三种 • 传递单个成员 • 传递整个结构 • 传递指向结构的指针

  41. 5. 结构体与函数 • 结构体作为函数参数 • 提示 • 传递结构变量的地址可以实现结构的传递 • 结构变量作为参数传递时,其实参与形参的结构类型必须一致 • 传递时实参只需指定其结构变量名即可 • 当实参为数组时,其形参可以定义为同类型结构的结构数组或结构指针

  42. 5. 结构体与函数 #define FORMAT “%d\n%s\n%6.2f\n” struct student { int num; char name[20]; float score; }; main() { void print (); struct student stud; stud.num=1001; strcopy(stud.name,”michell”); stud.score=90.9; print(&stud); } void print(p) struct student *p; { printf(FORMAT,p->num,p->name,p->score); printf(“\n”); } jgt5.c 在调用print时, &stud 做实参,将stud的地址 传递给函数的形参p, 这时p指向了结构变量 stud的成员值。

  43. 5. 结构体与函数 【例】按学生姓名查询其排名, 查询可连续进行,直到键入0时 结束。 #include <stdio.h> #include <string.h> define NUM 4 struct student { int rank; char *name; float score; }; struct student stud[]={ 3,“T”,89.0, 2,“L”,72.6, 4,“W”,90.1, 1,“Y”,79.5 }; main() { char str[10] ; int i; pritf(“Enter a name:\n”); scanf(“%s” ,str); while(strcmp(str,“0”)!= 0) { for (i=0;i<=NUM;i++) if (strcmp(str,stud[i].name )==0 ) { printf(“name :%3s\n ”,stud[i].name); printf(“rank :%3s\n ”,stud[i].rank); printf(“aver :%5.1f\n”,stud[i].score); break; } if (i>=NUM) printf(“Not found\n”); scanf(“%s” ,str); } printf(”\nEnd\n”) } jgt7.c

  44. t p w i c 0 1 A m n 6.链表 【例】设有下面的定义, struct aa { int i; char c;}t; struct cc{ int m, struct aa *n;}; struct cc w,*p=&w; 要建立右图的结构应如何操作?(用指针实现) 将t的起始地址放到p所指向的结构体变量w中的成员n中 解: p->m=0; p->n=&t; p->n->i=1; p->n->c=‘A’; (成员n指向一个嵌套的结构体) 使p指向的结构体变量w中的成员m的值为0 p->n->c是 p->n所指向的结构体变量t的成员c p->n是地址,它指向t,因此p->n->i相当于t.i

  45. p w t i 0 i 1 \0 n n 6.链表 【例】设有下面的定义 struct aa { int i; struct aa *n }w,t,*p=&w; 要建立如图的结构应如何用指针完成? 解: p->i=0; p->n=&t; p->n->i=1; p->n->n=‘\0’ ; 成员n指向了本结构体类型的变量。这种结构就是链表中的节点。

  46. 6.链表 • 什么是链表? • 链接方式存储的线性表简称为链表(Linked List) • 是常见的数据结构 • 链表是指若干个数据项按一定的原则连接起来 • 每个数据项称为一个“结点” • 每个数据项都包含有若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接成一个链表

  47. 姓 名3 姓 名1 姓 名2 学 号3 学 号1 学 号2 成 绩3 成 绩2 成 绩1 指 针3 指 针1 指 针2 6.链表 • 什么是链表? • 存储方式特点 • 用一组任意的存储单元来存放线性表的结点 • 这组存储单元既可以是连续的,也可以是不连续的 • 链表中结点的逻辑次序和物理次序不一定相同 • 为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 数据项1 数据项3 数据项2 头指针head

  48. 6.链表 • 什么是链表? • 域 • data域 • 存放结点值的数据域 • next域 • 存放结点的直接后继的地址(位置)的指针域(链域) struct node { int data; struct node *next; };

  49. 6.链表 • 链表与数组的主要区别 • 个数 • 数组的元素个数是固定的,链表的结点个数可按需要增减; • 存贮单元 • 数组元素的存贮单元在数组定义时分配,链表结点的存贮单元在程序执行时动态向系统申请 • 对于不是固定长度的链表,用可能最大长度的数组来描述,会浪费内存空间 • 关系 • 数组中的元素顺序关系由元素在数组中的位置确定,链表中的结点顺序关系由结点所包含的指针来体现 • 操作(如果需要频繁处理元素/结点的插入、删除操作) • 用数组处理非常麻烦,程序结构不易清晰 • 用链表实现,则程序结构清晰,处理的方法也较为简便

  50. 6.链表 • 内存管理库函数 • 分配存储空间函数malloc( ) • 分配存储空间函数calloc( ) • 重新分配空间函数 realloc ( ) • 释放空间函数 free ( )

More Related