- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
11.7 用指针处理链表 链表是程序设计中一种重要的动态数据结构,它是动态地进行存储分配的一种结构。 链表中结点的定义 链表是由结点构成的, 关键是定义结点; 链表的结点定义打破了先定义再使用的限制,即可以用自己定义自己; 递归函数的定义也违反了先定义再使用; 这是C语言程序设计上的两大特例 链表的基本操作 对链表的基本操作有: (1)创建链表是指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。 (2)检索操作是指,按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。 (3)插入操作是指,在结点ki-1与ki之间插入一个新的结点k’,使线性表的长度增1,且ki-1与ki的逻辑关系发生如下变化: 插入前,ki-1是ki的前驱,ki是ki-1的后继;插入后,新插入的结点k’成为ki-1的后继、ki的前驱. (4)删除操作是指,删除结点ki,使线性表的长度减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变化: 删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1成为ki+1的前驱,ki+1成为ki-1的后继. (5)打印输出 一个指针类型的成员既可指向其它类型的结构体数据,也可以指向自己所在的结构体类型的数据 11.7.2 简单链表 #define NULL 0 struct student { long num; float score; struct student *next; }; main() { struct student a, b, c, *head, *p; a.num=99101; a.score=89.5; b. num=99103; b.score=90; c.num=99107 ; c.score=85; head=a; a.next=b; b.next=c; c.next=NULL; p=head; do { printf(%ld %5.1f\n,p-num,p-score); p=p-next; }while(p!=NULL); } 11.7.3 处理动态链表所需的函数 C 语言使用系统函数动态开辟和释放存储单元 函数原形:void *calloc(unsigned n,unsigned size); 作用:在内存动态区中分配 n个 长度为size的连续空间。 函数返回值:指向分配域起始地址的指针 执行失败:返回null 主要用途:为一维数组开辟动态存储空间。n 为数组元素个数,每个元素长度为size 3. free 函数 函数原形: void free(void *p); 作用:释放由 p 指向的内存区。 P:是最近一次调用 calloc 或 malloc 函数时返回的值。 free 函数无返回值 动态分配的存储单元在用完后一定要释放,否则内存会因申请空间过多引起资源不足而出现故障。 结点的动态分配 ANSI C 的三个函数(头文件 malloc.h) void *malloc(unsigned int size) void *calloc(unsigned n, unsigned size) void free(void *p) C++ 的两个函数 new 类型(初值) delete [ ] 指针变量 /*[ ] 表示释放数组,可有可无)*/ 使用 new 的优点: 可以通过对象的大小直接分配,而不管对象的具体长度是多少(p340 例14.10) 11.7.4 建立动态链表 基本方法: 三个结点(头结点head、尾结点 NULL 和待插入结点 P) 第一步:定义头结点head、尾结点 p2 和待插入结点p1,待插入的结点数据部分初始化; 第二步:该结点被头结点、尾结点同时指向。P1=p2=(struct student*)malloc(LEN);头指针部分为空,head=NULL; 第三步:重复申请待插入结点空间,对该结点的数据部分赋值(或输入值),将该结点插入在最前面,或者最后面(书上在尾部插入). P2-next=P1; P2=P1; 最后:P2-next=NULL; 11.7.4 建立动态链表 图11.14 图11.14 图11.15 图11.16 例11.8 建立一个有3名学生数据的单向动态链表 #define NULL 0 #define LEN sizeof(struct student) struct student {long num; float score; struct stu
文档评论(0)