[自然科学]链表和位段.ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[自然科学]链表和位段

动态数据结构 下面的结构什么意思? struct temp { int data; struct temp pt; }; TC下的错误提示: Undefined structure ‘temp’ Structure size too large VC下的错误提示: ‘pt’ uses undefined struct ‘temp’ 虽然在声明结构体类型时不能包含自我,但却可以包含指向本结构体类型的指针域,因为指针变量存放的数据是地址,系统为指针变量分配的内存字节数是固定的,即存放地址所需的内存字节数。包含指向本结构体类型的指针域的结构体类型声明方式如下: 链表(Linked table) struct Link { int data; struct Link *next; } 为什么使用动态数据 递归结构体 链表的特点及操作原理 链表的特点及操作原理 动态链表的建立 链表的删除操作 链表的删除操作——前端删除 链表的删除操作——后端删除 链表的删除操作——中间删除 链表的插入操作 链表的前端插入 链表的后端插入 链表的中间插入 动态链表程序举例----1 解法1 解法2 位段结构 为什么使用位段结构 位字段 想表达人的姓名、出生年、月、日,都定义什么类型的成员变量? struct person { char name[12]; int year; char month; char day; }; 这样有很多的空间浪费,比如month只可能取值1-12,4bits足够 位段结构的定义 位字段 struct person { char name[12]; unsigned int year : 12; unsigned int month : 4; unsigned int day : 5; }; 调整成员顺序可以让结构更紧凑 每个位段都可以当作一个无符号整型数使用 表达范围当然受限,而且当然不能取地址 位段结构的说明 位段结构的说明 位段结构的说明 * 问题的提出 链表的定义 链表的特点及操作原理 动态链表的建立 链表的删除操作 *链表的插入操作 *程序举例1、2 在结构体类型的定义中,如果包含了本结构体类型的成员,那么由于在本结构体类型尚未定义结束时,本结构体类型所占的内存字节数尚无法确定,因此系统将无法为这样的结构体类型分配内存。 struct temp { int data; struct temp *pt; }; 这是链表数据结构的编程基础。 data next head data next data next data NULL 图8-9 链表原理图  使用静态数据结构,当数据较少时, 浪费大量空间。  动态数据使用的是链表结构,当有一 个数据时,就申请一个结点,链到链表 中去。 各域值 各域值 null null …… 各域值 null 定义 在定义结构体类型时,可包括指针 域,当指针域基类型就是结构体本 身(包括一个指向结构体本身类型的 指针域),则称递归结构体。 举例 struct student { int num; char name[20], sex; struct student *link; }; 递归结构体可以构成链表动态结构, 链表的每一个节点都是递归结构体。 1.在链表中易于插入一个新节点。 各域值 各域值 各域值 null head 各域值 ╳ 2.在链表中易于删除一个节点。 各域值 各域值 各域值 null head ╳ struct Link *DelNode(struct Link *head, int nodeData) { struct Link *p=head,*pr=head; if(head==NULL)/*链表为空,没有节点,无法删除节点*/ { printf(no linked table!\n); return(head); } /*若没找到节点nodeData且未到表尾,则继续找*/ while(nodeData!=p-data p-next!=NULL) { pr=p; p=p-next; } if(nodeData==p-data)/*若找到节点nodeData,则删除该节点*/ { if(p==head)/*若待删除节点为首节点,则让head指向第2个节点*/ { head=p-

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档