C中线性表和链表的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中线性表和链表的区别相关的知识,希望对你有一定的参考价值。
参考技术A 最近经常听到朋友面试有被问到链表的问题,自己也总结了一下,应该算是比较入门向的介绍吧线性表(数组)
数据与元素一一对应 除了第一个和最后一个其他数据元素首位相接
顺序表
线性表中用地址连续的存储单元来存放数据元素的数据结构,结点放在地址连续的存储单元中(实现方式为数组)——
链表
①物理存储单元上非连续,非顺序的存储结构(内存之中不连续)
②数据元素之间的逻辑顺序是通过链表中的指针链接次序实现
③链表由一系列结点组成(链表中的元素称为结点),结点可以在运行时动态生成
④结点包括两个部分:1.存储数据元素的数据域
2.存储下一个结点地址的指针域
(实现方式为指针)
ps1:尾结点 指针域为null,若尾结点指针指向首结点,那么构成环形链表
相对于 线性表 的优势
①链表比较方便插入和删除操作,线性表中插入一个元素,那么后面的元素地址都要往后移,删除同理。而链表只需要修改结点中的指针信息,不需要修改结点地址。
②线性表在建立时就确定的总长度 因此初始长度过大或者过小都会引起内存问题:如果内存中没办法一次性给出整个线性表所需的存储空间那么就会提示内存不足,链表可以用分散的存储空间
③链表的扩展性比线性表(数组)好,一个线性表在建立后空间大小是固定的,要扩展只能新建一个更大的,而链表可以很方便的扩展
线性表相对于链表的优势
①线性表存储空间小,因为链表要在存储单元里放一个或者两个指针(双向链表)
②线性表内容可以随机访问,因为是连续的内存单元,地址连续所以在这个区间内可以进行随机,链表存储地址
③查找速度由于存储地址原因也快于链表
双向链表
一句话 结点中有两个指针 一个指针指向直接前驱,一个指针指向直接后继
优势:查找更方便,用于大量数据的遍历
相对于单向 存储空间也更大
线性表和顺序表的区别
如题
线性表仅仅是逻辑上的定义而已,即具有相同特性数据元素的有限序列,(比如一个字符数组或者一个整型数组 再或者链表 )并不是说,线性表就一定是链表或者顺序表(链表和顺序表都满足线性表的定义,只是实现方式不一样,顺序表采用顺序存储方式,内存中开辟的地址是连续的,而链表采用链式存储的方式,地址是可以不连续的)两者存储方式各有优缺点,看情况而定。
下面是数据结构中对于线性表的一段定义与操作
代码来源线性表--顺序表的定义与操作示例
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */
typedef struct
ElemType data[MAXSIZE]; /* 数组,存储数据元素,最大值为MAXSIZE */
int length; /* 线性表当前长度 */
SqList;
//顺序表的初始化
SqList Init()
//构造一个空的线性表L,时间复杂度O(1)
SqList L; //定义一个顺序表
L.length = 0; //顺序表的长度为0
return L; //返回空顺序表
//顺序表的建立
SqList Create(SqList L)
int i;
srand((unsigned)time(NULL));
for(i=0; i < 10; i++)
L.data[i] = rand()%100;
L.length++;
return L;
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
ElemType GetElem(SqList L,int i)
//
if(i < 1 || i > L.length)
printf("查找位置错误!\\n");//检查查询位置是否合法
return 0;
else
return L.data[i-1];
//顺序表的插入
SqList SqListInsert(SqList L, int i, ElemType x)
//在顺序表中的第i个位置插入元素x
if(L.length == MAXSIZE)
printf("表已经满了\\n");//插入时,必须检查表是否已经满了。否则会出现溢出错误
else if(i < 1 || i > L.length)
printf("插入位置错误\\n");//判断插入位置的有效性
int j;
for(j = L.length-1; j >= i - 1; j--)//第i个位置元素逐个后移
L.data[j+1] = L.data[j];
L.data[i-1] = x; //插入元素x
L.length++; //顺序表长度增1
return L;
SqList SqListDelete(SqList L,int i)
//删除顺序表中的第i个位置的元素
if(i < 1 || i > L.length)
printf("删除位置错误\\n"); //检查删除位置是否合法
int j;
for(j = i-1; j < L.length; j++)
L.data[j] = L.data[j+1]; //将第i个位置之后的元素前移
L.length--; //顺序表长度-1
return L;
int main()
SqList nmList;
nmList = Init();
nmList = Create(nmList);
int find;
int found;
int pos;
ElemType value;
char opp;
int i;
printf("顺序表初始化为:");
for(i=0; i < nmList.length; i++)
printf("%d ", nmList.data[i]);
printf("\\n1.查看顺序表 \\n2.查找 \\n3.插入 \\n4.删除 \\n0.退出 \\n请选择你的操作:\\n");
while(opp != '0')
scanf("%c",&opp);
//printf("\\n 1.查找 \\n 2.插入 \\n 3.排序 \\n 0.退出 \\n 请选择你的操作:\\n");
switch(opp)
case '1':
printf("\\n查看顺序表:");
for(i=0; i < nmList.length; i++)
printf("%d ", nmList.data[i]);
printf("\\n");
break;
case '2':
printf("\\n进入查找功能,请问需要查找第几个元素:");
scanf("%d",&find);
printf("%d",find);
found = GetElem(nmList, find);
printf("第%d个值为%d ", find, found);
printf("\\n");
break;
case '3':
printf("进入插入功能,请输入插入元素位置:");
scanf("%d",&pos);
printf("请输入插入元素的值:");
scanf("%d",&value);
nmList = SqListInsert(nmList,pos,value);
printf("\\n插入元素后顺序表为:");
for(i=0; i < nmList.length; i++)
printf("%d ", nmList.data[i]);
printf("\\n");
break;
case '4':
printf("进入删除功能,请输入删除元素位置:");
scanf("%d",&pos);
nmList = SqListDelete(nmList,pos);
printf("\\n删除元素后顺序表为:");
for(i=0; i < nmList.length; i++)
printf("%d ", nmList.data[i]);
printf("\\n");
break;
case '0':
exit(0);
参考技术A 线性表是链式存储结构,用链表实现,使用空间多,且合理。而顺序表基本上是用数组实现的,使用空间有限,会造成浪费。 参考技术B 顺序表 静态分配。程序执行之前必须明确规定存储规模。
随机存取结构,主要是进行查找,很少做插入和删除操作时顺序表。
线性表 动态分配。只要内存空间尚有空闲,就不会产生溢出。
从头指针起顺着扫描才能取得。
以上是关于C中线性表和链表的区别的主要内容,如果未能解决你的问题,请参考以下文章