动态c语言教程,C语言设计实例教程动态组织数据.ppt

《C语言设计实例教程动态组织数据.ppt》由会员分享,可在线阅读,更多相关《C语言设计实例教程动态组织数据.ppt(58页珍藏版)》请在人人文库网上搜索。

1、1,云南师范大学 陈娟,C 程序设计实例教程,第七章 动态组织数据,2020/9/18,2,数组:必须事先定义固定长度,静态分配存储空间。 链表:无需事先知道数据的个数,可以动态分配存储空间,插入删除简便,学习的意义,要想改变数组长度可以吗? 怎么解决,2020/9/18,3,主要内容,2020/9/18,4,7.1 建立链表的过程,看杂志时碰到有篇文章3页不够放,4页又空着太多。怎么办?,编辑往往先给这篇文章(称做a)排3页(且称这3页为a.part1),接着排其他文章,等什么时候有空的页面还够安排a剩下的部分(称它为a.part2)时,就把a.part2排进去。,2020/9/18,5,7。

2、.1 建立链表的过程,这样文章a在排版时被分成了不连续的两块,读者怎样找到第二部分呢? 编辑在a.part1的末尾加进了一个线索“下接XX页”,读者顺着线索很容易就找到了a.part2。 所以a.part1放的不仅有文章本身,还有指示下一部分在哪的线索。通过这个线索,a.part1和a.part2就联系在一起了。,2020/9/18,6,那a.part2的后面还有没有另外一部分呢? 杂志的每篇文章的最后都有一个特殊的符号,看到这个符号就知道这已经是最后了。 厚厚的一本书中,又怎样找到文章a呢?翻翻目录就知道了,那里有文章a所在页码的信息。,2020/9/18,7,下接xx页,完,a.part1。

3、和a.part2组成了由两个结点构成的链表: 目录的页码指向链表a的第一个结点,此页码信息称为头指针,通过它能找到整个链表; a.part1后面的线索就是指针域,指示下一个逻辑块在哪; a.part2的指针域指示后面不再有结点,称为尾结点。,2020/9/18,8,链表的基本概念, 什么是链表 链表的存储结构,2020/9/18,9,什么是链表?,链表 一种重要且常用的数据结构,可动态地组织数据。 链表不要求两个元素在物理上相邻,只要在元素结构中加一个指针项,用来指向下一个元素的地址便可。,链表的基本概念,2020/9/18,10,链表的基本概念,什么是链表 链表的存储结构,2020/9/18。

4、,11,2.3.1 链表的基本概念,链表的存储结构,链表中的每个数据元素称为结点 每个结点至少包括2个域: 数据域存放数据元素的值; 指针域存放直接后继的地址,即指向后继结点 链表正是通过每个结点的指针域将n个数据元素按其逻辑顺序链接在一起的 链表中数据元素的逻辑顺序与其物理存储顺序不一定相同;,2020/9/18,12,head: 头指针,类型为指向结构体的指针,存放链表第一个元素的地址; 结点:链表中的每一个元素称为一个结点; NULL:表示空指针,经常用 来表示; 表尾:链表的最后一个结点,不指向任何元素; 链表中各个元素的地址并不连续,head,2160,0012,4152,1430,。

5、链 表,2020/9/18,13,利用结构体类型来实现链表,struct student int num; float score; struct student *next; ;,2020/9/18,14,准备工作 malloc ( int size) 在内存中分配长度为size的连续空间 p = (struct student*)malloc(sizeof(struct student),建立、输出 动态链表,malloc函数的返回值是一个指向分配空间的起始地址的指针。 如果分配不成功,malloc函数返回NULL if ( !(p = (BiTNode *)malloc(sizeof(B。

6、iTNode) exit(OVERFLOW);,2020/9/18,15,准备工作 free (void *p) 释放p指向的内存区,动态链表 在执行的过程中从无到有建立一个链表,即一个个开辟结点和输入各结点数据,并建立前后链的关系,静态链表 所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,建立、输出 动态链表,2020/9/18,16,例. 建立有1个学生数据单链表,typedef struct student int num; float score; student *next; student; student * head, *p; head = NULL; p=(st。

7、udent*)malloc(sizeof(student); scanf(“%d,%f”,head,p,p1,101 95.5,102 87,2020/9/18,17,链表创建就像穿一条珠链:一根线头能将整串珠链提起,称头指针head。 开始时没有任何珠子,只有一根空线头head; 第一颗珠子(头结点)接到head上,且其后有一根线头(指针域next)可接下一颗珠子; 每次把新加入的珠子pNew(结点)接到最后一颗珠子q后的线头上。 指针q指向每次最新接入的珠子,新珠子接到q的线头上:q-next=pNew。 当不需接入珠子时,把最后一颗珠子后的线头q-next打上结:q-next=NULL。。

8、,2020/9/18,18,2020/9/18,19,循环体中每插入一个结点需要做以下操作:,新结点pNew插入链表时有两种情况:若链表为空,则放到head后;否则,插入到尾结点q之后。,2020/9/18,20,与数组不同,链表中每个元素的存储空间都需在使用前在程序中显式地分配,并用指针指向所分配空间的首地址,用完以后再显式地释放每个元素占用的空间. 需要动态地分配和释放内存空间。,malloc ( int size),free (void *p),在Turbo C中的头文件是 stdlib.h ,在VC中是 malloc.h文件。,2020/9/18,21,7.2 链表结点的查找,由于单链。

9、表中结点只能通过前一个结点的指针域找到,得到结点的前驱很重要。,2020/9/18,22,图7.9 通过指针p遍历链表各结点,(a) p=head,从头开始遍历链表,(b) p=p-next,p指向下一个结点,(c) p=NULL时遍历完链表,2020/9/18,23,单链表只能从链表头head开始访问链表的各个结点,且只有前一个结点的指针域才能找到后一个结点。 查找第i个结点:每访问过一个结点就让p指向下一个结点p=p-next,在访问完最后一个结点之前,沿着指针域的指向顺序遍历,直到找到第i个结点为止。,2020/9/18,24,问题:输入数据的同时,将数据插入到链表中,并且保持链表中数据。

10、有序 分析: 第一个:接到head后面 第二个: 查找合适的插入位置 插入,并保持链表的前后链 第三个 第N个 ,7.3 链表结点的插入,2020/9/18,25,A,C,E,head,B,q,p,q-next = s;,s-next = p;,s,s-next = q-next ;,q-next = s;,链表的插入,2020/9/18,26,printf(“请输入待插入字符n); scanf(%c,s 插入到p 和q之间,链表的插入,2020/9/18,27,考虑插入结点时的几种特殊情况 插入后为第一个结点 插入后为最后一个结点,链表的插入,2020/9/18,28,7.4 链表结点的删除。

11、,在数组操作中,无论是插入元素还是删除元素都有大量的数据需要移动 链表中删除链表结点只要对个别结点的指针做一些调整即可。 删除结点时要保证不破坏链表原来的连接关系,并且先要找到结点的前驱。,2020/9/18,29,链表的删除,从动态链表中删去一个结点,只要撤销原来的链接关系, 把它从链表中分离开来即可,2020/9/18,30,s,p,pre,NULL,head,图 链表结点的删除,删除结点的语句为: pre-next=s; free(p); ; 链表结点删除后,用free()释放该结点占用的内存空间。,或pre-next=p -next,2020/9/18,31,101,102,110,h。

12、ead,q,p,103,101,103,110,head,q,p,104,例 输入104表示要求删除学号为104的结点,q-next=p-next;,2020/9/18,32,printf(请输入想删除的字符n); scanf(%c,例. 输入104表示要求删除学号为104的结点,未找到结点 删除的是第一个结点 删除的是中间结点,、,P = NULL p走到表尾 P-data=ch 找到要删除的结点,2020/9/18,33,7.5 循环链表,【例7-9】 猴子选大王。 给一群猴子都做了编号,编号是1,2,3 .n ,这群猴子(n个)按照1n的顺序围坐一圈,从第1开始数,每数到第m个,该猴子就。

13、要离开此圈,依次下来,直到圈中只剩一只猴子,即为大王。 【分析】 以n=8,m=3为例,猴子选大王的过程:,2020/9/18,34,2020/9/18,35,2020/9/18,36,2020/9/18,37,2020/9/18,38,2020/9/18,39,2020/9/18,40,2020/9/18,41,2020/9/18,42,2020/9/18,43,2020/9/18,44,2020/9/18,45,2020/9/18,46,2020/9/18,47,2020/9/18,48,2020/9/18,49,2020/9/18,50,2020/9/18,51,2020/9/18,52。

14、,2020/9/18,53,2020/9/18,54,2020/9/18,55,2020/9/18,56,猴子选大王的过程中,需要将其他的n-1个猴子从圈中删除。采用单链表存储每个猴子数据。 为了便于循环报数,让最后一只猴子挨着第一只坐,即最后一个结点的指针域指向头结点:q-next=head,形成了循环链表。 猴子选大王的过程就是循环链表的结点不断被删除的过程。结点删除后还是循环链表,只是缩小了。当圈中只剩下一个结点:pre-next=pre时,pre就是要找的猴王。,2020/9/18,57,单循环链表,最后一个结点的指针域的指针又指回第一个结点的链表,怎么样判断链表为空?,if ( head-next = head ),循环链表的操作和单链表基本一致,差别仅在于算法中的循环条件不是p或者p-next是否为空,而是p或者p-next是否等于头指针,2020/9/18,58,(a) 从1号开始报数,(b) 猴子p出圈:pre-next=p-next,(c) pre-next=pre, pre是猴王,图 循环链表模拟猴子选大王,pre,p,pre,p。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值