一段代码给你讲清楚【链式存储结构】

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无极限,学无上限,这里是寒雒,让我们一起加油!!!!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒雒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值