收藏 分享(赏)

C语言结构体2011.ppt

上传人:hwpkd79526 文档编号:7801698 上传时间:2019-05-26 格式:PPT 页数:102 大小:2.38MB
下载 相关 举报
C语言结构体2011.ppt_第1页
第1页 / 共102页
C语言结构体2011.ppt_第2页
第2页 / 共102页
C语言结构体2011.ppt_第3页
第3页 / 共102页
C语言结构体2011.ppt_第4页
第4页 / 共102页
C语言结构体2011.ppt_第5页
第5页 / 共102页
点击查看更多>>
资源描述

1、1,本章内容,结构体(结构structure)类型 共用体(联合union)类型 结构体变量、结构体数组、结构体指针 向函数传递结构体 用结构体指针实现动态数据结构 链表的概念及操作原理,第9章 结构体,2,从基本数据类型、复合数据类型到抽象数据类型,二进制数类型本不存在 内存里存的内容,你认为它是什么,它就是什么 在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念 一般的CPU只支持两种类型 整数、浮点数,3,从基本数据类型、复合数据类型到抽象数据类型,在高级语言引入了基本数据类型 整型、浮点型、字符型等 不同语言会定义不同的基本类型 基本数据类型并不能方便地解决所有问题

2、 有些语言(如PL/1)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法,4,从基本数据类型、复合数据类型到抽象数据类型,用户自己构造数据类型-复合数据类型 由基本数据类型迭代派生而来,表示复杂的数据对象 典型的代表就是“结构体” 数组和指针,5,抽象数据类型(Abstract Data Type,简称ADT) 在复合数据类型基础上增加了对数据的操作 抽象数据类型进而进化为“类(Class)” 这是一个跨时代的进步 Class是Object-Oriented的一个重要概念,从基本数据类型、复合数据类型到抽象数据类型,6,思考一个问题,在程序里表示一个人(姓名、年龄、性别),怎么表

3、示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,表9-1 某学校学生成绩管理表,7,数组的解决方法,int studentId30;/* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/ char studentName3010; char studentGender302; int timeOfEnter30; /*入学时间用int表示*/ int scoreComputer30;/*计算机原理课的成绩*/ int scoreEnglish30; /*英语课的成绩*/ int scoreMath30; /*数学课的成绩*/ int scoreMusic30; /*音

4、乐课的成绩*/,8,int studentId30 = 1,2,3,4,5,6; char studentName3010=“令狐冲“,“林平之“,“岳灵珊“,“任莹莹“; char studentGender302=“男“,“男“,“女“,“女“; int timeOfEnter30 = 1999,1999,1999,1999; int scoreComputer30 = 90,78,89,78; int scoreEnglish30 = 83,92,72,95; int scoreMath30 = 72,88,98,87; int scoreMusic30 = 82,78,66,90;,数

5、组的解决方法,9,数据的内存管理方式,数组的解决方法,10,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理,11,希望的内存分配图,12,结构体的解决方法,struct STUDENT int studentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentGender4; /*每个学生的性别*/ int timeOfEnter; /*每个学生的入学时间*/ int scoreComputer; /*每个学生的计算机原理成绩*/ int scor

6、eEnglish; /*每个学生的英语成绩*/ int scoreMath; /*每个学生的数学成绩*/ int scoreMusic; /*每个学生的音乐成绩*/ ; struct STUDENT是一个类型 struct STUDENT students4; students0.studentID students0.scoreComputer 它们都是变量,一般称为结构的成员变量,13,用户自定义的数据类型,结构体: 把关系紧密、且逻辑相关的多种不同类型的变量,组织到统一的名字之下 占用相邻的一段内存单元 共用体: 把情形互斥、但逻辑相关的多种不同类型的变量,组织到统一的名字之下 占用同一

7、段内存单元,每一时刻只有一个数据起作用,14,形成一个样板 用于生成结构体变量,struct 结构体名 类型关键字 成员名1;类型关键字 成员名2;.类型关键字 成员名n; ;,构成结构体的变量 称结构体成员(member) 也称域(filed),结构体类型的定义,struct student int num;char name20;char Gender;int age;float score;char addr30; ;,15,struct student int num;char name20;char Gender;int age;float score;char addr30; ;,

8、struct 结构体名 类型关键字 成员名1;类型关键字 成员名2;.类型关键字 成员名n; ;,结构体类型的定义,只定义了数据的形式,即声明了一种复杂的数据类型,并未生成任何变量。,16,先定义结构体类型再定义变量名,在定义类型的同时定义变量,直接定义结构体变量(不出现结构体名),struct student student1,student2;,struct student int num;char name20;char Gender;int age;float score;char addr30; student1,student2;,struct int num;char name2

9、0;char Gender;int age;float score;char addr30; student1,student2;,结构体变量的定义,17,定义自己的类型名,struct student student1,student2;/*It works*/student student1,student2;/*Can this work?*/typedef struct student STUD ; STUD student1,student2; /*It works!*/,typedef为一种已存在的类型定义一个新名字,STUD与struct student类型是同义词,struct

10、 student int num;char name20;char Gender;int age;float score;char addr30; ;,18,struct类型的特点,是一个一个普通的类型 可以定义该类型的变量、数组、指针 可以做函数的参数类型和返回值类型 它的成员可以是任意类型 基本类型、数组、指针、结构体、共用体 struct类型的变量 两个结构体变量之间可以相互赋值 所以做为函数的参数时,是传值调用 可以取地址& 不可直接参与算术和比较运算 面向对象和数据库是struct思想的发展,19,结构体的内存占用,double 占用内存字节数 = 8 struct 类型用内存字节数

11、 = ? 是所有成员变量的内存总和吗?,struct number short i; char ch;float f; ;,printf(“%dn“, sizeof(struct number);,用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型),8,Why?,20,结构体的内存占用,事实上所有数据类型在内存中都是从偶数地址开始存放的 且结构所占的实际空间一般是按照机器字长对齐的 不同的编译器、平台,对齐方式会有变化 结构体变量的成员的存储对齐规则是与机器相关的 具有特定数据类型的数据项的大小也是与机器相关的 所以一个结构体在内存中的存储格式也是与机器相关

12、的,非所有成员变量的内存总和,8个字节,21,struct STUDENT int studentID;char studentName10;char studentGender4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; ; struct STUDENT stu30;,结构体数组,struct date int year;int month;int day; ;,结构体定义 可以嵌套,22,struct STUDENT stu30 = 1,“令狐冲“,“男“

13、,1999,08,26,90,83,72,82,2,“林平之“,“男“,1999,08,26,78,92,88,78,3,“岳灵珊“,“女“,1999,08,26,89,72,98,66,4,“任莹莹“,“女“,1999,08,26,78,95,87,90;,初始化,结构体数组,struct STUDENT int studentID;char studentName10;char studentGender4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; ;,2

14、3,struct STUDENT stu30 = 1,“令狐冲“,“男“,1999,08,26,90,83,72,82,2,“林平之“,“男“,1999,08,26,78,92,88,78,3,“岳灵珊“,“女“,1999,08,26,89,72,98,66,4,“任莹莹“,“女“,1999,08,26,78,95,87,90;,初始化,建立了数据库中的多条记录,每条对应一个学生信息,24,结构体变量的指针,pStu,stu,struct STUDENT int studentID;char studentName10;char studentGender4;struct date timeO

15、fEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; ;,struct STUDENT stu; /*定义结构体变量*/struct STUDENT *pStu; /*定义结构体指针*/ pStu = ,25,pStu,stu,struct STUDENT int studentID;char studentName10;char studentGender4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;

16、int scoreMusic; ;,struct STUDENT stu; /*定义结构体变量*/struct STUDENT *pStu; /*定义结构体指针*/ pStu = ,如何访问结构体的成员,通过stu和成员运算符访问结构体成员 stu. studentID = 1; 通过pStu和指向运算符访问结构体成员 (*pStu). studentID = 1; pStu - studentID = 1;,26,struct STUDENT int studentID;char studentName10;char studentGender4;struct date timeOfEnte

17、r;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; ;,struct STUDENT stu; /*定义结构体变量*/struct STUDENT *pStu; /*定义结构体指针*/ pStu = ,如何访问嵌套的结构体的成员,stu. timeOfEnter. year = 1999; (*pStu). timeOfEnter. year = 1999; pStu - timeOfEnter. year = 1999;,struct date int year;int month;int day; ;,27,

18、思考题,struct point int x; int y; ; struct rect struct point pt1; struct point pt2; ;,struct rect rt; struct rect *rp = 下面表达式哪些合法? rt.pt1.x (*rp).pt1.x rp-pt1.x rt-pt1.x 上面合法的表达式都是等价的吗?,28,struct STUDENT stu4 = 1,“令狐冲“,“男“,1999,08,26,90,83,72,82,2,“林平之“,“男“,1999,08,26,78,92,88,78,3,“岳灵珊“,“女“,1999,08,26

19、,89,72,98,66,4,“任莹莹“,“女“,1999,08,26,78,95,87,90;,结构体数组的指针,pStu,stu4,struct STUDENT int studentID;char studentName10;char studentGender4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; ;,struct STUDENT *pStu; /*定义结构体指针*/ pStu = stu; /*相当于pStu = */,29,使用pStu+i,

20、使pStu指向stui pStu - studentID 等价于 stui. studentID,如何访问结构体数组元素的成员,pStu,stu4,struct STUDENT int studentID;char studentName10;char studentGender4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; ;,struct STUDENT *pStu; /*定义结构体指针*/ pStu = stu; /*相当于pStu = */,30,向函数

21、传递结构体,向函数传递结构体的单个成员 复制单个成员的内容 函数内对结构内容的修改不影响原结构 向函数传递结构体的完整结构? 向函数传递结构体的首地址?,31,struct date int year;int month;int day; ; void func(struct date p) p.year = 2000;p.month = 5;p.day = 22; ,int main() struct date d;d.year = 1999;d.month = 4;d.day = 23;printf(“%d,%d,%dn”, d.year, d.month, d.day);func(d);

22、 printf(“%d,%d,%dn”, d.year, d.month, d.day);return 0; ,1999,4,23,1999,4,23,结构体变量 做函数参数,32,struct date int year;int month;int day; ; void func(struct date *p) p-year = 2000;p-month = 5;p-day = 22; ,int main() struct date d;d.year = 1999;d.month = 4;d.day = 23;printf(“%d,%d,%dn”, d.year, d.month, d.d

23、ay);func( ,1999,4,23,2000,5,22,结构体指针 做函数参数,指针做函数形参 实参必须为地址值,33,struct date int year;int month;int day; ; struct date func(struct date p) p.year = 2000;p.month = 5;p.day = 22; ,int main() struct date d;d.year = 1999;d.month = 4;d.day = 23;printf(“%d,%d,%dn”, d.year, d.month, d.day);d = func(d); print

24、f(“%d,%d,%dn”, d.year, d.month, d.day);return 0; ,结构体变量 做函数返回值,存在一个错误,34,struct date int year;int month;int day; ; struct date func(struct date p) p.year = 2000;p.month = 5;p.day = 22;return p; ,int main() struct date d;d.year = 1999;d.month = 4;d.day = 23;printf(“%d,%d,%dn”, d.year, d.month, d.day)

25、;d = func(d); printf(“%d,%d,%dn”, d.year, d.month, d.day);return 0; ,1999,4,23,2000,5,22,结构体变量 做函数返回值,35,向函数传递结构体,向函数传递结构体的完整结构 复制整个结构体成员的内容,多个值 函数内对结构内容的修改不影响原结构 内容传递更直观,但开销大 向函数传递结构体的首地址 用结构体数组/结构体指针做函数参数 仅复制结构体的首地址,一个值 修改结构体指针所指向的结构体的内容 指针传递效率高,36,实例9.1 :洗牌和发牌模拟,一副扑克有52张牌,分为4种花色(Suit): 黑桃(Spades)

26、、红桃(Hearts)、草花(Clubs)、方块(Diamonds) 每种花色有13张牌面(Face): A,2,3,4,5,6,7,8,9,10,Jack,Queen,King设计一个结构体表示一张牌:struct CARDchar suit10; /*花色*/char face10; /*牌面*/; char *suit=“Spades“,“Hearts“,“Clubs“,“Diamonds“;char *face = “A“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“,“10“,“jack“,“Queen“,“King“;,37,实例9.1 :洗牌和发牌模拟,stru

27、ct CARDchar suit10; /*花色*/char face10; /*牌面*/; struct CARD card52; /*依次存放扑克牌的花色和牌面*/,如何表示第1张牌的花色和牌面?,card0.suit card0.face,未洗牌情况下,第1张牌花色Spades,牌面A,洗牌后,第1张牌不一定为Spades和A,38,实例9.1 :洗牌和发牌模拟,struct CARDchar suit10; /*花色*/char face10; /*牌面*/; struct CARD card52; /*依次存放扑克牌的花色和牌面*/,如何顺序输出一副新扑克牌(花色和牌面未打乱)呢?,

28、39,实例9.1 :洗牌和发牌模拟,如何用函数实现?,40,实例9.1 :洗牌和发牌模拟,/* 函数功能:将52张牌按黑桃、红桃、草花、方块花色顺序,面值按AK顺序排列函数参数:结构体数组wCard,表示不同花色和面值的52张牌指针数组wFace,指向面值字符串指针数组wSuit,指向花色字符串函数返回值:无 */ void FillCard(struct CARD wCard,char *wSuit, char *wFace) int i;for (i=0; i52; i+)strcpy(wCardi.suit, wSuiti/13);strcpy(wCardi.face, wFacei%1

29、3); ,41,/*函数功能:输出发牌结果函数参数:结构体数组wCard,表示有52张牌函数返回值:无 */ void Deal(struct CARD *wCard) int i;for (i=0; i52; i+) printf(“%10s %5sn“, wCardi.suit, wCardi.face); ,实例9.1 :洗牌和发牌模拟,42,实例9.1 :洗牌和发牌模拟,洗发牌过程 将52张牌按照随机的顺序存放 算法步骤: 产生051的随机数,将其放于resulti内 i=i+1 如果i=51,则重复第1步,否则,结束循环 输出结果 存在一个致命的问题: 在重复第1步时,产生的随机数可

30、能与以前产生的随机数相同,相同意味着52张牌中出现2张以上相同的牌,43,实例9.1 :洗牌和发牌模拟,解决方法 增加一步,判断新产生的随机数以前是否出现过 如果出现过,则放弃; 如果以前未出现过,则保留 算法步骤: 产生051的随机数m,将其放于resulti内 判断resulti在以前(result0resulti-1)是否出现过 如果出现过,则回到第1步 如果没出现过,则i=i+1 如果i=51,则重复第12步,否则,结束循环 输出结果,44,实例9.1 :洗牌和发牌模拟,算法缺陷: 随着生成随机数数量的增加,新的随机数与已经产生的随机数相同的可能性越来越大,有可能出现算法延迟问题 高效

31、算法 先将52张牌按照花色与牌面顺序存放(cardi) 再将其随机打乱 每次循环,程序选择一个051的随机数j,然后将数组中当前的元素cardi与随机选出的元素cardj进行交换,45,/* 函数功能:将52张牌的顺序打乱,函数参数:结构体数组wCard,表示52张牌函数返回值:无 */ void Shuffle(struct CARD *wCard) int i,j;struct CARD temp;for (i=0; i52; i+)j = rand()%52; temp = wCardi; wCardi = wCardj;wCardj = temp; ,实例9.1 :洗牌和发牌模拟,内容

32、回顾,结构类型定义-将相关的不同类型数据组织在一起统一管理 struct 结构体名 类型关键字 成员名1;类型关键字 成员名2;.类型关键字 成员名n; ; 结构变量定义可以与定义类型一起进行 struct student student1,student2;,46,47,数组:线性表的顺序表示方式,A,B,C,D,E,0,1,2,3,4,元素,序号,A,B,C,0,1,2,3,4,元素,下标,5,优点:便于快速、随机存取线性表中任一元素,缺点:插入和删除操作需要移动大量元素,X,A,B,0,1,2,3,4,元素,下标,48,数组:线性表的顺序表示方式,A,B,C,D,E,0,1,2,3,4,

33、元素,序号,缺点: 属于静态内存分配,程序一旦运行长度不能改变。 若想改变,只能修改程序。 一旦确定,会带来两个问题:1)不能超过数组元素最大长度的限制,否则溢出。2)数组元素低于所设定的最大长度,将造成系统资源的浪费。,49,思考,能否有一个办法,保证系统资源的最合理运用? 当我们需要添加一个元素时,程序会自动添加; 当我们需要减少一个元素时,程序会自动放弃该元素原来占有的内存。 动态数据结构 结构体 动态内存分配,50,思考,下面的结构是什么意思?struct temp int data; struct temp pt; ;VC下的错误提示: pt uses temp, which is

34、being defined 下面的结构是什么意思呢?struct temp int data; struct temp *pt; ;,可包含指向本结构体类型的指针变量,51,链表的定义,struct Link int data; struct Link *next; ;,链表(Linked table):线性表的链式存储结构 特点:用一组任意的存储单元存储线性表的数据;存储单元可以是连续的,也可是不连续的,52,链表的定义,struct Link int data; struct Link *next; ;,链表(Linked table):线性表的链式存储结构 为表示每个元素与后继元素的逻辑

35、关系,除存储元素本身信息外,还要存储其直接后继信息,两部分信息组成一个结点,53,链表的定义,struct Link int data; struct Link *next; ;,链表(Linked table):线性表的链式存储结构 为表示每个元素与后继元素的逻辑关系,除存储元素本身信息外,还要存储其直接后继信息,数据域:存储数据元素信息,指针域:存储直接后继的节点信息,54,链表的定义,struct Link int data; struct Link *next; ;,链表(Linked table):线性表的链式存储结构 n个节点链接成一个链表(因为只包含一个指针域,故又称线性链表或单

36、向链表),数据域:存储数据元素信息,指针域:存储直接后继的节点信息,55,链表的典型实现,C语言代码,空指针NULL表示链表结尾,struct Link int data; struct Link *next; ;,链表的头指针:便于操作,56,链表的插入操作,在x后插入新节点 t = malloc(sizeof(struct Node); t-next = x-next; x-next = t;,B,x,A,57,链表的删除操作,删除节点 x - next t = x-next; x-next = t-next; free(t);,B,C,x,A,58,引入链表后,用户就可以根据需要在程序的

37、运行过程中动态分配存储空间。动态存储分配需要利用以下C语言库函数。,(1)函数malloc,函数功能:,函数原型:,void *malloc(unsigned int size);,在内存的动态存储区中分配一个长度为size的连续存储空间。其中,形参size为无符号整数,是函数malloc要求分配存储空间的字节个数。函数返回值为一个指针,它指向所分配存储空间的起始地址。若函数返回值为0,则表示未能成功申请到内存空间。函数类型为void,表示返回的指针不指向任何具体的类型.,10.6 链表,59,int *p; int *lp; p=(int *)malloc(8); lp=(int *)mal

38、loc(12); head=(struct student *)malloc(sizeof(struct student);,例如: malloc(8);,通过函数malloc向系统申请8个字节的内存空间,其起始地址通过函数值返回。若要求用一个指针变量(具有某种类型)指向这个起始地址,则需要显式进行类型转换。例如:,10.6 链表,60,(2) 函数calloc 函数原型:,void *calloc(unsigned int n,unsigned int size);,函数功能:,在内存的动态存储区域中分配n个长度为size的连续存储空间。函数的返回值为分配域的起始地址;如果分配不成功,则返回

39、值为0。,例如:,int *p;,p=(int *)calloc(3,8);,分配3个8字节的的连续存储空间,并将其起始地址赋给整型指针p。,10.6 链表,61,(3) 函数free,函数原型:,void free(void *ptr);,函数功能:,释放由指针变量ptr为所指示的内存区域。其中,ptr一个指针变量,指向最近一次调用函数malloc或calloc时所分配的连续存储空间的首地址。通过函数free将已分配的内存区域交还系统,使系统可以重新对其进行分配。,例如:,int *p;,p=(long *)malloc(8);,. free(p);,10.6 链表,62,链表的定义,str

40、uct Link int data; struct Link *next; ;,链表(Linked table):线性表的链式存储结构 n个节点链接成一个链表(因为只包含一个指针域,故又称线性链表或单向链表),数据域:存储数据元素信息,指针域:存储直接后继的节点信息,63,建立链表 (1),建立链表就是指从无到有地建立起一个链表,即一个个地输入各结点数据,并建立起前后相链的关系。 【例9.2】编写一个建立单向链表的函数,存放学生数据。 函数create可编写如下: #include “stdio.h“ #include “stdlib.h“ #define NULL 0 /*令NULL为0,用

41、它表示空地址*/ #define LEN sizeof (struct stu)/*LEN代表struct stu结构体类型数据的长度*/ struct stu int num; float score; struct stu *next; ;,64,建立链表 (2上接1),int n; struct stu *creat() /*此函数带回一个指向链表头的指针*/ struct stu *head,*p1,*p2; n=0; /*n为结点的个数*/ p1=p2=(struct stu *)malloc(LEN); /*开辟一个新单元*/ scanf(“%d%f“,65,建立链表(3上接2),

42、p2=p1; p1=( struct stu *)malloc(LEN); scanf(“%d%f“, 下图表示出creat函数的执行过程。,66,67,68,69,70,71,72,73,74,75,链表的输出,将链表中各结点的数据依次输出,首先要知道链表头元素的地址。设一个指针变量p,指向第一个结点,待输出p所指的结点数据后,使p后移一个结点再输出,直至链表的尾结点止。程序执行过程可见下图所示。 【例9.3】写一个函数,输出链表中所有结点。 void print(struct stu *head) /*由实参即将已有的链表的头指针传给被调函数*/ struct stu *p; printf

43、(“n Now ,these %d records are:n“,n); p=head; /* p指向头结点*/ while(p!=NULL) printf(“%d %.2fn“,p-num,p-score); /*输出所指结点的数据域*/ p=p-next; /*使p指向下一个结点*/ ,76,77,链表的删除操作,从一个链表中删除一个结点,并不是真正从内存中把它抹去,而是把它从链表中分离开来,可以通过改变链表的链接关系完成。分析:设两个指针变量p1和p2,先使p1指向第一个结点。删除一个结点有两种情况:一种情况是要删除结点是第一个结点,此时只需使head指向第二个结点即可,即head=p1

44、-next,其过程如下图所示。另一种情况是被删除结点不是第一个结点,可使被删除结点的前一结点指向被删结点的后一结点,即p2-next=p1-next,其过程如后图所示。 【例9.4】写一个函数,删除链表中的指定结点,以指定的学号作为删除结点的标志。函数dele编写如下: struct stu * dele(struct stu *head, int num) struct stu *p1,*p2;,78,链表的删除操作,if(head=NULL) /*如为空表, 输出提示信息*/ printf(“nempty list!n“); return NULL; p1=head; while (p1-

45、num!=num /*不是第一个结点,使要删除结点从链表中脱离*/,79,链表的删除操作,n=n-1; free(p1); else printf(“The node not been foud!n“); return head; /*返回head值*/ ,80,81,82,83,84,链表的插入操作,在一个链表的指定位置插入结点,首先要求链表本身必须是已按某种规律排好序的。按照排序的规律确定好新结点在链表中的位置,并将其连入链表中即可。分析:设被插入结点的指针为p0,p1指向第一个结点。可在四种不同情况下插入:第一种情况是原链表是空链表,只需使head指向被插入结点即可,见下图a。第二种情况

46、是被插入结点值最小,则应插入到第一个结点之前。这种情况下使head指向被插入结点,被插入结点的指针域指向原来的第一个结点即可,即用p0-next=p1;head=p0;完成,见图 (b)。第三种情况是在其它位置插入,见图 (c)。这种情况下,使插入位置的前一结点的指针域指向被插入结点,使被插入结点的指针域指向插入位置的后一结点,即用p0-next=p1;p2-next=p0;来完成。,85,链表的插入操作,最后一种情况是在表末插入,见图 (d)。这种情况下使原链表中的末结点指针域指向被插入结点,被插入结点指针域置为NULL。即用p1-next=p0p0-next=NULL;来完成。 【例9.5

47、】写一个函数,在学生数据链表中,按学号顺序插入一个结点。 struct stu * insert(struct stu *head, struct stu *stud) struct stu *p0,*p1,*p2; p1=head; /*指向第一个结点*/ p0=stud; /*指向要插入的结点*/ if(head=NULL) /*空表插入*/ head=p0; p0-next=NULL; /*将p0指向的结点作第一个结点*/,86,链表的插入操作,else while(p0-nump1-num) ,87,链表的插入操作,else p1-next=p0; p0-next=NULL; /*在表

48、末插入*/ n=n+1; return (head); ,88,图 (a),89,图 (b),90,图 (c),91,图 (d),92,【例9.6】,【例9.6】将以上建立链表、输出链表、删除结点、插入结点的函数组织在一个程序中,用main函数作主调函数。程序名为linkdemo.cpp。 main函数内容如下:(其位置在以上各函数之后) #include “stdio.h“ int main( ) struct stu * head,stud; int num; printf(“input records:n “); head=creat(); /*调用creat函数建立链表并把头指针返回给head*/ print(head); /*调用print函数输出链表*/ printf(“Input the deleted number: “); scanf(“%d”, /*调用dele函数删除一个结点*/,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报