数据结构(顺序表)

文章目录

一、线性表

1、线性表

1.1、线性表的定义


1.2、线性表的操作





2、顺序表

2.1、顺序表的实现--静态分配

静态的数组分配后固定不变

Sq:sequence--顺序,序列

cpp 复制代码
#include<stdio.h>
#define MaxSize 10

typedef struct{
	int data[MaxSize];
	int length;
}SqList;

void InitList(SqList &L){
	for(int i=0;i<MaxSize;i++){
		L.data[i]=0;
	}
	L.length=0;
}
int main(){
	SqList L;
	InitList(L);
	for(int i=0;i<MaxSize;i++)
		printf("data=%d\n",L.data[i]);
	return 0;
} 

2.2、顺序表的实现--动态分配

cpp 复制代码
#include<stdlib.h>
#define InitSize 10

//结构体 
typedef struct{
	int *data;
	int MaxSize;
	int length;
}SeqList;

//初始化顺序表 
void InitList(SeqList &L){
	L.data=(int *)malloc(InitSize*sizeof(int));
	L.MaxSize=InitSize;
	L.length=0;
}
//增加长度操作
void IncreaseSize(SeqList &L,int len){
	int *p=L.data;
	L.data=(int *)malloc((InitSize+len)*sizeof(int));
	//将以前的数据复制到新区域
	for(int i=0;i<L.length;i++){
		L.data[i]=p[i];
	} 
	L.MaxSize=L.MaxSize+len;
	//销毁无效区域 
	free(p);
}

int main(){
	SeqList L;
	InitList(L);
	IncreaseSize(L,5);
	return 0;
}

2.2、顺序表的特点

3、顺序表的基本操作

3.1、插入操作

cpp 复制代码
#include<stdlib.h>
#include<stdio.h>
#define InitSize 10
#define MaxSize 10
typedef struct{
	int *data;
	int length;
}SqList;

//初始化顺序表
void InitList(SqList &L){
	L.data=(int *)malloc(sizeof(int)*InitSize);
	L.length=0;
} 

//顺序表插入
bool ListInsert(SqList &L,int i,int e){
	//为了代码的健壮性,判断i的范围是否有效
	if(i<1||i>L.length+1)
		return false;
	//判断存储空间是否已满 
	 if(L.length>=MaxSize)
	 	return false; 
	//i及其i之后数据向后移动一位
	for(int j=L.length;j>=i;j--){
		L.data[j]=L.data[j-1];
	} 
	//赋值
	L.data[i-1]=e; 
	//长度+1
	L.length=L.length+1; 
	return true;
} 
int main(){
	SqList L;
	InitList(L);
	//给顺序表赋值
	for(int i=0;i<5;i++){
		L.data[i]=i+1;
		L.length++;
	} 
	ListInsert(L,3,3);
	for(int i=0;i<=5;i++){
		printf("%d\n",L.data[i]);
	} 
	return 0;
}



插入操作的时间复杂度:

3.2、删除操作

cpp 复制代码
#include<stdlib.h>
#include<stdio.h>
#define InitSize 10
#define MaxSize 10
typedef struct{
	int *data;
	int length;
}SqList;

//初始化顺序表
void InitList(SqList &L){
	L.data=(int *)malloc(sizeof(int)*InitSize);
	L.length=0;
} 

//顺序表插入
bool ListInsert(SqList &L,int i,int e){
	//为了代码的健壮性,判断i的范围是否有效
	if(i<1||i>L.length+1)
		return false;
	//判断存储空间是否已满 
	 if(L.length>=MaxSize)
	 	return false; 
	//i及其i之后数据向后移动一位
	for(int j=L.length;j>=i;j--){
		L.data[j]=L.data[j-1];
	} 
	//赋值
	L.data[i-1]=e; 
	//长度+1
	L.length++; 
	return true;
} 
//顺序表删除
bool ListDelete(SqList &L,int i,int &e){
	//判断合法性
	if(i<1||i>L.length+1)
		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;
} 
int main(){
	int e=-1;
	SqList L;
	InitList(L);
	//给顺序表赋值
	for(int i=0;i<5;i++){
		L.data[i]=i+1;
		L.length++;
	} 
	ListInsert(L,3,3);
	ListDelete(L,5,e);
	for(int i=0;i<L.length;i++){
		printf("%d\n",L.data[i]);
	} 
	printf("delete data = %d",e);
	return 0;
}

删除操作的时间复杂度:

3.3、查找操作

3.2、按位查找




按位查找的时间复杂度

3.2、按值查找
cpp 复制代码
#include<stdlib.h>
#include<stdio.h>
#define InitSize 10

typedef struct{
	int *data;
	int MaxSize;
	int length;
}SeqList;

//初始化顺序表
void InitList(SeqList &L){
	L.data=(int *)malloc(sizeof(int)*InitSize);
	L.length=0;
	L.MaxSize=InitSize;
} 
//按值查找
int LocateElem(SeqList L,int e){
	for(int i=0;i<L.length;i++){
		if(L.data[i]==e)
		return i+1;
	}
	return 0;
} 
int main(){
	SeqList L;
	InitList(L);
	//给顺序表赋值
	for(int i=0;i<5;i++){
		L.data[i]=i+1;
		L.length++;
	} 
	int number=LocateElem(L,3);
	printf("%d",number);
	return 0;
}


结构类型比较:

时间复杂度

相关推荐
一分之二~2 小时前
回溯算法--解数独
开发语言·数据结构·c++·算法·leetcode
不如语冰3 小时前
AI大模型入门1.1-python基础-数据结构
数据结构·人工智能·pytorch·python·cnn
未来之窗软件服务3 小时前
计算机等级考试—哈希线性探测解答—东方仙盟
数据结构·哈希算法·散列表·计算机软考·仙盟创梦ide·东方仙盟
苦藤新鸡3 小时前
18.矩阵同行同列全置零
数据结构·c++·算法·力扣
wm10434 小时前
代码随想录 第六天
数据结构·算法
皮蛋sol周4 小时前
嵌入式学习数据结构(三)栈 链式 循环队列
arm开发·数据结构·学习·算法··循环队列·链式队列
Pluchon4 小时前
硅基计划4.0 算法 动态规划入门
java·数据结构·算法·动态规划
txinyu的博客4 小时前
list 三个经典版本
数据结构·list
老了,不知天命5 小时前
離散數學複習
数据结构·物理·筆記·數學
好评1245 小时前
【C++】AVL树:入门到精通全图解
数据结构·c++·avl树