- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 11.7 用指针处理链表 1. 链表概述 1) 动态数据结构概念 数组和结构体是定长数据结构 链表是连成一行的数据项集合,每一个数据 项(元素)称为结点,可以在链表中的任意位置进 行结点插入或删除操作,使链表数据项的个数随 之增加或减少。 2) 链表的构成 单向链表图示: 89.5 0701 90 0702 85 0703 head 其中: ? head是指针变量,存放链表的头指针1048; ?各结点是相同的结构体类型,该类型有三个成员; ?各结点应包含一个指针成员存放下一结点的地址; ?各结点存储有可能不连续,但各结点逻辑上连续。 1048 1370 2800 1370 2800 NULL 1048 头结点 结点 尾结点 头指针 3) 结点的构成 上图每个结点具有如下结构体类型: struct student { long num; float score; structer student *next; }; 其中: ?成员num、score用于存放一个结点的具体数据; ?成员next是指针类型,用于存放下一结点地址, 最后一个结点的next 成员存放空指针NULL; ?成员next是指向与自身同一类型的结构,这种结 构称为自引用结构。(只有指针成员可自引用) 4) 动态内存分配和释放 建立和维护动态数据结构需要实现动态内存 分配;如在链表中插入节点需要先申请一段存储 区域,而删除一个节点需要释放该节点原先占用 的存储区域,这可由标准函数实现。 内存分配函数原形: void *malloc(unsigned size); 功能:在内存申请一块长度为size个字节的空间; 若申请成功,该函数返回指向存储块起始 地址的指针,该指针类型为void *;否则返 回空指针(NULL)。 内存释放函数原形:void free(void *p); 功能:释放p所指向的内存块。 5) 采用链表的意义 ?与定长数据结构数组相比,链表能更好地利用内存,按需分配和释放存储空间。 ?在链表中插入或删除一个结点,只需改变某结点“链节”成员的指向,而不需要移动其它结点,相对数组元素的插入和删除效率高。 2. 单链表的建立和输出 1) 定义链表的结点类型; 2) 定义与结点同类型的链表头指针变量head并赋值NULL,表示链表在建立之前是空的; 3) 定义与结点同类型的工作指针变量p1、p2。 p1指向新创建的结点 p2指向尾结点 p1,p2是不断变化的 1) 开辟第一个结点的存储区域,使head、p1、p2 指向第一个结点,并输入第一个结点数据; 89.5 2101 head p1 p2 p1 90 2304 1048 2) 开辟下一结点的存储区域,使p1指向新结点、输入新结点数据,并将上一个结点的next成员指向新结点; 动态建立链表的步骤: 1370 1370 p1 p2 p2 p2 85 2918 NULL 1012 p1 p1 p2 p2 1012 3) 将p2也指向新结点; 4) 重复第2、3步,建立并链接多个结点直至所需长度,将末尾结点的next成员赋值0。 0 0 2000 #include stdio.h /*包含NULL的定义*/ struct student /*结构体类型定义*/ { long num; float score; struct student *next; /*自引用结构体指针*/ }; struct student * creat(void )/*返回新建立的链表头指针*/ { struct student *head, *p1, *p2; /*p2指向尾结点*/ int len; len=sizeof(struct student); /*计算出结构体的长度*/ head=NULL; p1=p2=(struct student *)malloc(len); scanf(“%ld%f”,p1-num,p1-score); while(p1-num!=0) { if(head==NULL) head=p1; else p2-next=p1; p2=p1; /*p1成为新
文档评论(0)