数据结构——线性表的顺序表示

在进行今天的讲解之前 我们先来了解一下线性表的基本概念

知识框架

 线性表的定义和基本操作

定义:

线性表是具有相同数据类型的n个数据元素的有限序列。

除了第一个元素以外,每个元素有且仅有一个直接前驱。

除了最后一个外,       每个元素有且仅有一个直接后续。

特点:

好滴,那我们接下来讲解线性表的顺序表示啦~

线性表的顺序表示

定义 

线性表的顺序存储又称顺序表

其特点是:其中逻辑结构与其物理结构相同。

ps:线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。

假定 线性表元素类型为ElemType ,则线性表的顺序存储类型描述为:

#define Maxsize 50
typedef struct
{
    ElemType data[Maxsize];
    int length;
}SqList;

可以是静态分配,也可以是动态分配。

#define Initsize 50
typedef struct
{
    ElemType data*;                //指针
    int Maxsize,length;            //最大容量和当前个数
}SeqList;

它的初始化:ps:注意要带头文件<stdlib.h>哦~

L.data = (ElemType *)malloc(sizeof(ElemTye)*Initsize);

基本操作的实现

说到线性表,我们肯定会觉得 它的插入和删除绝对是麻烦的(

1) 插入操作

bool ListInsert(SqList &L,int i,ElemType e)
{
	if(i < 1 || i > L.length +1)//有效 
		return false;
	if(L.length >= Maxsize)//空间已满 
		return false;
	for(int j = L.length; j >= i)//后移操作 
		L.data[j] = L.data[j - 1];
	L.data[i - 1] = e;
	L.length++;
	return true; 
}

草草画个图哈哈

2)删除操作  

bool ListDelete(SqList &L,int i,ElemType &e) // e返回被删元素的值 
{
	if(i < 1 || i > L.length )//有效 
		return false;
	e = L.data[i - 1];
	for(int j = i; j < L.length; j++)
		L.data[j - 1] = L.data[j];
	L.length --;
	return true; 
}

我们可以发现,顺序表中插入和删除操作的时间主要花费在 移动元素

3)按值查找

int LocateElem(SqList L,ElemType e)
{
	int i;
	for(i = 0;i < L.length; i++)
	{
		if(L.data[i] == e)
			return i+1;
	}
	return 0;
 } 

错题总结

线性表的顺序存储结构是一种 随机存取的存储结构。

合并仍有序:

bool Merge(SqList A,SqList B,SqList &C)
{
	if(A.length + B.length > Maxszie)
		return false;
	int i = 0,j = 0,k = 0;
	while(i < A.length && j < B.length)
	{
		if(A.data[i] <= B.data[j])
			C.data[k++] = A.data[i++];
		else
			C.data[k++] = B.data[j++];
	}
	while(i < A.length)
		C.data[k++] = A.data[i++];
	while(j < B.length)
		C.data[k++] = B.data[j++];
	C.length = k;
	return true;
}

转置:

void reverse(int R[],int from, int to)
{
	int i, temp;
	for(i = 0; i < (to + from)/2; i++)
	{
		temp = R[from + i];
		R[from + i] = R[to - i];
		R[to - i] =temp;
	}
}

好了结束咯

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值