- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 动态数组与链表 内存分配方式 有三种: (1)从静态存储区域分配。 (2)在栈上创建。 (3) 从堆上分配,亦称动态内存分配。 引入问题 1. 求某班级(30人)中所有学生的成绩平均分。 动态存储分配函数 malloc函数(memory allocation) void *malloc(int n); calloc函数(count allocation) void *calloc(int count,int n); free函数 void free(void *ptr); realloc函数(reallocation) void *realloc(void *p,int n); free函数 void free(void *ptr); realloc函数 void *realloc(void *p,int n); 链表的几个基本概念 链表的基本操作 (1)创建链表: 从无到有地建立起一个链表,即往空链表中依次插入若干结点 (2)检索链表: 按给定的检索条件,查找某个结点。 (3)插入操作: 在结点ki-1与ki之间插入一个新的结点k’,使链表的节点数增1, (4)删除操作: 删除结点ki,使链表的节点数减1, (5)打印输出 1) 创建链表 1)定义三个指针变量:头指针(head)、指向尾结点的指针(p2)、指向新开辟结点的指针(p1) 2)结束输入结点的两个方式: 1)创建的结点数已知 2)创建的节点数事先未知,但通过 输入一个不存在的数作为结束状态。 3)模块函数要返回指向结点的指针 struct node* createlist(); 2)打印输出链表 模块函数中的形参是指向结点的指针,无需返回值 void outputlist(struct node* ); 3)检索链表 模块函数中的形参是指向结点的指针。 void retrieve(struct node*,int x,int y ); 4) 对链表的插入操作 插入结点:通常是在插入一个新的结点后,仍然保持原有顺序。 实现关键: 寻找插入位置 插入位置共分四种情况(假设原链表从小到大为例): 1、要插入的链表是个空链表 2、要插入的结点最小 3、要插入的结点最大 4、要插入的结在中间 操 作 分 析 需要几个临时指针: P0: 指向待插的结点;初始化: p0=(struct node* )malloc(sizeof(struct node)); P1: 在P1指向的结点之前插入新结点;初始化: p1=head; P2: 在P2指向的结点之后插入新结点; 5) 对链表的删除操作 删除结点原则: 只是从链表中分离开要删除的结点,撤消原来的链接关系,并释放该结点的空间。 5) 对链表的删除操作 5) 对链表的删除操作 考虑两种情况: 1、要删的结点是头指针所指的结点(第一个结点); 2、删除的不是第一个结点。 作业 课后习题 选择题和填空题 下周二上机 上传到系统。 在表尾插入 在头结点 之前插入 在中间插入 空表 p0-num=p1-num A 1249 B 1356 D 1021 C 1475 1356 1475 1021 0 NULL 1249 p1 p2 p2-next = p1-next A 1249 B 1356 D 1021 C 1475 1475 1475 1021 0 NULL 1249 p1 p2 free(p1) 具体操作: 需要定义两个指针变量: P1: 判断指向的结点是不是要删除的结点 P2: 始终指向P1的前面一个结点; struct node *delete(struct node *head, int x) { struct node *p1,*p2; p1=head; while(x!=p1-datap1-next!=NULL) /* 查找要删除的结点 */ { p2=p1;p1=p1-next;} if(x==p1-data) /* 找到了要删除的结点,准备删除 */ { if(p1==head) /*要删除的结点是头结点 */ head=p1-next; /* 将第二个结点的地址赋给head */ else /* 要删除的结点是中间结点 */
文档评论(0)