数据结构复习笔记1:线性表,顺序表

1.线性结构的定义

如果⼀个数据元素序列满⾜:

1. 除第⼀个和最后⼀个数据元素外,每个数据元素只有⼀个前驱数据元素和⼀个后继数据元素;

2. 第⼀个数据元素没有前驱数据元素;  

3. 最后⼀个数据元素没有后继数据元素;

我们称这样的结构就叫做 线性结构

线性结构包括:

线性表、链表、栈、队列......   其中,最典型、最常用的是线性表。

线性表抽象数据类型主要包括两个⽅⾯:既数据集合和该数据集合上的操作集合。

⑴线性表的基本操作根据实际应用而定;

⑵复杂的操作可以通过基本操作的组合来实现;

⑶对不同的应用,操作的接口可能不同。

2.顺序表

        在计算机内存中,顺序表是以数组的形式保存的线性表。也就是⼀组地址连续的存储单元依次存储 数据元素的线性结构。 在数组中,我们会先申请⼀段连续的内存空间,然后把数组以此存⼊内存当中,中间没有⼀点空隙。这就是⼀种顺序表存储数据的⽅式。对于顺序表的基本操作有:增(add),删(remove),改 (set),查(find),插(insert)。

1.静态顺序表的结点结构

使用定长数组存储元素    缺陷:给小了不够用,给大了可能浪费,本文代码不以它为例

#define N 10
typedef struct Array{
	int date[N];//指针模拟开数组 
	int length;//理论最大容量
	int size;//实际容量 
}MyArray; 
2.动态顺序表的结点结构
//实现一个存放int类型数据的顺序表 
typedef struct ArrayList{
	int *date;//指针模拟开数组 
	int length;//理论最大容量
	int size;//实际容量 
}MyArray; 
3.初始化顺序表
//初始化顺序表,将顺序表的 理论最大容量定为n 
MyArray initAarry(int n)
{
	MyArray ar;
	ar.date=(int *)malloc(sizeof(int)*n);
	if(ar.date==NULL)
	{
		printf("空间分配失败\n"); 
	 } 
	 ar.length=n;
	 ar.size=0;	
	 return ar;
	
 } 
4.顺序表插入操作(尾插)
//在顺序表a中增加一个元素k 
void add(MyArray *a,int k)
{
	if(a->size<a->length)
	{
		a->date[a->size]=k;
		a->size++;
	 } 
	 else{
	 	printf("空间已满,不能插入\n"); 
	 }
 } 

如果头插的话,用循环依次将元素往后挪就行了

5.顺序表指定位置插入
 //在顺序表a的i下标位置,插入一个元素k 
void insert(MyArray *a,int i,int k)
{
	if(a->size<a->length)
	{
		//移动位置
		for(int j=a->size-1;j>=i;j--)
		{
			a->date[j+1]=a->date[j];
		 } 
		 a->date[i]=k;
		 a->size++; 
		
	 } 
	 else{
	 	printf("空间已满,不能插入\n"); 
	 }
}
6.顺序表中查找元素
int find(MyArray *a,int k)
{
	for(int i=0;i<a->size;i++)
	{
		if(a->date[i]==k)
		{
			return i;
		}
	}
	
	return -1; //未找到
 } 
7.顺序表删除操作
 //在顺序表a中删除元素k 
void del(MyArray *a,int k)
{
	int i=find(a,k);//i是被删除数据k的下标 
	if(i==-1)
	{
		printf("被删除的数据不存在\n"); 
	}
	else
	{
		for(int j=i+1;j<a->size;j++)
		{
			a->date[j-1]=a->date[j];
		}
		a->size--;
	} 
	
}
8.更改顺序表中元素
void change(MyArray *a,int k,int x)
{
	int i = find(a,k);
    if(i!=-1)
    {
        a->date[i]=x;
    }

 } 

3.总结

1.优势

因为数据在数组中按顺序存储,可以通过数组下标直接访问,因此顺序表的查找定位元素很快。

2.劣势

插⼊和删除元素都需要⼤量的操作。 因为数组在声明的时候需要确定⻓度,因此顺序表的⻓度是确定的。若需要扩⼤顺序表⻓度,有需要大量的操作,不够灵活。(要将该数组中的元素全部copy到另外⼀个数组)由于数据⼤⼩的不可测性,有时会浪费掉⼤量的空间。

3.应⽤场景

总之,顺序表适⽤于那些不需要对于数据进⾏⼤量改动的结构。

4.顺序表的效率分析

顺序表对于插⼊、删除⼀个元素的时间复杂度是O(n)。 因为顺序表⽀持随机访问,顺序表读取⼀个元素的时间复杂度为O(1)。因为我们是通过下标访问的,所以时间复杂度是固定的,和问题的规模⽆关。 最大的优点是空间利⽤率⾼。最⼤的缺点是大小固定。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值