2021-11-29 学习的打卡学习第七天(动态链表的简单理解)

这篇博客介绍了如何使用C语言中的malloc和free函数创建动态链表。通过一个结构体`struct Student`来表示链表节点,包括学生编号和分数。在`creat`函数中,逐步解释了如何分配内存、输入数据并建立链表结构。作者在理解过程中遇到困难,但最终掌握了动态链表的基本操作,并计划进一步学习链表的插入和删除。
摘要由CSDN通过智能技术生成

今天简单学习了一下链表,感觉整个人都不好了。有一点难以理解。

首先指针的简单运用不说了,就简单说一下指针的动态内存分配。

malloc函数:开辟动态存储区
其函数原型为malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间。形参size的类型定为无符号整型(不允许为负数)。此函数的值(即“返回值”)是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的第一个字节。如:
malloc(100); //开辟100字节的临时分配域,函数值为其第1个字节的地址
意指针的基类型为void,即不指向任何类型的数据,只提供一个纯地址。如果此函数未能功地执行(例如内存空间不足),则返回空指针(NULL)。它常常和sizeof函数一起用。

free函数:释放动态存储区
其函数原型为
void free(void*p);
其作用是释放指针变量p所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc或malloc函数时得到的函数返回值。如:
free(p); //释放指针变量p所指向的已分配的动态空间
free函数无返回值。

free和malloc函数都需要头文件#include<stdlib.h>才能调用。

了解了这两个函数,就可以建立动态链表。

我一开始没能看明白教材的例子,花了半小时,看懂了。

下面是教材代码和我的理解和说明:

#include<stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{
    long num;
    float score;
    struct Student * next;
};
int n; //n为全局变量,本文件模块中各函数均可使用它
struct Student * creat(void) //定义函数。此函数返回一个指向链表头的指针
{
    struct Student *head;
    struct Student *p1,*p2;
    n=0;
    p1=p2=(struct Student *) malloc(LEN); //开辟一个新单元,为了方便理解,就说系统划了块地给p1,p2
    scanf("%ld,%f",&p1->num,&p1->score); //输入第1个学生的学号和成绩,方便理解就说p1指向了一个房子,让这房子叫0001。现在0001房有sum1,score1,next1未知
    head=NULL;
    while(p1->num!=0)//当输入的sum不为0时
  {
    n=n+1;//第一遍后进入else,我们先跳过else,回头再看
    if(n==1)head=p1;//如果输入的是第一个数,让head指针也指向0001房
    else p2->next=p1;//否则让p2指向的房子里的next指针指向p1,也就指向了p1所指向的房子,即next1指针指向p1,即指向0002房
    p2=p1;//让p2指向p1所指向的房子,即p2指向0001房,第二遍p2指向0002房
    p1=(struct Student *)malloc(LEN); //开辟动态存储区,把起始地址赋给p1,p1不指向原来的房了,系统重新划了块地给p1
    scanf("%ld,%f",&p1->num,&p1->score); //输入其他学生的学号和成绩,p1又指向了一个房子,我们称为0002,重新看循环第一句
  }//可以看到head指针永远指向0001房,p1指向新开的房,p2指向老房子
    p2->next=NULL;//最后的p2指向的房子里的next指针无房子指向,设为空,一个动态链表就完成了
    return(head);
}
int main()
{
    struct Student * pt;
    pt=creat(); //函数返回链表第一个房子的地址
    printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);//输出第1个房子里的东西
    return 0;
}

上述注释的房子就是结点,房子里的东西就是成员。

我理解了一点,但感觉我很难写出来啊(●—●)

明天学习下插入和删除,感觉难起来了,要努力了呀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值