当前位置:首页 » 编程语言 » c语言链表支持随机存取吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言链表支持随机存取吗

发布时间: 2022-06-07 15:57:37

c语言中 的链表

链表是线形表的一种,线形表分为顺序存储结构和链式存储结构。线形表的顺序存储结构的特点是逻辑关系上相邻的两个元素物理位置上也相邻,因此可以随机存取表中任一元素。链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。
插入和删除指的是对链表中数据元素的基本操作。
建议你看看《数据结构(c语言版)》,上面说的非常详细。

㈡ 线性链表不能随机存取元素的原因

如果明白线性链表的原理,自然就知道为什么不能随机存取。
先举栗子:
线性链表:
存储地址(物理) 0x11 0x52 0x02 0xe3
存放元素(逻辑) a-> b-> c-> d

如上,线性链表就是一组前元素后面有可能拖着一个元素的数据结构。线性链表所存放的元素在物理空间上一般不是相邻的,他们只具有逻辑上相邻的关系,因此你只能通过前一个元素与后一个元素之间的关系找到后一个元素,而这个关系就是你在前一个元素中存放的后一个元素的地址。

跟生活中比较相似的事物结合,如一串佛珠、手链,柱子是一颗颗串起来的,珠子就像是链表中的元素,把珠子串起来的线就是他们之间的逻辑关系,记住只是逻辑关系而不是物理关系。只要在逻辑上符合就是线性表,跟物理结构没有关。

与数组比较,数组是随机存储结构,那么为什么数组能随机存取呢?因为数组是一块物理上相连的存储空间,只要知道该数组的首元素的地址,之后的元素在此基础上加位置号,就可以找到想要的元素,这就是随机存取,不需要先找a,再找b,最后找到c,而是直接0x10(数组开始位置)+2 就是c元素。
线性表通常没有这种物理上的关系,因此只能根据前面元素给的线索一个个去找。
能直接找到的叫做随机存取,不能一下找到的就不是。

㈢ C语言链表与队列的问题

首先:链表与队列都是数据结构的一种
一.
链表
1.定义

链表(Linked
list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在由一个个节点组成,每个节点(node)中储存着数据变量(data)和指针变量(node
next),又有一个头节点(head)连接下面的节点,而最后一个节点指向空(null)。可以在链表类中定义增加,删除,插入,遍历,修改等方法,故常用来储存数据。

2.
优点

(1).使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

(2).数据的存取往往要在不同的排列顺序中转换,而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。

3.
缺点

链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

4.
类型

主要有单向链表,双向链表以及循环链表。

5.
实例

6.
与数组(Array)的对比

链表的使用不需要知道数据的大小,而数组在创建时必须指明数组的大小。

链表没有对应的下标,只有指向下一个数据的指针,而数组中每一个都有一个相对应的下标。

链表在内存中储存的数据可以是不连续的,而数组储存的数据占内存中连续的一段,用标识符标识。
二.
队列
1.
定义

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first
in
first
out)的线性表。

㈣ 链表是顺序存储,数组是随机存储这句话对吗

错~
刚好反了~
链表是随机存储的,即有需要新建结点时,才新建结点。因此存储的位置是不连续的。
数组是顺序存储的。数组实际上是直接开辟一片内存作为存储空间~

㈤ c语言 链表是什么。书上的没看太懂

由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向明上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,[1]但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。 [编辑本段]特点 线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素 与其直接后继数据元素 之间的逻辑关系,对数据元素 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。由这两部分信息组成一个"结点"(如概述旁的图所示),表示线性表中一个数据元素 。 [编辑本段]扩展 根据情况,也可以自己设计链表的其它扩展。但是一般不会在边上附加数据,因为链表的点和边基本上是一一对应的(除了第一个或者最后一个节点,但是也不会产生特殊情况)。不过有一个特例是如果链表支持在链表的一段中把前和后指针反向,反向标记加在边上可能会更方便。 对于非线性的链表,可以参见相关的其他数据结构,例如树、图。另外有一种基于多个线性链表的数据结构:跳表,插入、删除和查找等基本操作的速度可以达到O(nlogn),和平衡二叉树一样。 其中存储数据元素信息的域称作数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)。指针域中存储的信息又称做指针或链。 由分别表示,,…, 的N 个结点依次相链构成的链表,称为线性表的链式存储表示,由于此类链表的每个结点中只包含一个指针域,故又称单链表或线性链表. [编辑本段]三个链表函数(C语言描述) #include #include struct Node{ int data;//数据域 struct Node * next;//指针域 }; /************************************************************************************** *函数名称:insert *函数功能:在链表中插入元素. *输入:head 链表头指针,p新元素插入位置,x 新元素中的数据域内容 *输出:无 *************************************************************************************/ void insert(Node * head,int p,int x){ Node * tmp = head; for(int i = 0;inext; if(tmp == NULL) return ; } Node * tmp2 = new Node; tmp2->data = x; tmp2->next = tmp->next; tmp->next = tmp2; } /************************************************************************************** *函数名称:del *函数功能:删除链表中的元素 *输入:head 链表头指针,p 被删除元素位置 输出:被删除元素中的数据域.如果删除失败返回-1 **************************************************************************************/ int del(Node * head,int p){ Node * tmp = head; for(int i = 0;inext; if(tmp == NULL) return -1; } int ret = tmp->next->data; tmp->next = tmp->next->next; return ret; } void print(Node *head,Node * root){ for(Node *tmp = head; tmp!=NULL; tmp = tmp->next) printf("%d ",tmp->data); printf("\n"); } int main(){ Node * head; head = new Node; head->data = -1; head->next=NULL; return 0; } [编辑本段]结语 C语言是学习数据结构的很好的学习工具。理解了C中用结构体描述数据结构,那么对于理解其C++描述,Java描述都就轻而易举了! [编辑本段]两种链表形式 一、循环链表 循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。 循环链表的运算与单链表的运算基本一致。所不同的有以下几点: 1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。 2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。 二、双向链表 双向链表其实是单链表的改进。 当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。 在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。

㈥ 求大大们具体描述下C语言中的结构体和链表(最好能用图表描述)

1)简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。
定义结构体使用struct修饰符,例如:
struct test
{
float a;
int b;
};
2)链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向明上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

㈦ 链表哪一种可以随机存取

链表都不可以可以随机存取的,链表都是只能顺序存取的。

㈧ 关于C语言中,链表的文件储存方式

思路1是可行的,但思路2大多情况下是不可行的,因为链表是动态申请内存空间的,并且地址(理论上是随机的)不确定,你用数据块来读写,这不就等于原先随机生产的指针地址都拿过来了?(如果释放了链表的内存,被其它给占用了该内存点,你的程序大多情况下会漰掉的)

思路2的可行情况:
1.原先申请的内存不能释放,并且还在一起(当然程序也不可以关闭),保存文件等于没啥用处
2.在读取文件后,重置一下指向指针的地址!...

㈨ C语言基础知识中:线性表的顺序、链式存储结构分别是:随机存取和顺序存取结构对吗

不对,数组是随机存取,所有的线性表都是顺序存取结构。你想想,我要找第5个元素,用数组直接 A[4] 就找到了,而线性表就要从“头”元素开始一个一个地往后遍历,直到需要的那个,随机不了。

㈩ c语言,什么是链表,一般都是拿链表和数组相比较,数组是一种数据构造类型,那么链表也是吗资料上说链

首先数组和链表都是描述常用的数据结构的数据存储方式!两者在内存中最大的区别是:数组是连续的内存空间;链表对应的数据实体的内存空间可以不连续,而且链表一般用结构体来实现!他们的共同点是都和指针相关,特别是链表,必须有坚实的指针基础才能更好的理解!链表是数据结构中树,图等结构的最常用的表示方法