数据结构第二章学习

顺序表#

用顺序结构的方式实现线性表的顺序存储。把逻辑上相邻的元素存储在物理地址位置上也相邻的存储单元中。
顺序表的实现,静态分配

#include<iostream>
#define Maxsize 10//定义最大长度
using namespace std;
typedef struct {
	int data[Maxsize];//用静态“数组”存放数据元素
	int lengh;//顺序表长度定义
}SqList;//顺序表类型定义
//初始化一个顺序表
void InitList(SqList&L) {
	for (int i = 0; i < Maxsize; i++)
		L.data[i] = 0;//所有元素设置为初始值
	L.lengh = 0;//长度初始化为0
}
int main()
{
	SqList L;
	InitList(L);
	for (int j = 0; j< Maxsize; j++)
	{
		cout<< L.data[j]<< endl;
	}
	system("pause");
	return 0;
}

正规情况,上述输出一般不会被实行,因为我们定义了lengh,违规访问大于lengh的元素是不合理的。一般情况应该用基本操作来实现。
顺序表的实现,动态分配
在这里插入图片描述动态案例

#include<iostream>
#include<stdlib.h>
//动态存储
#define Initsize 10;
typedef struct {
	int Maxsize=Initsize;
	int *data;
	int length;
}SqList;
void InitList(SqList &L);
void Increasesize(SqList &L, int len);
int main() {
	SqList L;
	InitList(L);
	Increasesize(L,5);
	system("pause");
	return 0;
}
void InitList(SqList &L) {
	L.data = (int*)malloc(L.Maxsize * sizeof(int));
	//L.data =  new int[L.Maxsize];
	L.length = 0;
	L.Maxsize = Initsize;
}
void Increasesize(SqList &L,int len) {
	int *p = L.data;
	L.data = (int*)malloc((L.Maxsize + len) * sizeof(int));
	for (int i = 0; i < L.length; i++) {
		L.data[i] = p[i];
	}
	L.Maxsize = L.Maxsize + len;
	free(p);
	//delete();
}

顺序表的特点
1.随机访问,即可以在O(1)时间内找到第i个元素。
2.存储密度高,每个节点只存储数据元素。
3.拓展容量不方便。

顺序表的插入和删除##

顺序表的插入,先将要插入的位置以及之后的数据向后移动,然后在此处插入元素,基本代码如下:

void ListInsert(SqList &L,int i,int e){
for(int j=L.length;j<i;j--)
{L.data[j]=L.data[j-1];//向顺序表插入,因为使用数组,所以实际插入时要i-1
L.data[i-1]=e;
L.length++;
}
}

上述代码的健壮性不高,因为没有对i进行判断,使1<i<L.length+1,并且应判断L.length是否大于最大长度,可留作练习后面自行判断。
顺序表的删除
在这里插入图片描述时间复杂度:
最好情况:删除表尾,不需要移动其他元素,i=n,循环0次,最好时间复杂度为O(1);
最坏情况:删除表头,循环n次,时间复杂度为O(n);
平均时间复杂度:删除任意一个地方的元素概率相同,p=1/n;平均循环次数=(n-1)p+(n-2)p+…1p=n(n-1)/2n=(n-)/2
时间复杂度为O(n);

顺序表查找##

在这里插入图片描述在这里插入图片描述

顺序表的查找过程中,条件语句用于判断所查找的值是否在顺序表中,可以直接用“= =”来进行条件判断,一般考研中如果没有明确说明大纲的使用语言,这种类似伪代码的代码形式是可以的,但是其不够严谨,因为“==”不能判断类似结构体这种的数据类型,如果要求语言类别,应该尽量使用相应的语言去完善代码,从而保证代码的健壮性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值