收藏 分享(赏)

计算机语言与程序设计 (11).ppt

上传人:wspkg9802 文档编号:8241153 上传时间:2019-06-16 格式:PPT 页数:45 大小:215KB
下载 相关 举报
计算机语言与程序设计 (11).ppt_第1页
第1页 / 共45页
计算机语言与程序设计 (11).ppt_第2页
第2页 / 共45页
计算机语言与程序设计 (11).ppt_第3页
第3页 / 共45页
计算机语言与程序设计 (11).ppt_第4页
第4页 / 共45页
计算机语言与程序设计 (11).ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、1,第十一讲 结构,2,例:跳马。依下图将每一步跳马之后的位置(x,y)放到一个“结点”里,再用“链子穿起来”,形成一条链,相邻两结点间用一个指针将两者连到一起。,结构的概念与应用,3,依上图有7个结点,为了表示这种既有数据又有指针的情况,引入结构这种数据类型。,4,结构是一种构造类型的数据类型。结构是数目固定、类型不同的若干变量的有序集合。结构与数组的区别在于结构内允许有不同类型的数据。结构的定义,格式如下:,struct ,5,例如跳马棋局可如下定义,struct TM int x,y; / 结构TM的成员,x,y为整数型struct TM *next / 结构TM的成员,属TM型 ,下面

2、的表是马的跳步方案,从左下角跳到右上角,6,NULL为空地址 下面是形成链表的一个参考程序(分三页),&n1,head,7,/ 结构1.c #include / 预编译命令 #define null 0 / 定义空指针常量 struct TM / 定义结构TM int x,y; / 整型变量x,ystruct TM *next; / 指向TM结构的指针 ;void main() / 主函数 / 主函数开始int i; / 声明整型变量/ 声明TM结构n1n7,结构指针head,pstruct TM n1,n2,n3,n4,n5,n6,n7,*head,*p;,8,/ 分别对TM结构n1n7中的

3、x,y赋值n1.x=0;n1.y=0;n2.x=1;n2.y=2;n3.x=2;n3.y=4;n4.x=4;n4.y=4;n5.x=6;n5.y=4;n6.x=7;n6.y=2;n7.x=8;n7.y=4;/ head赋值为n1,即head指向n1head=,9,p=head; / p赋值为head,即p指向head所指的内容i=1; / i赋值为1do / 直到型循环 / 循环体开始/ 输出结点信息printf(“结点%d: x=%d, y=%dn“,i,p-x,p-y);p=p-next; / p指向下一个结点i=i+1; / 计数加1 while(p!=null); / 未到达链表尾部,

4、则继续循环 / 主函数结束,10,用结构数组,利用键盘输入结点中的数据。 重点看scanf(“%d”, 结构数组,数组中的元素为结构类型的数据,如n8,/ 结构2.c #include / 预编译命令 #define null 0 / 定义空指针常量 struct TM / 定义TM结构 int x,y; / 整型变量x,ystruct TM *next; / 指向TM结构的指针 ;,11,void main() / 主函数 / 主函数开始int i,a,b; / 声明整型变量i,a,b/ 声明TM型结构数组n8,TM结构指针head,pstruct TM n8,*head,*p;for(i=

5、1;i=7;i=i+1) / 循环 / 循环体开始printf(“输入n%d的xn“,i); / 提示输入第i个结构的x值scanf(“%d“, / 将b的值赋给结构ni的元素y / 循环体结束,12,head= / 未到链表尾部,则继续循环 / 主函数结束,13,下面的程序与上面的程序区别仅在scanf(“%d”,/ 结构3.c #include / 预编译命令 #define null 0 / 定义空指针常量 struct TM / 定义TM结构 int x,y; / 整型变量x,ystruct TM *next; / 指向TM结构的指针 ;,14,void main() / 主函数 /

6、主函数开始int i,a,b; / 声明整型变量i,a,b/ 声明TM型结构数组n8,TM结构指针head,pstruct TM n8,*head,*p;for(i=1;i=7;i=i+1) / 循环 / 循环体开始printf(“输入n%d的xn“,i); / 提示输入第i个结构的x值scanf(“%d“, / 输入ni.y / 循环体结束,15,head= / 未到达链表尾部,则继续循环 / 主函数结束,16,任务: 我们要作一张登记表,登记排队求职信息,包括:姓名、年龄、性别、电话四个参数。希望便于管理,即可以插入和删除,这时可用队列,采用结构类型变量。struct STchar nam

7、e20; / 字符串,姓名int age; / 整数,年龄char sex; / 字符,性别long num; / 电话号码struct ST *next; / ST结构的指针; / 注意,这里必须有分号声明结构指针变量用下列形式struct ST *head, *p, *q;上面的 head, p, q 为结构指针。,17,结构的成员可以是指针,意味着这种结构指针可以指向结构变量。 结构变量和指向结构变量的指针可以作为函数的参数与返回值。用结构变量作函数返回值的函数称之为结构函数。struct ST *create(void)就是结构函数,为了了解结构变量成员的地址情况,我们给出了程序“结构

8、5.c”,在这个程序中我们重点看1、#include 这是预编译命令,为了分配结构变量的内存地址用的。 2、#define null 0 这是定义空指针变量常量,null 代表 0。 3、#define LEN sizeof(struct ST) 定义常量LEN,表示结构ST中的变量的全部单元的长度,分配内存空间时需要知道这个长度信息。,18,4、结构ST的定义 5、函数create的定义 6、给结构指针p分配内存空间。 p=(struct ST *) malloc (LEN); 7、查看指针p所在的地址 printf(“指针p所在的地址,19,/ 结构5.c(分四页) #include /

9、预编译命令 #include / 预编译命令,内存空间分配#define null 0 / 定义空指针常量 #define LEN sizeof(struct ST) / 定义常量LEN,/ 表示结构ST的长度 struct ST / 结构ST定义 char name20; / 字符串,表示名字int age; / 整数类型,表示年龄char sex; / 字符类型,表示性别long num; / 长整型,表示电话号码struct ST *next; / ST结构指针 ;struct ST *head,*p,*q; / 声明,结构指针变量head,p,q,20,void create(void

10、)/ 定义一个名为create的函数,无形参和返回值 / 函数体开始int n=0; / 整型变量n,赋初值为0head=null; / ST结构指针head,赋初值为nullp=(struct ST *) malloc(LEN); / 给结构指针p分配内存空间/ 输出指针p所在地址printf(“指针p所在地址 ,21,/ 提示输入第n+1个结点的数据printf(“输入第%d个结点的数据n“,n+1); printf(“依次为name,age,sex,numn“);/ 提示输入姓名数据,并输出其所在地址printf(“输入姓名数据%dn“,n+1); scanf(“%s“,22,print

11、f(“输入电话号码数据%dn“,n+1);/ 输出提示信息/ 从键盘输入电话号码scanf(“%ld“, / 调用函数create(),建立链表 / 主函数结束,23,struct ST * create(void),24,25,/ 结构6.c(分四页) #include / 预编译命令 #include / 内存空间分配#define null 0 / 定义空指针常量 #define LEN sizeof(struct ST) / 定义常量,表示结构长度struct ST / 结构声明 char name20; / 名字,字符串int age; / 年龄,整型数组char sex; / 性别

12、,字符型变量long num; / 电话号码,长整型变量struct ST *next; / ST结构指针 ; struct ST *head; / 声明全局变量head为ST结构指针 void create(void) / 被调用函数,用于建立链表 / 函数体开始struct ST *p,*q; / 声明ST结构指针p,qint n=0; / 整型变量,用于记录输入的人数char tmpStr20; / 字符串,作为临时变量head=null; / 链表头部指针,初始化为空p = null; / 链表当前结构指针,初始化为空q = null; / 链表尾部指针,初始化为空,26,do / 直

13、到型循环,用于循环输入人员信息n=n+1; / 人数加1printf(“输入第%d个结点的数据n“,n);/ 提示信息printf(“输入姓名数据%dn“,n); / 提示输入姓名scanf(“%s“,tmpStr); / 输入姓名信息,并存入临时变量/ 判断输入是否结束,如果为“.“,则结束if (strcmp(tmpStr,“.“)=0) break;p=(struct ST *) malloc(LEN); / 为p分配空间if (p = null) / 判断分配是否成功/ 如果分配出错,则输出出错信息printf(“Insufficient memory availablen“ );br

14、eak; / 退出循环,27,strcpy(*p).name,tmpStr);/ 将名字存入p结构中的name单元printf(“输入年龄数据%dn“,n); / 提示输入年龄scanf(“%d“, / 如果不为空,则链表尾部的next指向空指针 ,28,void print() / 被调用函数,形参为ST结构指针 int k=0; / 整型变量,用于计数struct ST * r; / 声明r为ST结构指针r=head; / r赋值为head,即指向head所指向的内容while(r != null) / 当型循环,链表指针不为空 / 循环体开始k=k+1; / 计数加1printf(“输出

15、排队求职者信息%d:%s,%d,%c,%ldn“,k,r-name,r-age,r-sex,r-num); / 输出人员信息r=r-next; / 循环体结束 / 被调用函数结束void main() / 主函数开始 / 函数体开始create(); / 调用create函数建立链表print(); / 调用print函数,输出链表内容 / 主函数结束,29,字符串处理函数简介,1、strcmp(s1,s2)例printf(“# %dn”,strcmp(“b”,”b”);输出 # 0printf(“#%dn”,strcmp(“b”,”f”);输出 # -1结论: 当s1s2时 strcmp(s

16、1,s2)的值为1 当s1s2时 strcmp(s1,s2)的值为0 当s1s2时 strcmp(s1,s2)的值为-1,30,字符串处理函数简介,2、strncmp(s1,s2,n)类似于strcmp(s1,s2,n),但只比较两个字符串的前n个字符。3、strlen(s)返回s字符串的长度(不包括结束符0) 例:printf(“# %dn”,strlen(“abcdefgh”); 输出 # 84、strcpy(s1,s2) 将s2的内容复制到s1中,返回s1指针。其中s1和s2为指向char的指针。,31,链表插入结点,原则:1、插入操作不应破坏原链接关系2、插入的结点应该在它该在的位置。

17、应该有一个插入位置的查找子过程。,32,head,先看下面一个简单的例子:已有一个如图所示的链表。它是按结点中的整数域从小到大排序的。现在要插入一个结点,该节点中的数为10。,待插入结点,此结点已插入链表,33,分析: 考虑将结点p插入链表head中,分如下三种情况:1、第一种情况,链表还未建成(空链表),待插入结点p实际上是第一个结点。这时必然有head=null。只要让头指针指向p就可以了。语句为,head p,head = p; p-next = null;,2、第二种情况,链表已建成,待插入结点p的数据要比头结点的数据还要小,这时有p-num num 当然p结点要插在head结点前。,

18、34,head,head,p,p-next=head; head=p;,语句为,null,35,3、第三种情况,链表已建成,待插入结点p的数据比头结点的数据大,需要找到正确的插入位置。这时,可以借助两个结构指针r和q,利用循环比较来找到正确位置。然后将结点p插入到链表中正确的位置。参见下面的图示,36,head,p,q,r,说明:这种情况下,p结点已经与链表的第一个结点比较过了,所以从链表的下一个结点开始比较。138,继续比较。,37,head,p,q,r,说明:1312,继续比较。,38,head,p,q,r,null,说明:1315,找到了正确的插入位置,则插入结点p。语句为:,r-nex

19、t = p; p-next = q;,39,/ 结构7.c#include / 预编译命令 #include / 内存空间分配 #define null 0 / 定义空指针常量 #define LEN sizeof(struct numST) / 定义常量,表示结构长度struct numST / 结构声明 int num; / 整型数struct numST *next; / numST结构指针 ;,参考程序,40,/ 被调用函数insert(),两个形参分别表示链表和待插入的结点 void insert (struct numST *phead, struct numST *p) / 函数

20、体开始struct numST *q,*r; / 定义结构指针q,rif (*phead)=null) / 第一种情况,链表为空*phead = p; / 链表头指向preturn; / 完成插入操作,返回 else / 链表不为空/ 第二种情况,p结点num值小于链表头结点的num值if ( (*phead)-num p-num) / 将p结点插到链表头部p-next = *phead;/ 将p的next指针指向链表头(*phead)*phead = p; / 将链表头赋值为preturn; / 返回,41,/ 第三种情况,循环查找正确位置r = *phead; / r赋值为链表头q = (

21、*phead)-next; / q赋值为链表的下一个结点while (q!=null) / 利用循环查找正确位置/ 判断当前结点num是否小于p结点的numif (q-num num)r = q; / r赋值为q,即指向q所指的结点q = q-next;/ q指向链表中相邻的下一个结点else / 找到了正确的位置break; / 退出循环/ 将p结点插入正确的位置r-next = p;p-next = q; ,42,/ 被调用函数,形参为ST结构指针,用于输出链表内容 void print(struct numST *head) int k=0; / 整型变量,用于计数struct numS

22、T * r; / 声明r为ST结构指针r=head; / r赋值为head,即指向链表头while(r != null) / 当型循环,链表指针不为空则继续 / 循环体开始k=k+1; / 计数加1printf(“%d %dn“,k,r-num);r=r-next; / 取链表中相邻的下一个结点 / 循环体结束 ,43,void main() / 主函数开始 / 函数体开始struct numST *head, *p; / ST型结构指针head = null;/ 分配两个ST结构的内存空间,用于构造链表head = (struct numST *) malloc(LEN);head-next

23、 = (struct numST *) malloc(LEN);/ 为链表中的两个结点中的num赋值为5和10head-num = 5;head-next-num = 10;head-next-next = null; / 链表尾赋值为空/ 构造一个结点p,用于插入链表p = (struct numST *) malloc(LEN);p-num = 8;p-next = null;insert( / 调用print函数,输出链表内容 / 主函数结束,44,说明:函数insert()的第一个形参为struct numST*类型,即“指针的指针”。调用时送入的实参是链表头指针的地址,即程序中的&head。这样对head的修改才会在函数返回后仍有效。如果形参为struct numST*,则传入的为指针,当函数返回后,head无法改变。,45,结 束,

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

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

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


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

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

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