《高级语言程序设计教学课件》第11章.ppt
1,第11章 指针高级应用,2,动态内存分配,实现按需分配。根据程序的实际需要进行内存的分配和释放。以前的都是按计划分配(如数组必须指定长度)动态内存分配相关函数(stdlib.h中)malloc(size):分配size个字节的存储空间 free(p):释放指针p指向的之前已分配的空间,3,动态分配函数,malloc函数void*malloc(unsigned int size);作用:在内存的动态存储区中分配一个长度为 size的连续空间返回值:成功,返回指向分配域起始地址的指针;否则,返回空指针(NULL)例如,由用户从键盘输入来确定一个数组的长度。,int n,*p;printf(”请输入数组的长度”);scanf(“%d”,4,free函数void free(void*p);作用:释放p指向的内存区,使这部分内存区能被其他变量使用。P是调用malloc时返回的值。返回值:无返回值,动态释放函数,int n,*p;printf(”请输入数组的长度”);scanf(“%d”,5,用结构体处理链表,链表概述一种重要的数据结构。可以动态地进行存储分配一种结构优点:插入、删除某个结点容易,不用移动数据。,例建立一个如下图所示的由3个学生数据简单链表,NULL,head,结点的结构struct student int num;float score;struct student*next;,6,建立链表,例写一个建立链表的函数create,struct 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;,7,输出链表,例写一个输出链表的函数print,void print(struct student*head)struct student*p=head;while(p!=NULL)printf(“%d%5.1fn”,p-num,p-score);p=p-next;,P=NULL,8,对链表的删除分析,关键问题:找到要删除的点,设为p2,结点p2的前一个结点p1,p1-next=p2-next,9,删除某个学生,struct student*del(struct student*head,int num)/删除学号为num的学生 struct student*p1,*p2=head;if(head!=NULL)while(p2-num!=num,10,插入链表分析:怎样找到插入位置如何实现插入,p2-next=p0,p0-next=p1,head,