动态分配内存和链表

来源:互联网 发布:撒谎眼睛往哪看 知乎 编辑:程序博客网 时间:2024/06/07 01:29
C/C++学习笔记之八
上一节我们讲到了结构体,结构体是一个非常重要的内容,特别对于本节内容而言是一个非常重要的基础知识。本节主要讲动态内存的分配与链表的处理,下面将对其进行具体介绍。
1.动态内存分配(malloc/free)
原因:数组的长度定死了,无法改变,这才引入了动态内存的分配
   例:
struct Student{
int id;//学号
char name[10];//姓名
int score[5];//成绩
};
定义100个学生;
Student stu[100];//数组方式,无法动态定义

int size=100*sizeof(Student);
Student *stu=(Student *)malloc(sizeo);//开辟一百个空间的内存单元
........
free(stu);//释放内存空间
上面的例子中,我们使用动态内存内存可以自己定义分配最大内存。
malloc:内存申请地址,需主动归还(free)。
注意:1)只有指针类型为malloc时,才可以用free;
    2)及时free,否则累计到一定的时候会消耗资源。
    3)free后该指针不能再使用。
2.链表
链表就是将所有的节点串起来,组成一个表,这些节点并不必须是连在一起的。
例:
struct Student{
int id;//学号
char name[10];//姓名
int score[5];//成绩
Student *next;
};
Student stu[5];
stu[0].next=&stu[1];
stu[1].next=&stu[2];
..........
stu[4].next=null(0);
Student *p=stu;
//指向了表头,可以通过指针来访问。
有头链表的构造:
Student m_head={0};
链表中的对象一般是动态创建
Student *s1=(Studnet *)malloc(sizeof(Student));
m_head.next=s1;
s1->next=NULL;
链表节点的插入:
(1)头插法(带头结点):
s->next=m_head.next;
m_head.next=s;//s为将插入的节点
(2)尾插法(带头结点)
Student *p=m_head.next;
Student *pre=&m_head;
while(1){
if(!p){
break;
}
pre=p;
p=p->next;
}
pre->next=s;
s->next=p;
此外,还有按条件插入,与上述方法类似,这里就不加详述;
0 0
原创粉丝点击