数据结构 线性表之顺序存储

1.线性表的定义:零个或多个相同类型的数据元素的有限序列。若元素为多个,则第一个元素无前驱,最后一个元素无后继,其他的每个元素都有且只有一个前驱和后继。线性表中的每个数据元素可以由若干个数据项组成,这时,数据元素称为记录record,线性表称为文件file。

2.线性表的抽象数据类型:

    线性表是一种数据结构,其元素之间存在一一对应的逻辑关系{D,S}。D表示数据元素,S表示数据元素之间的关系。

   线性表的抽象数据类型{D,S,P},其中{D,S}表示数据结构,P表示数据结构上的一组操作。

ADT List
Data
   /*一组带结构的数据元素*/
Operation
  INITIATE(L)
  LENGTH(L)
  GET(L,i)
  LOCATE(L,x)
  INSERT(L,i,b)

3.线性表的物理结构

3.1顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素。C语言中用数组为例。

(1)描述线性表需要三个属性:存储空间的起始位置,线性表的最大存储容量(数组长度,即总的存储空间的长度),线性表的当前长度(线性表中数据元素的个数)。

(2)随机存取结构:LOC(ai)=LOC(a1)+(i-1)c;存取操作的时间复杂度为O(1)。

(3)插入:检验当前的list的长度是否超过定义的数组最大长度,检验插入的位置是否合理(插入第i个之前,因此i可以取length+1),移位(若插入的不在表尾),插入,表长加1。

(4)删除:检验list是否为空表,检验删除的位置是否合理,赋值,(若删除的不在表尾)移位,表长-1。

(5)时间复杂度:存取操作O(1),插入删除O(n)。插入平均移动次数为n/2,删除平均移动次数为(n-1)/2。

(6)顺序存储优点:无需表示元素之间的逻辑关系而额外增加存储空间。可以快速存取

     顺序存储缺点:删除插入操作需要大量移动元素。当线性表长度变化较大时,难以确定存储空间的容量。造成存储空间的碎片。

     适用:元素个数不太变化,更多是存取数据的应用。

#include <iostream>
using namespace std;

#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int ElemType;
typedef int Status;
typedef struct
{
	ElemType data[MAXSIZE];
	int length;
}SqList;

Status GetElem(SqList L, int i,ElemType *e)
{
	if(L.length == 0|| i<1 || i>L.length)
		return ERROR;
	*e = L.data[i-1];
	return OK;
}

Status PrintList(SqList *L)
{
	for(int i=1; i!=L->length;i++)
		cout<<L->data[i-1]<<" ";
	cout<<L->data[L->length-1]<<endl;
	return OK;
}

Status ListInsert(SqList *L, int i, ElemType e)  //在第i个位置之前插入新的数据元素e,L的长度加1
{
	if( L->length == MAXSIZE) return ERROR;
	if( i<1 || i>L->length+1 ) return ERROR;
	if( i<=L->length )
	{
		for(int k=L->length;k>=i;k--)
			L->data[k]=L->data[k-1];
	}
	L->data[i-1]=e;
	L->length++;
	return OK;
}

Status ListDelet(SqList *L, int i, ElemType *e)//删除第L个元素,并返回它的值
{
	if(L->length==0) return ERROR;
	if(i<1 || i>L->length) return ERROR;
	*e = L->data[i-1];
	if(i<L->length)
	{
		for(int k=i+1;k!=L->length+1;k++)
			L->data[k-2] = L->data[k-1];
	}
	L->length--;
	return OK;
}
int main()
{
	SqList List1;
	ElemType find_num;
	ElemType is_num=18;
	ElemType dl_num;
	List1.length = 0;

	cout<<"The original list: ";
	for(int i=1; i!=10; ++i)
	{
		List1.data[i-1]=i;
		List1.length ++;
		cout<<List1.data[i-1]<<" ";
	}
	cout<<endl;

	cout<<"The find number: ";
	if(GetElem(List1,5,&find_num))
		cout<<find_num<<endl;

	cout<<"The list after insert: ";
	ListInsert(&List1,6,is_num);
	PrintList(&List1);

	cout<<"The list after deleat: ";
	ListDelet(&List1,3,&dl_num);
	PrintList(&List1);

    system("pause");
	return 0;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值