Cypress 2020-02-02
1. malloc()函数是C语言中stdlib.h用于申请动态内存的函数,其返回的类型是同变量类型的指针。如果申请失败,就会返回空指针NULL 2. new是C++中用来申请动态空间的运算符,其返回类型同样是申请的同样变量类型指针。如果申请失败会启动C++中异常机制处理而不是返回空指针NULL 3. 内存泄漏是指使用malloc与new开辟出来的空间在使用过后没有释放,导致其在程序结束前始终占据空间。 4. free()是对应于malloc函数,在stdlib.h中,只需要在free的参数中填写需要释放的内存空间的指针变量即可。free函数只要实现两个效果:<1>释放指针变量p所指向的内存空间;<2>将指针变量p指向空地址NULL。在free函数执行之后,指针变量p本身没有消失,只不过让他指向了空地址NULL,但是它原指向的内存确实被释放。 5. delete运算符是对应new运算符的,使用方法和free相同。 6. 一般是成对出现的,但是在考试中一般是内存够使用的,但是在实际情况中可以注意。
malloc typename* p = (typrname*)malloc(sizeof(typename)); 以int和node类型为例子 int* p = (int*)malloc(sizeof(int)); node* p = (node*)malloc(sizeof(node)); free(p) new typename* p = new typename; int* p = new int; node* p = new node; delete(p)
#inlcude<stdio.h> #include<stdlib.h> struct node{ int data; node* next; }; //创建链表 node* create(int Array[]){ node *p, *pre, *head;//pre保存当前结点的前驱结点,head为头结点 head = new node; head->next = NULL;//头结点不需要数据域,指针域初始为NULL pre = head;//记录pre为head for(int i = 0; i < 5; i++){ p = new node;//新建结点 //将Array[i]赋值给新建的结点作为数据域,也可以scanf输入 p->data = Array[i]; p->next = NULL; pre->next = p;//前驱结点的指针域设为当前新建结点的地址 pre = p; } return head; } int main(){ int Array[5] = {5, 3, 6, 1, 2}; node* L = create(Array);//新建链表,返回的头指针head赋给L; L = L->next; while(L != NULL){ printf("%d", L->data); L = L->next; } return 0; }
//以head为头结点的链表上计数元素的个数 int search(node* head, int x){ int count = 0;//计数器 node* p = head->next;//从第一个结点开始 while(p != NULL){ if(p->data == x){ count++; } p = p->next;//指针移动到下一个结点 } return count;//返回计数器count }
void insert(node* head, int pos, int x){ node* p = head(); for(int i = 0; i < pos-1; i++){ p = p->next;//pos-1是为了到插入位置的前一个结点 } node* q = new node;//新建结点 q->data = x;//新结点的数据域为x q->next = p->next;//新结点的下一个结点指向原先插入位置的结点 p->next = q;//前一个结点指向新结点 }
//删除以head为头结点的链表中所有数据域为x的结点 void del(node* head, int x){ node* p = head->next;//从第一个结点开始枚举 node* pre = head;//pre保存p的前驱结点的指针 while(p != NULL){ if(p -> data == x){ pre->next = p->next; delete(p); p = pre->next; }else{ pre = p; p = p->next; } } }