今天简单学习了一下链表,感觉整个人都不好了。有一点难以理解。
首先指针的简单运用不说了,就简单说一下指针的动态内存分配。
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;
}
上述注释的房子就是结点,房子里的东西就是成员。
我理解了一点,但感觉我很难写出来啊(●—●)
明天学习下插入和删除,感觉难起来了,要努力了呀。