C 动态链表
在接下来的时间里面,我们准备为大家介绍"链动态链表"。
(1)为什么需要动态链表?
在前面的学习中,我们已经了解到如何定义链表,但是,在当时的学习过程中,我们是预先
定义了多个结构体的变量作为节点,然后,再把它们连接起来。
但是,如果节点的数量不确定,那么,我们如何在程序运行的过程添加或删除节点呢?
所以,我们就需要动态产生节点并把它链接到链表中,从而,形成动态链表。
接下来,我们要学习如何动态产生节点,而这个工作,在C语言里面它就提供了函数malloc与calloc
来完成,也就是说,当我们需要动态产生节点时,就可以使用这两个函数来完成工作。
函数malloc的原型如下:
void *malloc(unsigned int size );
原型分析:
malloc函数的作用就是分配一个由参数size所指定大小的内存空间,并返回成功分配后的
内存空间的起始地址。如果分配不成功则返回NULL空值。
函数calloc的原型如下:
void *calloc( unsigned n ,unsigned size );
原型分析:
calloc函数的作用就是分配n个连续的内存空间,而要分配多少个,则由第一个参数n来决定。
而每一个内存空间要分配的大小,则由第二个参数size来决定。
如果分配成功,则返回已分配的连续内存空间的起始地址,否则,返回NULL空值。
free函数的原型如下:
void free ( void *p );
原型分析:
free函数的作用是释放参数p所指向的内存空间,而这里的参数p,是指通过
malloc或calloc函数成功分配内存空间后的返回值。
另外,free函数没有返回值。
(2)
例子:
struct ST //定义了结构体ST
{
int Number; //编号,用于记录一个整型数
struct ST * next; //定义一个ST结构体的指针变量next,指向链表中下一个节点
};
void main()
{
//定义了结构体ST的指针变量head作为第一个节点
struct ST * head;
int len = sizeof( struct ST ); //通过sizeof获取ST结构体的大小,
并保存于 变量len中
(1)//通过malloc为第一个节点head分配内存空间,并通过(struct ST*)对返回的
类型强制转换为(结构体ST的指针类型)
head = ( struct ST * ) malloc( len );//根据变量len中所保存的大小来分配内存空间。
//通过head节点调用成员Number,并赋值为1
head->Number = 1;
(2)//再通过malloc分配另一个内存空间,作为第2个节点,
并通过第一个节点的next成员指向第2个节点的内存空间。
head->next = ( struct ST * ) malloc( len );
//通过head节点调用成员next找到第2个节点,
并调用第2个节点的成员Number,并赋值为2
head->next->Number = 2;
(3)//再通过malloc分配另一个内存空间,作为第3个节点,
并通过第一个节点的next成员找到第2个节点,
然后,通过第2个节点的next成员指向第3个节点的内存空间。
head->next->next = ( struct ST * ) malloc( len );
//通过head节点调用成员next找到第2个节点,
再通过第2个节点调用成员next找到第3个节点,
再通过第3个节点调用成员Number,并赋值为3
head->next->next->Number = 3;
}
小结:
(1)从第一个节点head开始可以通过每个节点的next成员找到下一个节点。
(2)每个节点中的next成员都指向下一个节点的内存空间,即指向下一个节点。
所以,可以通过next成员调用下一个节点中的成员。
非常好,现在,我们已经掌握了C中的“动态链表”这个知识点,但是,如何去运行用它呢?所以,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对每个知识点的理解和运用,以及“尽快进入到编程的状态”。
不要停留在理论规则上面,快动起来吧!
(通过游戏模式学习与训练,需要在电脑上运行)