1.基础定义
链式存储结构(linked storage structure),是逻辑存储结构的一种,链式存储结构中每一个逻辑元素用一个内存结点存储,每一个结点都是单独分配的,所有结点地址不一定是连续的,所以无需占用一整块存储空间。为了表示元素之间的逻辑关系,给每个结点附加指针域,用于存放相邻结点的存储地址,也就是通过指针域将所有结点连接起来,这就是其名称的由来。
2.优缺点比较
优点:便于数据修改
对元素插入或删除时只需对相应结点进行操作,不必移动结点(如下图所示)
缺点:存储空间利用率较低
因为分配给其的空间一部分用于逻辑关系的存储,相邻元素的地址不一定连续,而且由于逻辑上的连续性,无法对其进行元素的随机存储。只是说概念大家肯定是不容易理解的,接下来用一段代码来帮助大家理解如何使用。
(老规矩,先概览一下)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode
{
int data;
Linknode* next;
}link;
int main()
{
link* L;
L = (link*)malloc(sizeof(link));
link* f;
link* b;
int a = 0;
scanf("%d", &a);
f = L;
while (a != 0)
{
b = (link*)malloc(sizeof(link));
f -> next = b;
b->data = a;
f = f->next;
b->next = NULL;
scanf("%d", &a);
}
f = L;
while (f->next != NULL)
{
f = f->next;
printf("%d\n", f->data);
}
return 0;
}
3.正式开始讲解
3.1首先定义一个结构体
typedef struct Linknode
{
int data;
struct Linknode* next;
}link;
1)函数解析:
typedef,关键词,重新给一个类型命名,便于后续操作。
struct,函数,定义一个结构体,使用方法如下,相当于创建一个集合,这个集合中有固定的一些类型的数据。
2)功能解析:
首先我们可以见到结构体中定义了一个整形 data,这个也就是我们用于存放数据的部分,当然,如果你想存放更多的数据也可以多加几个,然后又定义了一个 struct Linknode* 类型的一个指针,那这时候有同学就有疑问了为啥一定是这个类型呢?因为指针只能存放对应类型的变量的地址,比如 int* 类型的指针只能指向 int 类型的变量,现在我们所创建的指针用于指向下一个 Linknode这一类型结构体的地址,所以它的类型就必须是struct Linknode。(注意:当然Linknode只是本人意愿你也可以命名你习惯的名称,包括后来的link) 最后分号前的 link 就是我们利用 typedef 函数将这个结构体类型重新命名的名字,以后 link 便等价于struct Linknode。
如图所示:
3.2然后我们利用这个类型进行链式存储
int main()
{
link* L; //定义一个link*类型的指针
L = (link*)malloc(sizeof(link)); //L指向一块空间
link* f;
link* b; //又定义了两个变量
int a = 0; //定义一个整形,用于数据的输入
scanf("%d", &a); //录入一个数据
f = L; //L指向的地址赋给f
while (a != 0) //当录入的数据不为0时
{
b = (link*)malloc(sizeof(link)); //新创建一个结构体,地址放到b中
f -> next = b; //f中指针域存放的是b的地址
b->data = a; //b中存放的数据是a的值
f = f->next; //把f指针域中的地址赋给f,也就是f现在代表着b所指代空间的地址
b->next = NULL; //将b所指的空间的指针域赋值为空
scanf("%d", &a); //再次录入后回到开头,判断是否进入循环
}
return 0;
}
1)函数解析
(类型)变量1;:这个形式是将变量1清强行转化为圆括号中所之前的类型。
malloc ():函数,在内存中开辟一块空间,大小指定与圆括号中。(注:malloc创建的空间如果不主动用free()函数释放会一直占用空间,它不属于自动变量)
sizeof() :函数,用于求圆括号中数据的大小。
2)功能解析
综上所述语句 L = (link* ) malloc (sizeof (link) ) ; 表达含义就是在内存中开辟一块区域,这块区域的大小就是结构体link的大小,然后将这块区域的类型强行转化成 link* 类型,也就是和 L 类型相同,再赋给 L。
如此循环往复,不断用b创建新的空间,a的数据存入b->data中,f(也就是前一个结构体空间)的指针域用于存放b的地址 ,知道输入0,存放数据终止,此时b中指针域为空,用^来表示。
3.3输出存放的数据
f = L; //f指向首位地址
while (f->next != NULL) //当f这个结构体中指针域不为空时,也就是f后还有数据存放时
{
f = f->next; //将f指向下一个结构体,
printf("%d\n", f->data);//因为首个结构体中我们没有存放data,所以从第二个开始输出
}//直到f后面不再有元素
这个过程可以根据上一张图来理解,就是将存储的数据全部输出。
代码运行结果如下:
ok,今天的讲分享到此告一段落了,欢迎大家在评论区发表见解,毕竟这是本人初次学习自行理解的结果,如有不当欢迎指出,C无极限,学无上限,这里是寒雒,让我们一起加油!!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)