《《高级语言程序设计教学课件》第11章.ppt》由会员分享,可在线阅读,更多相关《《高级语言程序设计教学课件》第11章.ppt(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第第11章章 指针高级应用指针高级应用2 动态内存分配动态内存分配n实现按需分配实现按需分配。根据程序的实际需要进行内存的。根据程序的实际需要进行内存的分配和释放。以前的都是按计划分配(如数组必分配和释放。以前的都是按计划分配(如数组必须指定长度)须指定长度)n动态内存分配相关函数(动态内存分配相关函数(stdlib.h中)中)malloc(size):):分配分配size个字节的存储空间个字节的存储空间 free(p):释放释放指针指针p指向的之前已分配的空间指向的之前已分配的空间3动态分配函数动态分配函数nmalloc函数函数void *malloc(unsigned int size)
2、;void *malloc(unsigned int size);作用:在内存的动态存储区中分配一个长度为作用:在内存的动态存储区中分配一个长度为 size的连续空间的连续空间返回值:成功,返回指向分配域起始地址的指针;返回值:成功,返回指向分配域起始地址的指针;否则,返回空指针否则,返回空指针(NULL)例如,由用户从键盘输入来确定一个数组的长度。例如,由用户从键盘输入来确定一个数组的长度。int n,*p;int n,*p;printfprintf(”请输入数组的长度请输入数组的长度”);”);scanf(“%d”,&n);scanf(“%d”,&n);p=(int*)malloc(n*4
3、);p=(int*)malloc(n*4);if(p=NULL)if(p=NULL)printf printf(”分配失败分配失败”);”);elseelse printf printf(”分配成功分配成功”);”);4n nfree函数函数void free(void*p);void free(void*p);作用:释放作用:释放作用:释放作用:释放p p指向的内存区,使这部分内存区能指向的内存区,使这部分内存区能指向的内存区,使这部分内存区能指向的内存区,使这部分内存区能被其他变量使用。被其他变量使用。被其他变量使用。被其他变量使用。P P是调用是调用是调用是调用mallocmalloc时
4、返回的值。时返回的值。时返回的值。时返回的值。返回值:无返回值返回值:无返回值返回值:无返回值返回值:无返回值动态释放函数动态释放函数int n,*p;int n,*p;printfprintf(”请输入数组的长度请输入数组的长度”);”);scanf(“%d”,&n);scanf(“%d”,&n);p=(int*)malloc(n*4);p=(int*)malloc(n*4);if(p=NULL)if(p=NULL)printf printf(”分配失败分配失败”);”);elseelse printf printf(”分配成功分配成功”);”);free(p);free(p);5用结构体处
5、理链表用结构体处理链表n链表概述链表概述一种重要的数据结构。可以动态地进行存储分配一种一种重要的数据结构。可以动态地进行存储分配一种结构结构优点:插入、删除某个结点容易,不用移动数据。优点:插入、删除某个结点容易,不用移动数据。例例例例建立一个如下图所示的由建立一个如下图所示的由建立一个如下图所示的由建立一个如下图所示的由3 3 3 3个学生数据简单链表个学生数据简单链表个学生数据简单链表个学生数据简单链表9910189.5numscorenext99103909910785NULLNULLheadhead结点的结构结点的结构struct student int num;float score
6、;struct student*next;6n建立链表建立链表例例例例写一个建立链表的函数写一个建立链表的函数写一个建立链表的函数写一个建立链表的函数createcreatecreatecreatestruct student*create(int n)/创建有创建有n个结点的单链表个结点的单链表 struct student*p,*q,*head;int i;p=(struct student*)malloc(sizeof(struct student);/输入学号和成绩输入学号和成绩 head=p;for(i=0;inext=q;p=q;p-next=NULL;return head;99
7、1019910189.589.59910399103909099107991078585NULLNULLheadhead7n输出链表输出链表例例例例写一个输出链表的函数写一个输出链表的函数写一个输出链表的函数写一个输出链表的函数printprintprintprintvoid print(struct student*head)struct student*p=head;while(p!=NULL)printf(“%d%5.1fn”,p-num,p-score);p=p-next;991019910189.589.59910399103909099107991078585NULLNULLhea
8、dheadp pp pp pP=NULLP=NULL8n对链表的删除对链表的删除分析分析A AB BC CD DE E关键问题:关键问题:关键问题:关键问题:找到要删除的点,设为找到要删除的点,设为找到要删除的点,设为找到要删除的点,设为p2p2p2p2结点结点结点结点p2p2p2p2的前一个结点的前一个结点的前一个结点的前一个结点p1p1p1p1p2p2p1p1p1-next=p2-nextp1-next=p2-next9n删除某个学生删除某个学生struct student*del(struct student*head,int num)/删除学号为删除学号为num的学生的学生 struc
9、t student*p1,*p2=head;if(head!=NULL)while(p2-num!=num&p2-next!=NULL)p1=p2;p2=p2-next;if(p2-num=num)/找到找到 if(p2=head)head=head-next;else p1-next=p2-next;free(p2);return head;991019910189.589.59910399103909099107991078585NULLNULLheadhead10n插入链表插入链表分析:分析:怎样找到插入位置怎样找到插入位置如何实现插入如何实现插入991019910189.5991039910390991079910785NULLp1p1p2p2991049910480p0p0p2-next=p0p2-next=p0p0-next=p1p0-next=p1headhead