数据结构之线性表

一:什么是线性表

  线性表顾名思义是具有像线一样的性质的表。即线性表是零个或多个数据元素的有限序列。
  线性表的数学定义如下:若将线性表记(a1,a2,a3.…,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当ai不是最后一个元素时,ai有且仅有一个直接后继,当ai不是第一个元素时,ai有且仅有一个直接前驱。
  当线性表元素为零时,称为空表。

二.线性表的顺序存储结构

  • 顺序线性表的地址计算方法:

   LOC(ai+1)=LOC(ai)+c,其中c为该数据类型所占用的存储单元

  • 线性表的插入操作
 void Listinsert(Sqlist *L,int i,Elemtype e)
{
	int k;
	if(L->length==maxsize) //顺序线性表已满
	{
		printf("error!");
		return;
	}
	if(i<1||i>L->length+1)//i不在范围内 
	{
		printf("error!");
		return;			
	}
	if(i<=L->length)//若插入元素不在末尾
	{
		for(k=L->length-1;k>=i-1;k--)//将要插入位置后的元素集体向后移动一位
			L->data[k+1]=L->data[k]; 
	}
	L->data[i-1]=e;
	L->length++;
	return;		 
}
  • 线性表的删除操作
 void ListDelete(Sqlist *L,int i,Elemtype e)
{
	int k;
	if(L->length==0) //线性表为空 
	{
		printf("error!");
		return;
	}
	if(i<1||i>L->length+1)//i不在范围内 
	{
		printf("error!");
		return;			
	}
	*e=L->data[i-1];
	if(i<L->length)//若删除元素不是最后一个元素 
	{
		for(k=i;k<L->length;k++)//将删除元素的后继元素前移 
			L->data[k-1]=L->data[k]; 
	}
	L->length--;
	return;		 
}
  • 线性表的顺序存储结构的优点与缺点:
  • 优点
       可以快速地存取表中任一位置的元素
  • 缺点
      插入与删除操作需要移动大量元素
      存储空间确定,当长度变化过大时可能导致存储空间不够

三:线性表的链式存储结构

  • 线性表链式存储结构的定义
      对任意数据元素ai,其除了存储本身的信息外,还需要存储其直接后继元素的位置(即地址)。我们把存储数据元素信息的域称为数据域,把存储直接后继元素位置的域称为指针域。这两部分信息组成的数据元素ai的存储映像,称为结点(Node)。n个结点链结成一个链表,即为性线表的链式存储结构。

  • 单链表
      若链表中的每个结点中只包含一个指针域,则称为单链表。
    其基本结构为:

typedef struct Node
{
	ElemType data;//数据域 
	strcut Node;//指针域 
}Node;
typedef struct Node *LinkList;//定义一个链表 

     假设p是指向第i个元素的指针,则该结点ai的数据域可以用p->data来表示,ai+1的数据域可以用p->next->data表示(如图所示)
如图所示

  • 单链表的基本操作
       可以参考我的上一篇博客,这里就不细讲了
                         单链表操作操作汇总
  • 单链表结构与顺序存储结构优缺点

1.时间性能

  • 查找:
  •    顺序存储结构O(1)
  •    单链表O(n)
  • 插入与删除:
  •    顺序存储结构O(n)
  •    单链表O(1)
      

2.空间性能

  • 顺序存储结构需要预分配存储空间,分大了浪费空间分小了容易发生上溢。

  • 单链表不需要分配存储空间,只要电脑有剩余空间就能用,元素个数也不受限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值