考研笔记-数据结构-线性表-顺序表

线性表-顺序表

线性表定义
线性表是用一组地址连续的存储单元来依次存储线性表的数据元素,从而使得逻辑上相邻的两个元素在 物理位置上也相邻。

线性表的特点
1存储密度高----他的空间全部 用来存放数据
2随机访问----它可以直接访问到某个元素,查找某个元素的时间复杂度为O(1)
3逻辑相邻的两个元素在物理结构上也相邻—那么插入和删除某个元素时就要移动这个元素后面所有的元素

线性表的操作
创建一个线性表(有两种方法静态分配和动态分配)
静态分配

#define  MAX_SIZE 50
typedef struct{
	Elemtype data[MAX_SIZE];
	int length;
}Seqlist;

动态分配

#define  InitSize 50
typedef struct{
	Elemtype *data;
	int length;
	int MAX_SIZE;
}Seqlist;
Seqlist L;
L.date = (Elemtype*)malloc(sizeof(Elemtype)*IntiSize);

静态分配和动态分配的区别是,静态分配空间有限,当数据存满时,再存数据会出错;而使用动态分配,当 存储 空间占满时,会另外开辟出一块更大的空间来代替原来的空间。

插入元素
在第i个位置插入元素,意味着下标为i-1~L.length-1的数据都要后移

bool ListInsert(Seqlist &L,int i,Elemtype e)
{
	if(i>L.length+1||i<1){
		return false;
	}
	if(L.length>=MAXSIZE){
		return false;
	}
	for(int j = L.length;j >= i;j -- ){
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;
	L.length ++;
	return true;
}

删除元素
删除第i个元素,意味着下标为i~L.length-1的元素都要前移

bool ListDelete(Seqlist L,int i,Elemtype &e)
{
	if(i<1||i>L.length){
		return false;
	}
	e = L.data[i-1];
	for(int j = i-1;j <= L.length-1;j ++ ){
		L.data[j] = L.data[j+1];
	}
	L.length--;
	return true;
}

《王道》p22 T6.从有序表中删除其所有重复的元素

bool del(Sqlist &L)
{
	if(L.length==0)
		return false;
	int i;//i表示删完之后的线性表索引
	int j;//j表示当前线性表的索引
	for(i = 0,j = 1;j < L.length;j++){
		if(L.data[i] != L.data[j]){
			L.data[++i] = L.data[j];
		}
	}
	L.length = i + 1;
	return true;
}

《王道》p23 T7.将两个有序表和为一个新的有序表,并由函数返回新的有序表


bool merge(Sqlist &L1,Sqlist &L2,Sqlist &L3)
{
	if(L1.length+L2.length>maxSize)
		return false;
	int i=0,j=0,k=0;
	while(i<L1.length&&j<L2.length){
		if(L1.data[i]<=L2.data[j]){
			L3.data[k++] = L1.data[i++];
		}
		else{
			L3.data[k++] = L2.data[j++];
		}
	}
	while(i<L1.length){
		L3.data[k++] = L1.data[i++];
	}
	while(j<L2.length){
		L3.data[k++] = L2.data[j++];
	}
	L3.length = k;
	return true;
}

一个数组中存了两个线性表,按顺序存的,将数组中两个线性表位置互换,其中线性表中元素的相对位置不变
Data[m+n]
前m个存了Sqlist a
后n个存了Sqlist b

void Reverse(ElemType Data[],int left,int right,int size)
{
	if(left>=right&&right>-size)
		return;
	int i = (left+right)/2;
	while(left<=i){
			ElemType temp = Data[left];
			Data[left++] = Data[right];
			Data[right--] = temp;
	}
}
void Exchange(ElemType Data[],int m,int n,int size)
{
	Reverse(Data,0,m+n-1,size);
	Reverse(Data,0,n-1,size);
	Reverse(Data,n,m+n-1,size);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stig_Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值