C语言 链表输入输出数组

这篇具有很好参考价值的文章主要介绍了C语言 链表输入输出数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.链表概念

        链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。               

特征 

  • 由于链表的内存空间是零散的,所以不支持随机访问。
  • 插入、删除不需要移动数据,所以效率高。
  • 因为链表的每个内存块都不是连续的,所以不需要提前计算内存的大小,内存空间可以根据结点数量的改变而改变。

图解如下: 

链表的输出,链表,数据结构,c++,c语言

2.链表与数组的不同

         链表与数组不一样,链表的储存空间不是连续的,是通过指针指向下一个节点,进行访问,这也说明了链表访问是有顺序的, 必须先从头开始,再依次找到想要访问的数据节点。而数组不一样,数组的空间是连续的,我们可以直接去访问某一个数组的数据(比如直接输出a[4]的值)。链表的存储空间是动态空间,我们可以自行的删减空间,可以随意改动空间;数组的空间是固定的,这也说明了数组的数据空间是不可以随意去改动。

链表的输出,链表,数据结构,c++,c语言

3.输入输出数组

(1)数组输入输出

#include<stdio.h>
int main()
{
	int a[100];
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);
}

可以看出用数组直接输入输出是很简单的,但是我初始的空间是100个(sizeof(int)),这个空间是固定的,而且我输入输出的数字个数所占用的空间必须在这范围内,否则会报错,造成空间溢出。那么如果用链表去输入输出就会更加灵活,我们需要多少空间可以自行开辟,随取随用。

(2)链表的输入输出

#include<stdio.h>
#include<malloc.h>
struct node//先定义一个结构体,里面包含数据与结构体指针
{
	int data;
	struct node* next;
};
int main()
{
	struct node* head, * tail, * p;
	head = (struct node*)malloc(sizeof(struct node));//先在头指针开辟一个存储空间,但是不储存数据
	head->data = 9;
	head->next = NULL;//初始化头指针指向空指针
	tail = NULL;//尾指针初始化为空指针
	int x;
	int n;
	scanf("%d", &n);//输入想要的数字n个
	int i = 0;
	//输入数组
	while (i<n)
	{
		p = (struct node*)malloc(sizeof(struct node));
		scanf("%d", &x);
		p->data = x;
		p->next = NULL;//p的指向下一个指针为空指针
		if (head->next == NULL)
			head->next = p;//固定头指针指向的指针,然后保持不变
		else
			tail->next = p;//此时的空间是新开辟的空间,tail->next即是上一个空间p->next
		tail = p;//为指针指向p,可以理解作为一个桥梁,用来储存是一个指向的空间
		i++;
	}
	//输出数组
	int j;
	for (j = 0, p = head->next; j < n; p = p->next,j++)
		printf("%d ", p->data);
	return 0;
}

这里我们不难看出用链表输入输出一个数组需要的代码量是非常大的。但是如果对于大数据的输入输出的话我们可以通过改变结构体的成员(即数据域)来照常输入输出,实际上链表的代码量并没有增加多少;如果用数组去输入输出大数据的话,那增加的代码量是翻倍的增加,由此,可以体现出链表的优势 。

总结:

数组优于链表的: 
1.内存空间占用的少,因为链表节点会附加上一块或两块下一个节点的信息.但是数组在建立时就固定了.所以也有可能会因为建立的数组过大或不足引起内存上的问题. 
2.数组内的数据可随机访问.但链表不具备随机访问性.这个很容易理解.数组在内存里是连续的空间.比如如果一个数组地址从100到200,且每个元素占用两个字节,那么100-200之间的任何一个偶数都是数组元素的地址.可以直接访问.链表在内存地址可能是分散的.所以必须通过上一节点中的信息找能找到下一个节点. 
3.查找速度上.这个也是因为内存地址的连续性的问题.不罗索了. 
链表优于数组的: 
1.插入与删除的操作.如果数组的中间插入一个元素,那么这个元素后的所有元素的内存地址都要往后移动.删除的话同理.只有对数据的最后一个元素进行插入删除操作时,才比较快.链表只需要更改有必要更改的节点内的节点信息就够了.并不需要更改节点的内存地址. 
2.内存地址的利用率方面.不管你内存里还有多少空间,如果没办法一次性给出数组所需的要空间,那就会提示内存不足,磁盘空间整理的原因之一在这里.而链表可以是分散的空间地址. 
3.链表的扩展性比数组好.因为一个数组建立后所占用的空间大小就是固定的.如果满了就没法扩展.只能新建一个更大空间的数组.而链表不是固定的,可以很方便的扩展.文章来源地址https://www.toymoban.com/news/detail-720464.html

​​​​​​​​​​​​​​

到了这里,关于C语言 链表输入输出数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包