1.链表与数组的区别

2.链表的创建以及链表的静态添加

3.链表的动态添加(头插法)

1.链表与数组的区别:

谈到链表与数组的区别,可以从几个不同的角度来谈,

首先从逻辑结构上说,两者都是数据结构的一种,但存在区别,

数组是申请的一块连续的内存空间,并且是在编译阶段就要确定空间大小的,同时在运行阶段是不允许改变的,所以它不能够随着需要的改变而增加或减少空间大小,所以当数据量大的时候,有可能超出了已申请好的数组上限,产生数据越界,或者是数据量很小,对于没有使用的数组空间,造成内存浪费。

链表则是动态申请的内存空间,并不像数组一样需要事先申请好大小,链表是现用现申请就OK,根据需求动态的申请或删除内存空间,对于的是增加或删除数据,所以比数组要灵活。

再从物理存储即内存分配上分析,

数组是连续的内存,对于访问数据,可以通过下标直接读取,时间复杂度为O(1),而添加删除数据就比较麻烦,需要移动操作数所在位置后的所有数据,时间复杂度为O(N)。

链表是物理上非连续的内存空间,对于访问数据,需要从头便利整个链表直到找到要访问的数据,没有数组有效,但是在添加和删除数据方面,只需要知道操作位置的指针,很方便可以实现增删,教数组比较灵活有效率。

所以综合以上,对于快速访问数据,不经常有添加删除操作的时候选择数组实现,而对于经常添加删除数据,对于访问没有很高要求的时候选择链表。

2.链表的创建以及链表的静态添加:
来看看一个链表是怎么生成的以及它的静态添加代码:

#include<stdio.h>struct Link
{int a;char c;struct Link *next;//在结构体中加入一个指针,为生成一个链表做准备
};int main()
{struct Link t1 = {100,'a',NULL};//静态给两个结构体赋值struct Link t2 = {200,'b',NULL};t1.next = &t2;//将结构体1中的指针指向结构体2,这样一个简易链表就产生了printf("use t1 go to input t2\n");printf("t1:%d %c t2:%d %c\n",t1.a,t1.c,(t1.next)->a,(t1.next)->c);return 0;
}


可以看到,通过结构体t1输出了t2中的值,这就是一个链表,将结构体t1和t2关联了起来

然后我们再来看看链表的遍历:

#include<stdio.h>struct Link
{int a;char c;struct Link *next;
};void printLink(struct Link *p)//不直接用t1来访问t2,而是通过指针的移动来遍历链表,从而输出两个结构体中的数据
{while(p != NULL){printf("%d %c\n",p->a,p->c);p = p->next;}
}int main()
{struct Link t1 = {100,'a',NULL};struct Link t2 = {200,'b',NULL};t1.next = &t2;printLink(&t1);return 0;
}


通过这种方式也能实现对链表中数据的访问,毫无疑问,这种方式更为的简洁,尤其是当链表中元素很多的时候,采用这种遍历的方法尤为的重要。

3链表的动态添加(头插法):
静态添加显得有些呆滞,大部分时候我们还是需要动态输入数据,因为这里来介绍一种动态添加的方法即头插法.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct Link
{int a;char c;struct Link *next;
};void printLink(struct Link *p)//将头插法后的链表中的数据以遍历的方式打印出来
{while(p != NULL){printf("%d %c\n",p->a,p->c);p = p->next;}
}struct Link* insertFromHead(struct Link *p)//封装的头插法函数
{struct Link *new;while(1){new = (struct Link*)malloc(sizeof(struct Link));printf("plaese input number and letter\n");scanf("%d",&new->a);getchar();//吸收scanf中的回车scanf("%c",&new->c);if(new->a<=0){ printf("You input a error data\n");return p;}                             //以用户输入小于零的数来终止头插法,大家也可以根据自己的习惯来设计if(p == NULL){p = new;}else{new->next = p;p = new;}}return p;
}int main()
{struct Link *head = NULL;head = insertFromHead(head);printLink(head);return 0;
}


可以看到当我输入0的时候,程序自动终止了,并且先输入的数据排在链表的后面,这也体现了头插法的特点,好了,关于链表的介绍就到这里了,希望能对学习链表的你们有所帮助。

链表与数组的区别以及链表相关的操作相关推荐

  1. php数组和链表的区别,什么是链表?链表与数组的区别?

    链表的相关知识整理 什么是链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时 ...

  2. 数据结构 - 链表和数组的区别

    文章目录 数据结构 - 链表和数组的区别 1.在内存上 2.时间复杂度 3.链表的结构 4.各自的优缺点 5.为什么使用较常用的是单头链表 数据结构 - 链表和数组的区别 1.在内存上 数组是连续内存 ...

  3. 链表及链表与数组的区别优缺点

    链表的概念   链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.   链表的结构是多式多样的,当时通常用的也就是两种:    无头单向非循环列表: ...

  4. java数组和链表的区别_java中链表和数组的区别?

    综述:数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可.链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可.貌似链表比数组还要麻烦些,而且效率低些. 想到这些相同处中的一些细微的 ...

  5. 静态链表和数组的区别

    读<大话数据结构> 在学习静态链表时候,觉得他和数组神似,于是就搜一搜他们的区别哇. 静态链表的C实现和核心点(基于数据结构 严蔚敏)

  6. 链表和数组的区别在哪里

    1. 数组在内存中栈上按顺序存储的,而链表是在堆上随机存储的. 2. 要访问数组中的元素可以按下标索引来访问,速度比较快,如果对他进行插入操作的话,就得移动很多元素,所以对数组进行插入操作效率很低. ...

  7. 链表和数组的区别在哪里?

    二者都属于一种数据结构 从逻辑结构来看 1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况.当数据增加时,可能超出原先定义的元素个数:当数据减少时,造成内存浪费:数组可以根据下 ...

  8. 1.(2)数据结构之链表的定义,链表和数组的区别

    本人坚持更新C语言,数据结构,操作系统知识,可以收藏+关注随时了解

  9. 单向链表与双向链表的区别

    昨天面试官面试的时候问了我一道关于链表的问题:情境如下 面试官:请说一下链表跟数组的区别? 我: 数组静态分配内存,链表动态分配内存:数组在内存中连续,链表不连续:数组利用下标定位,时间复杂度为O(1 ...

最新文章

  1. 2015年的ResNet潜力都挖掘出来了吗?新研究:不用蒸馏、无额外数据,性能还能涨一波...
  2. 关于RPM包中的rpmnew和rpmsave
  3. 远程下层文档 正在打印_奉贤金汇高速复印机出租一站式服务,上海区专业高速打印机出租...
  4. MFC改变对话框背景图片实例
  5. ActionScript3学习笔记2-包
  6. join left semi_HIVE--left semi join
  7. ffmpeg在android上输出滑屏问题处理
  8. 【资源下载】清华姚班、普林斯顿博士、斯坦福大学助理教授马腾宇博士论文下载——2018ACM最佳博士论文提名
  9. javascript HTML静态页面传值的四种方法
  10. java 比较2个时间大小写_date - Java 8:计算两个LocalDateTime之间的差异
  11. HDU 4849 Wow! Such City!陕西邀请赛C(最短路)
  12. 自动驾驶技术(1)--控制工程篇概述
  13. c语言10的10万次方,在c语言编程中 10的n次方应该怎么表达
  14. 在线简洁Logo制作
  15. HDU-6148 Valley Numer(数位DP)
  16. Unet分割直肠肿瘤图像
  17. 中国移动的呼叫转移呼叫等待等设置方法USSDMMI
  18. MongoDB服务启动
  19. Linux中动态网络配置
  20. CF1740H MEX Tree Manipulation

热门文章

  1. 理解S12(X)架构中的地址映射方案
  2. 一步教你找寻回虚拟机。
  3. H2 数据库如何以服务器方式启动
  4. 翔宇网科协同OA中小企业解决方案
  5. SQL之数据库表的操作
  6. 镜头性能的裁判:MTF测试仪
  7. java中int与char的互相转换
  8. 一文教你学会实现以邮件激活的注册账户代码
  9. Multer中文文档
  10. 骨肉瘤中发现DANCR作为ceRNA促进增殖和转移